객체 지향 프로그래밍(OOP)은 프로그램을 객체라는 단위로 구성하여 소프트웨어를 개발하는 프로그래밍 패러다임입니다. 객체는 데이터(속성)와 이를 조작하는 함수(메서드)를 하나로 묶은 독립적인 단위로, 현실 세계의 개념을 프로그래밍에 적용합니다.
ㅇ 핵심 개념
추상화(Abstraction)
- 복잡한 시스템에서 필요한 핵심적인 부분만을 모델링하여 표현하는 것
- 불필요한 세부사항을 감추고 중요한 정보에 집중하여 코드의 복잡성을 줄인다.
캡슐화(Encapsulation)
- 데이터와 메서드를 하나로 묶고 외부로부터 직접적인 접근을 제한하는 것
- 데이터의 무결성을 보호하고 객체 간 의존성을 낮춘다.
- private으로 변수에 직접접근을 막고 메서드를 통해서 조작한다.
상속(Inheritance)
- 기존 클래스의 속성과 메서드를 새로운 클래스가 물려 받는 것
- 코드의 재사용성을 높이고 계층적인 관계를 표현한다.
- Animal 클래스의 자식인 Dog, Cat 클래스는 Animal의 특징을 그대로 가지면서 추가적인 기능을 구현한다.
다형성(Polymorphism)
- 동일한 인터페이스나 메서드에 대해 여러 가지 형태로 구현할 수 있는 능력
- 코드의 유연성과 확장성을 높여준다.
- 추상메서드를 자식 클래스에서 구체적으로 구현한다.
ㅇ 장점
- 코드 재사용성 증가: 상속과 조합을 통해 기존 코드를 재사용할 수 있다.
- 유지 보수성 향상: 모듈화된 객체 단위로 코드를 작성하므로 수정이 용이함.
- 현실 세계 모델링 용이: 현실 세계의 개념을 그대로 프로그램에 반영할 수 있다.
- 확장성 강화: 새로운 기능이나 객체를 쉽게 추가할 수 있다.
- 데이터 보호: 캡슐화를 통해 데이터의 무결성을 유지하고 보안을 강화한다.
ㅇ 객체 지향 설계 원칙
SOLID 원칙
- 단일 책임 원칙(Single Responsibility Principle)
- 클래스는 하나의 책임만 가져야 한다.
- 변경의 이유가 하나뿐이어야 한다.
- 개방-폐쇄 원칙(Open-Closed Principle)
- 소프트웨어 요소는 확장에 열려 있어야 하고, 수정에 닫혀 있어야 한다.
- 기존 코드를 수정하지 않고 기능을 추가할 수 있어야 한다.
- 리스코프 치환 원칙(Liskov Substitution Principle)
- 자식 클래스는 부모 클래스의 기능을 온전히 수행해야 한다.
- 부모 타입의 객체를 자식 타입으로 치환해도 프로그램이 정상적으로 동작해야 한다.
- 인터페이스 분리 원칙(Interface Segregation Principle)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리한다.
- 의존 역전 원칙(Dependency Inversion Principle)
- 고수준 모듈은 저수준 모듈에 의존하면 안 되며, 둘 다 추상화에 의존한다.
- 구체적인 구현보다 인터페이스나 추상 클래스에 의존한다.
ㅇ 한계와 고려사항
- 복잡성 증가 가능성: 과도한 클래스와 객체 사용으로 오히려 코드가 복잡해질 수 있다.
- 성능 오버헤드: 추상화 계층이 많아지면 메모리 사용량과 실행 시간이 증가할 수 있다.
- 객체 간의 의존성 관리 필요: 객체 사이의 관계가 복잡해지면 유지 보수가 어려워질 수 있다.
- 개념 이해의 중요성: OOP의 개념을 제대로 이해하지 못하면 잘못된 설계로 이어질 수 있다.
'Software Engineering' 카테고리의 다른 글
Third Party (2) | 2024.10.23 |
---|---|
DevOps (1) | 2024.10.23 |
애자일(Agile) 방법론 (1) | 2024.10.23 |
TDD(Test-Driven Development) (0) | 2024.10.23 |
클린코드 & 시큐어 코드 & 리팩토링 (0) | 2024.10.23 |