OOP(객체 지향 프로그래밍)란 문제를 여러 개의 객체 단위로 나눠 작업하는 방식으로, 객체들이 서로 유기적으로 상호작용하는 프로그래밍 이론
객체 지향의 4대 특성
1. 캡슐화 (Encapsulation)
- 데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 방법
- 캡슐화의 중요한 목적은 변수를 private로 선언하여 데이터를 보호하고, 보호된 변수는 getter나 setter등의 메서드를 통해서만 간접적으로 접근을 허용하는 것
- 캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다. 캡슐화와 정보은닉은 동일한 개념은 아님
2. 추상화 (Abstraction)
- 객체의 공통적인 속성과 기능을 추출하여 정의하는 것.
- 다시 말해 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통 특성을 파악해 필요 없는 특성을 제거하는 과정을 가르킴
- 객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념
- 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법
3. 상속(Inheritance)
- 기존 상위 클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새로운 하위 클래스에 새로운 기능도 추가할 수 있는 것
- 상속이 필요한 이유는 코드의 중복을 없애기 위해서
- 코드의 중복이 많아지면 개발 단계와 유지 보수에서 많은 비용이 들게 됨
- 상속 관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없음
4. 다형성(Polymorphism)
- 한 객체가 상속을 통해 기능을 확장하거나 변경하여 다른 여러 형태(객체)로 재구성 되는 것을 말함
- 오버라이딩은 하위 클래스(자식)가 상위 클래스(부모)에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는 것
- 오버로딩은 하나의 클래스 안에서 같은 이름의 메서드를 사용하지만 각 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현하는 것을 말함
- 메서드끼리 이름은 같지만 매개변수의 개수나 데이터 타입이 달라야 함
- API가 많아질수록 복잡성은 증가하기 때문에 다형성은 유용하며 코드 재사용성을 늘려주어 유지보수가 용이하도록 도와주는 개념
OOP의 장단점
장점
- 코드 재사용성 증가
- 생산성 향상
- 자연적인 모델링
- 유지보수의 우수성
단점
- 개발 속도가 느림
- 실행 속도가 느림
- 코딩 난이도 상승
객체지향 설계 5원칙 SOLID
1. 단일 책임 원칙 (SRP, Single Responsiblity Principle)
- 모든 클래스는 각각 하나의 책임만 가져야 함
2. 개방-폐쇄 원칙 (OCP, Open Closed Principle)
- 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 함
- 상위 클래스 또는 인터페이스를 중간에 둠으로써, 자신은 변화에 대해서는 폐쇄적이지만, 인터페이스는 외부의 변화에 대해서 확장을 개방해 줄 수 있음
3. 리스코프 치환 원칙 (LSP, Liscov Substitution Principle)
- 서브 타입은 언제나 자신의 기반(상위) 타입으로 교체 할 수 있어야 함
4. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)
- 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안됨
- 프로젝트의 요구 사항, 설계를 고려하여 SRP(단일책임원칙) or ISP(인터페이스분리원칙)를 선택
5. 의존 역전 원칙 (DIP, Dependency Inversion Principle)
- 자신보다 변하기 쉬운 것에 의존하지 말아야 함
'Web & Android > SpringBoot' 카테고리의 다른 글
[SpringBoot] Design Pattern (0) | 2023.08.14 |
---|---|
[SpringBoot] AOP(Aspect Oriented Programming) (0) | 2023.08.12 |
[SpringBoot] IoC &DI (0) | 2023.08.12 |
[SpringBoot] Spring Boot (0) | 2023.08.12 |
[SpringBoot] Spring (0) | 2023.08.12 |