객체지향의 4대 특성 : 캡슐화, 상속, 다형성, 추상화
1. 캡슐화 ( Encapsulation )
- 객체의 속성(Variable)을 보호하기 위해 사용한다.
- 객체와 객체간의 의사소통을 위해 필요한 정보만을 노출한다.
- 실제 내부 구현 정보는 숨긴다.
Method 설계
- 자신이 가지고있는 속성에 대해서는 해당 상태를 변경하는 기능을 제공해야 한다.
- 실물 객체가 가진 기능을 모두 제공해야 한다.
- 각각의 Method는 서로 관련성이 있어야 한다. ( getter - setter ) (add - delete ) 등
- Getter / Setter : 외부에서 내부 속성에 직접 접근하지 못하도록 사용
- CRUD Method : 데이터 처리를 위한 기본적인 CRUD Method 제공
- Business Logic Method : 비즈니스 로직 처리를 위한 Method
- 객체의 생명주기 처리 Method : 객체 소멸에 대한 Method
- 객체의 영구성 관리 Method : 대부분 속성은 외부에서 접근이 불가하도록 private로 선언하고, getter/setter등을 이용해 접근하도록 설계
캡슐화의 장점
- 추상화 제공 : 외부에서 내부를 알지 못해도 객체 단위로 프로그램 설계 가능
- 재 사용성 향상
- 유지보수의 효율 향상
무결성
Getter/Setter을 제외하고는 public method는 입력된 매개변수를 Validation 한 후 실행하는 것을 기본으로 한다.
- Validation을 통해, 객체의 값을 바꾸거나 값에대한 유효성을 판단할 수 있다.
일반적으로, 변수는 private으로 선언, Method는 public으로 선언하는 형태
2. 상속 ( Inheritance )
- 프로그램을 쉽게 확장할 수 있게 해주는 강력한 수단이다.
- 상위 클래스와 하위 클래스는 계층적 관계를 갖는다.
- 상위클래스에서 하위 클래스로 내려갈 수록 구체화 되는 것이 중요하다.
< 상속의 효과 >
1) 프로그램 구조에 대한 이해도 향상
- 최상위 클래스의 구조를 보고, 하위 클래스의 동작을 이해하기 쉬워진다.
2) 재사용성 향상 (중복 감소)
- 해당 클래스에서 필요한 속성, 메소드를 모두 정의하지 않고 상속을 받아서 사용할 수 있다.
3) 확장성 향상
- 일관된 형태의 클래스 객체를 추가할 수 있어서, 프로그램 확장이 쉬워진다.
4) 유지보수 효율 향상
3. 다형성( polymorphism )
- 하나의 개체가 여러개의 형태로 변화하는 것
- 외부에서 보이는 모습은 한가지 형태이지만, 다형성을 이용해 여러가지 기능을 수행할 수 있다.
- overloading, overriding을 통해서 구현 가능
4. 추상화( Abstraction )
- 객체지향에서 추상화는 모델링이다.
- 어떤 현실 모델에서 불필요한 부분은 빼고, 필요한 부분만 이용하여 클래스로 만드는 것이다.
- 필요한 속성과 행동을 골라서 클래스로 구현하는 것이 추상화를 하는 것이다.
- 다형성, 상속 모두 추상화에 속한다.
SOLID : 객체지향 설계 5 원칙
객체지향의 4대특성에 기반하기 때문에 5가지 모두 유사한 모양을 가지고 있다.
1. SRP(Single Resoponsibility Principle) 단일 책임 원칙
- 클래스는 하나의 기능만 가지며, 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 한 가지뿐이어야 한다.
- 변경에 의한 연쇄작용 감소
- 가독성 향상
- 유지보수 용이
서로 밀접한 관계가 있는 기능끼리 클래스로 묶고, 서로 다른 기능을 하는 클래스를 최대한 떨어뜨려놓는 것이 좋다. 이렇게 하면 문제가 발생하더라도 문제가 발생한 부분과 관련 없는 동작에는 영향을 미치지 않거나, 그 영향이 작아질 수 있다. 즉, 객체지향 설계의 이점을 살려서 유지보수를 용이하게 만들어 줘야 한다.
2. OCP(Open Closed Principle) 개방 폐쇄 원칙
- 자기 자신의 확장에는 열려있고, 변경에 대해서는 닫혀있어야 한다.
기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계해야 한다.
즉, 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소에는 수정이 일어나지 않고, 기존 구성요소를 쉽게 확장할 수 있도록 해야한다.
객체지향의 추상화와 다형성을 활용한다.
3. LSP(Liskov Substitution Principle) 리스코프 치환 원칙
- 서브 타입은 언제나 자신의 상위타입으로 교체할 수 있어야 한다.
- 클래스 상속, 인터페이스 상속을 이용해 확장성을 획득한다.
- 다형성과 확장성을 극대화하기 위해 인터페이스를 사용하는 것이 좋다.
4. ISP(Interface Segregation Principle) 인터페이스 분리 원칙
- 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
- 가능한 최소한의 인터페이스만 구현한다.
어떤 클래스를 이용하는 클라이언트가 여러개고, 이들이 그 기능의 일부만 사용한다면, 여러 인터페이스로 분리하여 클라이언트가 필요한 기능만 전달하도록 한다.
프로젝트 설계 방법에 따라 SRP(단일책임원칙), ISP(인터페이스 분리원칙) 중 선택한다.
5. DIP(Dependency Inversion Principle) 의존 역전 원칙
- 상위 모델은 하위 모델에 의존하면 안된다.
- 둘 다 추상화에 의존해야 한다.
- 추상화는 세부 사항에 의존해서는 안된다.
- 세부 사항은 추상화에 따라 달라진다.
하위 모델의 변경이 상위 모듈의 변경을 요구하는 위계관계를 끊는다.
실제 사용관계는 그대로이지만, 추상화를 매개로 메시지를 주고받으며 관계를 느슨하게 만든다.
'컴퓨터 공학 > 프로그래밍 이론' 카테고리의 다른 글
[Spring / 스프링 부트 핵심 가이드] 디자인 패턴 정리 (0) | 2023.10.01 |
---|---|
[ComputerScience / 디자인 패턴] 브릿지 패턴(Bridge Pattern, 가교 패턴) (0) | 2023.10.01 |
[Spring / 스프링 부트 핵심 가이드] 레이어드 아키텍처, SpringMVC (0) | 2023.10.01 |
[Spring / 스프링 부트 핵심 가이드] 제어의 역전(IoC, DI, AOP) (0) | 2023.09.30 |
[ComputerScience / 디자인 패턴]싱글톤 패턴(singleton pattern) (0) | 2023.04.20 |