[개발 상식] 객체 지향 프로그래밍(OOP)
2018. 8. 21. 20:55ㆍCS/개발 상식
반응형
해당 시리즈는 Interview_Question_for_Beginner를 기반으로 추가 학습을 진행해 작성하였습니다.
객체 지향 프로그래밍(OOP)이란?
실제 세계를 모델링하여 ‘객체’들의 상호작용으로 서술하는 프로그래밍 기법
- 인간 중심적 프로그래밍 패러다임
- 프로그램을 ‘객체’ 단위로 나누어 이들이 연결되도록 함.
- 객체는 오퍼레이션으로 정의된다.
- 객체의 핵심은 기능 제공이다.
- 오퍼레이션 : 객체의 기능
- 절차지향이란?
- 순차적인 처리에 따라 프로그램 전체가 유기적으로 연결되도록 만든 프로그래밍 기법
- 프로시저(루틴, 서브루틴, 함수, 메소드) 등을 이용한 프로그래밍
- 컴퓨터 작업 방식과 유사해 객체 지향보다 빠르다.
- ex) C언어
4가지 특징
- 추상화(Abstraction)
: 공통의 속성이나 기능을 묶어 이름을 붙이는 것
- 현실 세계의 사물 = 객체로 보고 필요한 공통 특징만 다루어 현실의 복잡성을 극복, 목적에 집중할 수 있게 함
- ex) {떡볶이, 라면, 김밥} => ‘음식’으로 추상화
- 캡슐화(Encapsulation)
: 객체 수행 목적에 따라 데이터 구조 및 처리 방법(변수와 함수)을 결합시켜 묶는 것
이로써, 외부에 내부 기능 구현 내용을 감추고 이용 방법만 알려줌
- 객체 기능에 대한 책임을 짐
내부 기능 구현이 변경되어도 기능을 사용하는 코드에 영향을 주지 않게 함 - 은닉화
- 외부로부터 객체 내부에 대한 접근을 제한하기 위해 은닉 혹은 격리 시키는 것
- 캡슐화의 한 개념으로 더 구체적이다.
- 변수 접근지정자를
private
로 지정하고setter
,getter
로 접근, 제어한다.
- 객체 기능에 대한 책임을 짐
- 캡슐화와 은닉화의 차이
- 은닉화
- 내부 중요사항이 외부에 노출되지 않도록 막음
- 캡슐화
- 은닉화 된 상태에서 외부에서 기능을 사용할 수 있게 제공하고 책임짐
- 상속(Inheritance) OOP의 꽃
: 상위 개념의 특징을 하위 개념이 물려받아 사용하는 것
- 재 사용으로 코드의 수가 줄어듦
- 상속으로 인한 단점을 막기 위한 방법
- 상속을 재 사용 관점이 아닌 기능의 확장 개념으로 사용
- 객체 조립으로 is - a 관계가 성립될 수 있게 함
- 다형성(Polymorphism)
: 하나의 메소드나 클래스가 다양한 방법으로 동작하는 것
- 오버라이딩(Overriding)
: 상속받은 자식클래스에서 부모클래스의 (추상) 메소드의 내부 로직을 재작성
- 외부 구현 내용(메소드 명, 반환 타입, 매개변수)은 그대로 유지
- 오버로딩(Overloading)
: 하나의 클래스에서 같은 이름을 가진 오퍼레이션을 여러개 정의할 수 있다.
- 매개 변수는 무조건 달라야 한다.
- 반환 타입은 매개변수가 다르다면 아무 상관없다.
(매개변수가 같고 반환타입이 다른 경우는 성립X)
- 클래스 및 인터페이스와 다형성
- 오버라이딩(Overriding)
장점
객체 단위로 나눠져 작성되기 때문에 다음과 같은 장점이 존재한다.
- 디버깅이 쉽고 유지보수가 용이
- 요구사항을 명확하게 파악하여 프로그래밍 가능
데이터 모델링 시 객체와 매핑하는 것이 더 수월하기 때문
자주 사용하는 로직을 모듈화(라이브러리화)하여 사용 가능하여 다음과 같은 장점을 가진다.
- 높은 재사용성
완성된 라이브러리 사용 가능 - 신뢰성 확보
자주 사용되어 왔으므로 어느정도 보장된다.
예외처리를 잘 해두었을 경우 에러를 컴파일 단계에서 잡을 수 있어 버그 발생이 줄어듦 - 높은 생산성
라이브러리 내부 동작과정을 몰라도 제공되는 기능들을 사용할 수 있으므로
단점
- 많은 오버헤드(overhead) 발생
객체간의 정보 교환이 모두 메시지 교환을 통해 일어나기 때문
- 메시지를 보낸다 : 오퍼레이션의 실행을 요청하는 것
- 오버헤드(overhead) : 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간∙메모리 등
- 상태를 가지는 객체로 인한 버그 발생 가능성
내부 변수로 인해 객체가 예측할 수 없는 상태를 갖게 되기 때문
- 함수형 프로그래밍 패러다임이 발생하므로서 발생된 치명적인 단점
SOLID : 5대 원칙 디자인패턴
- SRP(Single Responsibility Principle) : 단일 책임 원칙
클래스는 단 하나의 책임을 가져야 하며, 클래스를 변경하는 이유는 단 하나여야 함.
- 변화에 대한 유연성 확보
- 낮은 결합도, 높은 응집도 추구
- OCP(Open-Closwed Principle) : 개방-폐쇄 원칙
모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
- LSP(Likov Substitution Principle) : 리스코프 치환 원칙
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 함
- 기반 클래스는 파생 클래스로 대체 가능해야 함
- 인터페이스를 알면 구현체를 몰라도 사용 가능해야 함
- 참고 : 코드 예시
- ISP(Intefrace Segregation Principle) : 인터페이스 분리 원칙
인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
- 변화에 대한 유연성 확보
- 참고 : 코드 예시
- DIP(Dependency Inversion Principle) : 의존 역전 원칙
고수준 모듈은 저수준 모듈 구현에 의존해서는 안된다.
- 고수준(단일 기능 제공 목적) / 저수준(고수준을 위한 하위 기능 실 구현)
- 클라이언트는 구체 클래스가 아닌 인터페이스나 추상 클래스에 의존해야 함
- 인터페이스 / 추상 클래스 간에만 서로 의존관계를 가지며 참조
- 참고 : 코드 예시
Reference
아래를 제외한 Reference들은 관련 내용 부분에 바로 연결시켜두었습니다.
Reference에 자세한 내용이 설명되어 있으니 참고바랍니다.
반응형