객체 지향 프로그래밍 (OOP)

2025. 2. 20. 16:14Java/객체지향

1. 객체 지향 프로그래밍 (OOP: Object Oriented Programming)

  • 객체 지향 프로그래밍
    • 객체 지향 이론: 실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다
    • 객체 지향 프로그래밍은 컴퓨터 프로그램을 '객체'들의 모임으로 파악하고자 하는 것이다. 
    • 객체 간 상호 작용: 각각의 객체는 메시지를 주고받고 데이터를 처리할 수 있다 (협력) 
  • 장점: 프로그램의 변경 및 유지 보수가 용이
    • 코드의 재사용성이 높다 (재사용성)
    • 신뢰성이 높은 프로그래밍이 가능하게 한다 (중복코드제거)
    • 코드의 관리가 용이하다 (유지보수)

2. OOP의 4대 특징 

  1. 캡슐화
    • 데이터를 외부에서 직접 접근하지 못하게 숨기고, 필요한 경우에만 접근할 수 있도록 하는 개념
    • 구현: private, protected 같은 접근 제어자 사용 
  2. 추상화
    • 불필요한 정보는 숨기고, 중요한 정보만 보여주는 개념
    • 구현: 인터페이스나 추상 클래스 사용 
  3. 상속
    • 기존 클래스를 확장(extend)해서 새로운 클래스를 만들 수 있다.
    • 코드 재사용성을 높이고, 유지보수를 쉽게 만들어 줌
  4. 다형성
    • 같은 메서드가 클래스에 따라 다르게 동작할 수 있는 성질
    • 오버로딩(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): 고수준 모듈은 저수준 모듈에 의존하지 말고, 둘 다 추상화에 의존해야 한다. “추상화(인터페이스)에 의존해야지, 구체화(클래스)에 의존하면 안된다”