객체 지향 프로그래밍
프로그램의 모든 것을 객체(Object)로 취급하는 프로그래밍 패러다임.
구성요소
클래스(Class)
공통되는 속성과 기능을 정의한 것. 사용자 정의 데이터 형.
객체(Object)
클래스의 인스턴스(메모리에 할당된). 고유의 속성을 가지며 클래스에서 정의한 기능을 수행할 수 있다.
메서드(Method)
클래스에서 정의한 기능.
메시지(Message)
객체에 명령을 내리는 메세지.
OOP 특징(요소)
추상화(Abstraction)
객체의 공통되는 부분을 묶어내는 것. 클래스를 정의하는 과정.
ex) 사과, 배, 바나나는 과일 이라는 클래스로 추상화할 수 있다.
캡슐화(Encapsulation)
속성과 기능을 한데 묶고 접근을 제어하는 것. 정보은닉의 장점이 있다.
상속(Inheritance)
기반 클래스의 속성/기능을 파생 클래스가 물려받는 것. 재사용을 통해 코드의 중복을 제거하는 장점이 있다. C++ 에서는 다중 상속도 가능하지만 다이아몬드 상속 문제 등을 조심해야 한다.
다형성(Polymorphism)
같은 형태지만 다른 일을 하는 기능을 하는 것.
ex) 동물 클래스의 울음소리 함수(virtual)를 고양이/강아지 파생 클래스에서 오버라이딩(override) 함으로써 울음소리 함수를 호출했음에도 ‘멍멍’, ‘냐옹’ 과 같이 다른 일을 하게 되는 것.
동적 바인딩(Dynamic Binding)
런타임 시간에 바인딩 함으로써 다형성을 실현한다.
OOP 원칙(SOLID)
- Single Responsibiliity Principle (단일 책임 원칙) : 하나의 클래스는 하나의 목적을 위해 생성되어야 한다. 요구 사항을 수정하기 위해 오직 하나의 클래스만 변경하면 된다. 가독성 및 유지보수에서 유리하다.
- Open Close Principle (개방 폐쇄 원칙) : 프로그램의 구성요소(컴포넌트, 클래스, 함수)는 확장에는 개방적이고 변경에는 폐쇄적이기 위해, 요구 사항을 수정하기 위해 기존 구성요소의 변경없이 확장하여 재사용할 수 있어야 한다. 추상화와 다형성을 통해 이 원칙을 지킨다.
- Liskov Substitution Principle (리스코브 치환 원칙) : 부모 클래스가 들어갈 자리에 자식 클래스가 들어가도 잘 작동해야 한다.
- Interface Segregation Principle (인터페이스 분리 원칙) : 사용하지 않는 인터페이스에 의존하지 않도록 해야한다.
- Dependency Inversion Principle (의존성 역전 원칙) : 상위 레벨 모듈이 하위 레벨 모듈에 의존하지 않도록 해야한다.
장점
소프트웨어 공학 관점에서 강한 응집력(Strong Cohesion)과 약한 결합력(Weak Coupling)을 가지게 된다. 가독성과 재사용성이 좋아진다.