객체 지향(OOP)이란 ?
독립적인 각각의 객체로 프로그램이나 시스템을 구성하는 것.
객체지향의 장점
- 코드 재사용 용이
- 유지 보수 쉬움
- 대형 프로젝트에 적합
객체 지향의 단점
- 처리 속도가 상대적으로 느리다.
- 객체가 많으면 용량이 커질 수 있다.
- 설계 시 시간과 노력이 들어감.
객체 지향의 4대 특징
1. 캡슐화 (정보 은닉)
- 접근 제어자를 사용해 객체 외부에서 내부 데이터의 접근을 통제하는 것이다.
2. 상속성 (재사용 + 확장)
- 상위 클래스의 특성을 하위 클래스에서 상속하고 더 필요한 속성을 확장해서 쓸 수 있다.
3. 추상화 (모델링)
- 객체들의 공통적인 특징을 뽑아내는 것.
4.다형성 (사용 편의)
- 오버라이딩 : 상위 클래스의 메소드와 같은 시그니쳐(이름, 반환형, 인자)로 메소드를 재정의 하는 것.
- 오버로딩 : 메소드 이름만 같고 시그니쳐가 다르다. 같은 이름의 함수도 매개 변수에 따라 다르게 동작시킬 수 있다.
객체 지향 설계 5대 원칙
SPR(Single Responsibility Principle) : 단일 책임 원칙
OCP(Open Close Principle) : 개방 폐쇄 원칙
LSP(Liskov Substitution Principle) : 리스코프 치환 워칙
ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
DIP(Dependency Inversion Principle) : 의존 역전 원칙
SOLID !
1. SPR(Single Responsibility Principle) - 단일 책임 원칙
어떤 클래스를 변경해야 하는 이유는 오직 하나 뿐이어야 한다.
* SRP가 안지켜진 사례
변수의 경우 - 하나의 속성이 여러 의미를 갖거나 / 어떤 곳에서는 쓰고 어떤 곳에서는 안쓰는 속성이 있는 경우.
메소드 의 경우 - 분기 처리를 위한 if 문이 많을 경우.
2. OCP(Open Close Principle) - 개방 폐쇄 원칙
소프트웨어 엔티티(클래스 , 모듈 , 함수 등)는 확장에 대해서는 열려 있어야 하지만, 변경에 대해서는 닫혀 있어야 한다.
즉, 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
Ex. 상점 직원이 아무리 바뀐다고 해도 손님이 상품을 구매하는 데는 지장이 없다.
직원은 판매 인터페이스를 구현해야 하기 때문!
손님은 판매인터페이스와 소통하기 때문에 직원이 누구든 지장이 없다.
3. LSP(Liskov Substitution Principle) - 리스코프 치환 원칙
하위 클래스의 인스턴스는 상위 클래스의 인스턴스 역할을 수행하는데 문제가 없어야 한다.
객체 지향 4대 특성의 상속, 다형성 원칙이 잘 지켜진다면 LSP는 자동으로 잘 적용된 것이다.
4. ISP(Interface Segregation Principle) - 인터페이스 분리 원칙
클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안된다.
5. DIP(Dependency Inversion Principle) - 의존 역전 원칙
고차원 모듈은 저차원 모듈에 의존하면 안된다!
추상화 된 것은 구체적인 것에 의존하면 안된다!
구체적인 것이 추상화된것에 의존해야 한다!
자주 변경되는 클래스에 의존하지 말자! 로 요약될 수 있다.
즉 , 자신보다 변하기 쉬운것에 의존하지 말라. 는 것이다.
* 클래스 - 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념
* 객체 - unique 한 사물 , 생물
* 객체와 인스턴스 - 설계도인 클래스가 구체적인 실체인 인스턴스가 되었을 때 객체라고 부른다.
구체적인 코드 상에 나타나는 객체를 인스턴스라고 부르고 , 로직 설계 시 나타나는 인스턴스를 객체라고 부른다.
* 인스턴스화 - 클래스에서 정의한 것을 토대로 실제 메모리 상에 할당 되는 것
'공부 > 개념 & 유용한 내용' 카테고리의 다른 글
포인터와 참조자의 차이 (0) | 2020.06.15 |
---|---|
Deque란? (0) | 2020.06.10 |
디자인 패턴 - 상태 패턴, 싱글턴 패턴, 컴포넌트 패턴 (0) | 2020.06.05 |
UNITY - NavMeshAgent가 이동하고 있고 , 목적지에 도착했는지 계산 (0) | 2020.06.03 |
추상클래스(abstract) & 인터페이스(interface) (0) | 2020.05.29 |