객체 지향 프로그래밍
📌 컴퓨터 프로그래밍의 패러다임 중 하나로 모든 것이 객체로 이루어져 있다는 원리를 기반으로 함. 즉, 프로그래밍에서 필요한 데이터를 모두 추상화시켜 상태와 행위를 가진 객체를 만들고, 그 객체들이 서로 맞물려 기능함.
🎱 특징
1️⃣ 추상화(Abstraction)
- 객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 작업
- 불필요한 정보는 숨기고, 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 것
2️⃣ 캡슐화(Encapsulation)
- 정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 것
→ 한 곳에서 변화가 일어나도 다른 곳에 미치는 사이드이펙트를 최소화시키는 것을 의미 - 외부에서 접근할 필요가 없는 것들은 접근 지정자 private을 사용하여 접근을 제한
** 결합도 : 어떤 기능을 실행할 때, 다른 클래스나 모듈에 얼마나 의존적인지를 나타내는 지표
3️⃣ 상속
- 클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것
→ 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종 - 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능
- 장점
- 자식 클래스를 캡슐화해두면 외부에선 개별적인 자식 클래스들과 무관하게 개발 가능
- 상위 클래스의 구현을 활용함으로써 코드 재사용성이 용이
- 단점
- 부모 클래스의 변경이 어려움 → 의존하는 자식 클래스들이 영향을 받음
- 불필요한 클래스의 증가
- 잘못된 상속 사용 → 상속받는 클래스가 부모클래스와 IS-A 관계가 아닐 때 발생
ex. 사람은 동물이다.
4️⃣ 다형성(Polymorphism)
- 서로 다른 클래스의 객체가 같은 동작을 수행할 때, 각자의 특성에 맞는 방식으로 동작하는것
- 객체 지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 행위를 여러 개 정의하거나, 상위클래스 행위를 하위 클래스에서 재정의하여 사용할 수 있음
🎱 5가지 설계원칙, SOLID
1️⃣ 단일 책임 원칙(SRP, Single Responsibility Principle)
- 클래스는 단 한개의 책임을 가져야하며, 클래스를 변경하는 이유는 단 하나의 이유여야 함
→ 한 기능의 변경에 의해 다른 기능과 관련된 코드에 영향을 미칠 수 있음
2️⃣ 개방-폐쇄 원칙(OCP, Open-Closed Principle)
- 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 함→ 추상화와 상속을 통해 구현 가능
→ 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계
3️⃣ 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
- 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야함
→ 상속 관계가 아닌 경우 클래스들을 상속 관계로 설정하면 원칙에 위해됨
→ 상속 관계에서는 일반화 관계가 성립해야 함 - 리스코프 치환 원칙을 지키지 않으면 OCP를 위반하게 됨
4️⃣ 인터페이스 분리 원칙(ISP, Interface Segregation Principle)
- 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 함
→ 각 클라이언트가 필요로 하는 인터페이스들을 분리하여 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야됨
5️⃣ 의존 역전 원칙(DIP, Dependency Inversion Principle)
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안됨
→ 구체화된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 함
🎱 장점
- 이미 작성한 코드에 대한 재사용성이 높음 → 자주 사용하는 코드를 라이브러리로 만들어두면 개발 생산성이 높아짐
- 중복되는 코드의 양이 줄어듦
- 객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수에 용이함.
🎱 단점
- 처리속도가 상대적으로 느림
- 객체가 많아지면 저장공간을 많이 차지
'CS > Software Engineering' 카테고리의 다른 글
[CS] DevOps (0) | 2024.03.04 |
---|---|
[CS] MSA(마이크로 서비스 아키텍처) (0) | 2023.12.16 |
[CS] 함수형 프로그래밍 (0) | 2023.12.15 |
[CS] 애자일(Agile) 방법론 (1) | 2023.12.06 |
[CS] TDD :: 테스트 주도 개발 (1) | 2023.12.06 |