□ 정의
- 객체지향(Object-Oriented Programming, OOP)은 프로그램을 객체(object)라는 단위로 구성하는 프로그래밍 패러다임
- 객체는 데이터와 데이터를 처리하는 메서드를 함께 묶은 단위로, 현실 세계의 사물과 개념을 모델링하여 코드로 표현하는 방식
□ 주요 개념
- 클래스 (Class): 객체의 설계도나 템플릿으로, 객체의 속성(필드)과 동작(메서드)을 정의
- 객체 (Object): 클래스를 기반으로 생성된 실체로, 속성과 동작을 갖는 구체적인 인스턴스
- 캡슐화 (Encapsulation): 객체의 데이터(속성)를 외부에서 직접 접근하지 못하게 하고, 메서드를 통해서만 접근하게 제한하는 방식, 이는 데이터를 보호하고, 객체의 내부 구현을 숨겨서 코드의 복잡성을 줄인다.
- 상속 (Inheritance): 하나의 클래스가 다른 클래스의 속성과 메서드를 물려받아 확장할 수 있는 기능, 이를 통해 코드의 재사용성을 높이고, 계층 구조를 만들 수 있다.
- 다형성 (Polymorphism): 하나의 메서드나 객체가 여러 형태로 동작할 수 있는 성질, 메서드 오버로딩, 메서드 오버라이딩 등을 통해 구현된다.
- 추상화 (Abstraction): 복잡한 시스템을 단순화하여 필요한 부분만 표현하는 과정, 구체적인 구현을 숨기고, 사용자에게 필요한 기능만을 제공한다.
□ SOLID원칙
- S - Single Responsibility Principle (SRP, 단일 책임 원칙)
- 클래스는 하나의 책임만 가져야 한다는 원칙
- 클래스는 하나의 이유로만 변경되어야 하며, 여러 가지 기능을 수행하는 클래스는 나누어서 책임을 분리해야 한다.
- 이렇게 하면 클래스의 변경이나 수정이 다른 부분에 미치는 영향을 최소화할 수 있다.
- ex) UserManager 클래스가 사용자 관리와 이메일 발송 두 가지 일을 한다면, 이를 두 개의 클래스로 분리하는 것이 좋다.
- O - Open/Closed Principle (OCP, 개방/폐쇄 원칙)
- 소프트웨어 엔티티(클래스, 모듈 등)는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다는 원칙
- 기존 코드를 수정하지 않고도 새로운 기능을 추가할 수 있어야한다.
- ex) 새로운 기능을 추가할 때 기존 클래스를 변경하는 대신, 인터페이스를 통해 확장하거나, 새로운 클래스를 추가하는 방식으로 구현할 수 있다.
- L - Liskov Substitution Principle (LSP, 리스코프 치환 원칙)
- 자식 클래스는 부모 클래스의 역할을 대신할 수 있어야 한다는 원칙
- 자식 클래스는 부모 클래스의 기능을 확장하거나 수정할 수 있지만, 부모 클래스를 대체할 수 있어야 한다.
- 부모 클래스 타입의 객체를 자식 클래스 타입으로 교체해도 시스템의 동작에 문제가 없어야한다.
- ex) Bird 클래스에 Flyable이라는 메서드가 있고, 이를 상속받은 Duck과 Penguin이 있을 때, Penguin은 Flyable을 구현할 수 없으므로, Flyable을 Duck에만 적용하는 것이 좋다.
- I - Interface Segregation Principle (ISP, 인터페이스 분리 원칙)
- 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 한다는 원칙
- 하나의 큰 인터페이스보다는 클라이언트가 필요한 여러 개의 작은 인터페이스를 만드는 것이 좋다.
- ex) Printer 인터페이스가 Print와 Scan 메서드를 가지고 있다면, 프린터만 사용하는 클래스는 Scan을 구현할 필요가 없다. 이를 분리하여 필요한 메서드만 제공하는 작은 인터페이스로 만드는 것이 좋다.
- D - Dependency Inversion Principle (DIP, 의존성 역전 원칙)
- 고수준 모듈은 저수준 모듈에 의존하면 안 되고, 둘 다 추상화에 의존해야 한다는 원칙
- 추상화는 세부사항에 의존하지 않고, 세부사항이 추상화에 의존해야한다.
- 이는 클래스 간의 결합도를 낮추고, 코드의 유연성을 높이는 데 도움된다.
- ex) 데이터베이스에 의존하는 클래스가 있다면, 데이터베이스의 세부 구현에 의존하지 않고, DataAccess라는 추상화된 인터페이스를 통해 의존하도록 변경하는 것.
'이론공부' 카테고리의 다른 글
CORS(Cross-Origin Resource Sharing) (0) | 2025.02.13 |
---|---|
자료구조 - R트리(R-Tree) (0) | 2024.11.16 |
DB 인덱싱(Database Indexing) (0) | 2024.11.10 |
기술면접 준비(2) (1) | 2024.09.30 |
프록시(Proxy)란? (0) | 2024.09.05 |