Programming

객체지향 프로그래밍의 3요소 5원칙!

Ms_Tony 2017. 12. 7. 16:04

객체지향의 3요소 5원칙


3요소

캡슐화, 다형성, 상속


Encapsulation 캡슐화

- 프로그램 내에서 같은 기능을 목적으로 작성된 코드를 모아서 다른 곳(클래스)에서 안보이게 숨기는 것.

클래스에 정의된 속성(Attribute)는 숨기고(Private), 객체가 수행할 기능(Function)은 공개(Public)하는 것을 의미한다.

Inheritance 상속

- 클래스 사이에 부모와 자식 클래스가 존재할 수 있다는 뜻.

자식 클래스는 상속받은 부모 클래스의 속성(변수) 및 기능(메소드, 함수)를 물려받는 것을 의미한다.


Polymorphism 다형성

Overriding과 Overloading 두가지로 나뉨.

Overriding

  • 부모클래스에서 정의되어 있는 내용을 자식클래스에서 재정의하여 사용하는 것.

Overloading

  • 같은 이름을 가진 메소드(함수)를 인자값의 종류에 따라 여러개 만들수 있다.

  • 같은 이름의 메소드라고 하더라도, 원하는 기능이 상이할 수 있으니, 메소드가 받는 인자의 종류 또는 숫자를 다르게 하여 기능을 정의하는 것.


5원칙

SOLID

S -> SRP(단일 책임의 원칙 : Single Responsibility Principle)

‘There should never be more than one reason for a class to change’


- 하나의 클래스는 하나의 목적을 위해서 생성되며, 클래스가 제공하는 모든 서비스는 하나의 책임(axis of change)을 수행하는 데 집중되어 있어야 한다는 원칙입니다.

- 이는 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 함을 의미합니다.

- SRP 원리를 적용하면 책임 영역이 확실해지기 때문에 한 책임의 변경에서 다른 책임의 변경으로의 연쇄작용에서 자유로울 수 있습니다.

- 코드의 가독성 및 유지보수에 있어서 유리합니다.

- 객체 지향 프로그래밍의 5원칙 중 나머지 4원칙의 기초가 되는 원칙입니다.



O -> OCP(개방폐쇄의 원칙: Open Close Principle)

‘You should be able to extend a classes behavior, without modifying it.


- 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다는 원리입니다.

- 이것은 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화 해야 한다는 의미로, 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다는 뜻입니다.

- 재사용 코드를 만드는 기반이며, OCP를 가능하게 하는 중요 메커니즘은 추상화와 다형성.(Written By Robert C. Martin)

객체지향의 장점을 극대화하는 중요한 원리.


L -> LSP(리스코브 치환의 원칙: The Liskov Substitution)

FUNCTIONS THAT USE POINTERS OR REFERENCES TO BASE CLASSES MUST BE ABLE TO USE OBJECTS OF DERIVED CLASSES WITHOUT KNOWING IT.


- 자식 클래스(서브 타입)는 언제나 자신의 부모 클래스(기반 타입)를 대체할 수 있다. 즉, 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다는 것.

- 상속의 본질인 원리

- 이를 지키지 않을 경우 부모 클래스 본래의 의미가 변해서 is a 관계가 무너짐



I -> ISP(인터페이스 분리의 원칙: Interface Segregation Principle)

‘Client should not be forced to depend upon interfaces that they do not use.’


- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다는 원리.

- 어떤 클래스가 다른 클래스에 종속될 때에는 가능한 최소한의 인터페이스만을 사용해야 합니다.



D -> DIP(의존성역전의 원칙: Dependency Inversion Principle)

‘High level modules should not depend upon low level modules. Both should depend upon abstractions.’

‘Abstractions should not depend upon details. Details should depend upon abstractions.’


- 구조적 디자인에서 발생하던 하위 레벨 모듈의 변경이 상위 레벨 모듈의 변경을 요구하는 위계관계를 끊는 의미의역전입니다.

- 실제 사용 관계는 바뀌지 않으며, 추상을 매개로 메시지를 주고 받음으로써 관계를 최대한 느슨하게 만드는 원칙입니다.


참고 :

http://www.nextree.co.kr/p6960/

https://namu.wiki/w/%EA%B0%9D%EC%B2%B4%20%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%9B%90%EC%B9%99#s-2.3