객체 지향 프로그래밍 (OOP)
2025. 2. 20. 16:14ㆍJava/객체지향
1. 객체 지향 프로그래밍 (OOP: Object Oriented Programming)
- 객체 지향 프로그래밍
- 객체 지향 이론: 실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다
- 객체 지향 프로그래밍은 컴퓨터 프로그램을 '객체'들의 모임으로 파악하고자 하는 것이다.
- 객체 간 상호 작용: 각각의 객체는 메시지를 주고받고 데이터를 처리할 수 있다 (협력)
- 장점: 프로그램의 변경 및 유지 보수가 용이
- 코드의 재사용성이 높다 (재사용성)
- 신뢰성이 높은 프로그래밍이 가능하게 한다 (중복코드제거)
- 코드의 관리가 용이하다 (유지보수)
2. OOP의 4대 특징
- 캡슐화
- 데이터를 외부에서 직접 접근하지 못하게 숨기고, 필요한 경우에만 접근할 수 있도록 하는 개념
- 구현: private, protected 같은 접근 제어자 사용
- 추상화
- 불필요한 정보는 숨기고, 중요한 정보만 보여주는 개념
- 구현: 인터페이스나 추상 클래스 사용
- 상속
- 기존 클래스를 확장(extend)해서 새로운 클래스를 만들 수 있다.
- 코드 재사용성을 높이고, 유지보수를 쉽게 만들어 줌
- 다형성
- 같은 메서드가 클래스에 따라 다르게 동작할 수 있는 성질
- 오버로딩(Overloading): 같은 이름의 메서드를 매개변수 형태에 따라 여러 개 정의하는 것.
- 오버라이딩(Overriding): 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것.
3. 다형성
- 다형성은 같은 타입으로 다양한 객체를 다룰 수 있게 해주는 객체지향의 핵심 개념
- 모든 설계에 역할과 구현을 분리하자
- 역할: 자동차 / 구현: 소나타, K3, 산타페 등등
- 역할: 로미오-줄리엣 / 구현: 현빈-송혜교 등등
- 애플리케이션 설계에서는 역할: 인터페이스 / 구현: 클래스, 객체
- 다형성의 본질: 역할과 구현을 구분하면 세상이 단순해지고, 유연해지며, 변경도 편리해진다. 즉 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
- 클라이언트는 대상의 역할(인터페이스)만 알면된다
- 클라이언트는 구현대상의 내부구조를 몰라도되고
- 내부구조가 변경되어도 영향받지 않는다.
- 구현 대상 자체를 변경해도 영향받지 않는다.
- 이상적으로는 모든 설계에 인터페이스를 부여하자
- 인터페이스를 먼저 설계하고 구현을 나중에 정하게되면 구현기술이 바뀌더라도 나머지를 변경할 필요가 없고 그래서 변경의 범위가 되게 작고 유연해진다는 장점
- 인터페이스를 도입하면 추상화라는 비용이 발생한다. (인터페이스, 구현 클래스 2번 확인해야함)
- 따라서 기능을 확장할 가능성이 없다면, 구체 클래스를 직접 사용하고, 향후 꼭 필요할 때 리팩터링해서 인터페이스를 도입하는 것도 방법이다.
- 스프링은 다형성을 극대화해서 이용할 수 있도록 도와준다.
4. 좋은 객체지향 설계의 5가지 원칙 (SOLID)
- 단일 책임 원칙 (SRP: Single Responsibility Principle): 클래스는 단 하나의 책임만 가져야 한다.
- 개방-폐쇄 원칙 (OCP: Open-Closed Principle): 소프트웨어는 확장에 열려 있고, 수정에는 닫혀 있어야 한다. 다형성 활용
- 리스코프 치환 원칙 (LSP: Liskov Substitution Principle): 서브클래스는 언제나 부모 클래스를 대체할 수 있어야 한다. 하위 클래스는 인터페이스 규약을 모두 지켜야한다.
- 인터페이스 분리 원칙 (ISP: Interface Segregation Principle): 인터페이스는 특정 클라이언트에 필요한 기능만 포함해야 한다. 자동사 인터페이스 -> 운전, 정비 인터페이스로 분리
- 의존 역전 원칙 (DIP: Dependency Inversion Principle): 고수준 모듈은 저수준 모듈에 의존하지 말고, 둘 다 추상화에 의존해야 한다. “추상화(인터페이스)에 의존해야지, 구체화(클래스)에 의존하면 안된다”