0. 객체 지향 프로그램 설계하기 


# 디자인 패턴

한 개 혹은 그 이상의 클래스로 이루어진 프로그램을 만들 때, 어떤 형태로 만들지 설계하는 단계에서 미리 정해진 패턴을 가져와서 쓸 때가 있다.

이를 디자인 패턴이라 하며, 구조적으로 버그에 견고한 형태를 위해 혹은 재사용 등의 목적이 있을 때 적용한다. 



1. 추상화 (Abstraction)


1) 객체를 설계하는 기초 단계

만들고자 하는 객체의 특성이나 기능이 무엇인지 먼저 정리하는 것


- 개발자가 만들 객체들에 필요한 기능은 어떤 것이 있는지 파악하고 그 기능을 분류해야 된다.

- 정의된 객체의 기능은 클래스의 메소드로 표현된다. 



2. 상속 (Inheritance)


1) 부모-자식 관계를 맺는 상속

두 클래스 중 한 클래스가 갖고 있는 속성과 메소드들을 다른 클래스에게 물려주는 것을 의미 


- 부모 클래스(parent class), 상위 클래스(super class): 물려 주는 역할을 하는 클래스

- 자식 클래스(child class), 하위 클래스(sub class): 상속받는 역할을 하는 클래스 


2) is-a, has-a 법칙

- 논리적으로 부모 클래스와 자식 클래스를 구분할 수 있다.

- is-a, has-a 관계가 성립되는 경우에만 상속 기법을 사용할 수 있다. 


- is-a, has-a 관계를 보여주는 상속 관계


          



3.  캡슐화 (Encapsulation)


1) 관련된 것들을 따로 모은 클래스

- 서로 관련 있는 기능이나 데이터를 한 곳으로 모아서 효율적으로 관리 및 사용할 수 있도록 하는 것 

- 꼭 필요한 데이터나 기능만 외부에 노출시키는 것

* 이를 정보 은닉(hiding information)이라 한다. 


- 내부의 중요한 데이터가 외부에 노출되지 않기 때문에 데이터의 무결성(정밀성, 정확성)을 유지할 수 있다. 


4. 다형성 (Polymorphism)


1) 하나의 기능을 수행하지만 형태를 다양하게 가질 수 있는 기법