OOP(Object Oriented Programming, 객체 지향 프로그래밍)
23.12.06 수정
OOP란?
컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜서 상태(속성, Attribute)와 행위(Method)를 가진 객체로 만들고, 그 객체 간의 상호작용을 통해 로직을 구성하는 방법.
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것.
장점
- 코드의 재사용에 용이(다른 클래스를 가져와 사용할 수 있고, 상속받을 수 있기 때문), 대형 프로젝트에 용이
- 유지보수 용이(객체 단위로 코드가 나눠져 작성되기 때문)
- 강한 응집력(Strong Cohesion), 약한 결합력(Weak Coupling)
단점
- 상대적으로 처리 속도 느림
- 설계 시 많은 시간과 노력 필요
- 객체가 많으면 용량이 커짐
- 변수 존재 -> 객체가 예측할 수 없는 상태를 갖게 됨 -> 애플리케이션 내부에서 버그 발생 => 함수형 패러다임 등장 배경
기본 구성 요소
- 클래스(Class)
같은 종류의 집단에 속하는 속성과 행위(메서드)를 정의한 것.
- 객체(Object)
클래스의 인스턴스(실제로 메모리상에 할당된 것)
- 메서드(Method), 메시지(Message)
클래스로부터 생성된 객체를 사용하는 방법, 객체에 명령을 내리는 메시지(연산)
Class(클래스), Object(객체), Instance(인스턴스)
클래스
객체를 만들어내기 위한 틀
연관되어 있는 변수와 메서드의 집합
객체
소프트웨어 세계에 구현할 대상
OOP의 관점에서 클래스 타입으로 선언되었을 때 '객체'라 부름
인스턴스
소프트웨어 세계에 구현된 구체적인 실체
객체를 실체화하여 메모리에 할당된 것
OOP의 관점에서 객체가 메모리에 할당되어 실제로 사용될 때 '인스턴스'라 부름
ex) 실행 프로세스는 프로그램의 인스턴스이다.
/* 클래스 */
public class Animal {
...
}
/* 객체와 인스턴스 */
public class Main {
public static void main(String[] args) {
Animal cat, dog; // '객체'
// 인스턴스화
cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
출처 : https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html
OOP의 4가지 특징
1. 추상화
객체의 관련 속성만 표시하고 불필요한 정보는 숨겨서 인터페이스와 구현을 분리하는 것.
추상 자료형 = 클래스
2. 캡슐화
연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 은닉하는 것.
3. 상속
기존 클래스를 재사용하는 것으로 상위 클래스를 하위 클래스에서 물려받게 되면 상위 클래스의 멤버 변수나 메서드를 그대로 물려받아 사용할 수 있는 되는 것.
다중 상속이란?
둘 이상의 클래스를 동시에 상속받는 것.(여러 부모 클래스를 갖는 것)
여러 기능을 가진 클래스를 쉽게 작성할 수 있지만, 이러한 점 때문에 오히려 상속 구조에 문제가 생겨 프로그래밍을 복잡하게 만들 수 있기에 실용성이 떨어진다.
Java는 다중 상속을 지원하지 않음. C++은 지원.
http://wiki.hash.kr/index.php/%EB%8B%A4%EC%A4%91%EC%83%81%EC%86%8D
다중상속 - 해시넷
다중상속(multiple inheritance)은 객체 지향 프로그래밍에서 한 클래스가 한 번에 두 개 이상의 클래스를 상속받는 경우를 말한다. 다중상속을 받은 클래스의 경우 두 개 이상의 부모 클래스를 가지
wiki.hash.kr
4. 다형성
부모-자식 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리.
다양화를 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알 수 없어도 오버라이딩을 통해서 자식 클래스에 접근할 수 있다.
오버라이딩 : 같은 이름의 메서드가 여러 클래스에서 다른 기능을 하는 것.
오버로딩 : 같은 이름의 메서드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것.
오버로딩은 매개변수나 타입이 달라야하지만 오버라이딩은 동일해야하고, 오버로딩은 리턴 타입이 무엇이든지 상관없지만 오버라이딩은 동일해야한다는 차이점이 있다.
동적 바인딩
실행 시간 중에 일어나거나, 실행과정에서 변경될 수 있는 바인딩(!= 정적바인딩)
객체 지향 언어
C++, C#, Java, Python, Perl, Ruby
OOP의 5가지 설계 원칙(SOLID)
1. SRP(Single Responsibility Principle, 단일 책임 원칙)
클래스는 단 하나의 책임(목적)을 가지고, 그에 대한 책임을 져야 한다.
2. OCP(Open Close Principle, 개방-폐쇄 원칙)
확장에는 열려있고, 변경에는 닫혀있어야 한다.
즉, 클래스를 수정해야 한다면 그 클래스를 상속(확장)하여 수정한다.
3. LSP(Liskov Substitution Principle, 리스코프 치환 원칙)
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
즉, 자식 클래스를 사용중일 때, 거기에 부모 클래스로 치환하여도 문제가 없어야 한다.
4. ISP(Interface Segregation Principle, 인터페이스 분리 원칙)
각 행위에 대한 인터페이스는 서로 분리되어야 한다.
ex) 핸드폰으로 전화를 하는데 핸드폰 카메라가 방해되면 안 된다.
5. DIP(Dependency Inversion Principle, 의존 역전 원칙)
상위 클래스가 하위 클래스에 의존하면 안 된다.
즉, 기본적인 공통되는 속성을 하위 클래스에 의존하면 안 된다.
절차 지향 프로그래밍과 객체 지향 프로그래밍
ChatGPT says..
절차지향 프로그래밍은 데이터와 함수를 분리하여 작성하는 반면, 객체지향프로그래밍은 데이터와 해당 데이터를 처리하는 함수를 하나의 단위로 묶은 객체를 중심으로 작성됩니다. OOP는 코드의 재사용성과 유지보수성을 높이는 데 중점을 두며, 대규모 프로젝트에 적합한 구조를 제공합니다.