유연한 프로그램을 만들기위한 OOP의 4원칙과 SOLID 알기!

객체지향의 4대 원칙

캡슐화 (Encapsulation)

  • 객체의 속성과 기능을 하나로 묶고, 외부에서는 내부 구현을 숨기는 것
  • 목적: 데이터 보호 및 변경 방지, 코드의 안정성 향상
  • private 필드 + getter, setter 메서드

    private int age;
    
    public int getAge() {
      return age;
    }
    
    public void setAge(int age) {
      if (age > 0) this.age = age;
    }
    

2. 상속 (Inheritance)

  • 부모 클래스의 속성과 기능을 자식 클래스가 물려받는 것
  • 목적: 코드 재사용성 증가, 계층적 구조 설계

    class Animal {
      void sound() { System.out.println("소리!"); }
    }
    
    class Dog extends Animal {
      void bark() { System.out.println("멍멍!"); }
    }
    

3. 다형성 (Polymorphism)

  • 하나의 메서드나 클래스가 여러 형태로 동작 가능
  • 목적: 유연하고 확장성 있는 코드 작성
  • Overriding(재정의), Overloading(다중정의)

    Animal a = new Dog(); // 부모 타입으로 자식 객체 참조
    a.sound(); // Dog의 sound()가 실행됨 (오버라이딩)
    

4. 추상화 (Abstraction)

  • 불필요한 세부 정보는 숨기고 핵심 기능만 드러내는 것
  • 목적: 복잡성 감소, 인터페이스 중심 설계
  • 추상 클래스, 인터페이스

    abstract class Shape {
      abstract void draw();
    }
    
    원칙 핵심 내용 키워드
    캡슐화 내부 정보 숨기기 private, getter/setter
    상속 코드 재사용 extends
    다형성 여러 형태로 동작 오버라이딩, 오버로딩
    추상화 중요한 기능만 보여주기 abstract, interface

객체지향 설계의 5대 원칙(SOLID)

  • SOLID는 유연하고 유지보수하기 쉬운 소프트웨어를 만들기위한 지침이다

    원칙 이름 (영문) 설명 예시
    S Single Responsibility Principle (SRP) 단일 책임 원칙
    하나의 클래스는 하나의 책임만 가져야 한다.
    ➡ 한 클래스가 하나의 기능만 담당해야 유지보수가 쉬움
    Service와 Repository를 분리
    → 각각 비즈니스 로직과 DB 처리
    O Open/Closed Principle (OCP) 개방-폐쇄 원칙
    소프트웨어 요소는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.
    ➡ 기존 코드를 수정하지 않고 기능을 추가할 수 있어야 함
    새로운 결제 방법 추가 시
    → 기존 Service는 수정 없이 새로운 클래스만 추가
    L Liskov Substitution Principle (LSP) 리스코프 치환 원칙
    자식 클래스는 부모 클래스의 자리를 대체할 수 있어야 한다.
    ➡ 부모 객체를 사용하는 부분에서 자식 객체로 바꿔도 정상 작동해야 함
    Car를 상속받은 카니발이 fly() 호출
    → 위반!
    I Interface Segregation Principle (ISP) 인터페이스 분리 원칙
    특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
    ➡ 사용하지 않는 메서드를 강요하지 않도록 인터페이스를 분리
    Printer 인터페이스에 scan() X
    → 필요한 기능만 인터페이스로 제공
    D Dependency Inversion Principle (DIP) 의존 역전 원칙
    상위 모듈은 하위 모듈에 의존하면 안 되고, 추상화에 의존해야 한다.
    ➡ 클래스가 구체적인 구현보다 인터페이스(추상)에 의존해야 유연한 구조 가능
    OService가 Repository에 직접 의존 X
    → 인터페이스로 추상화

댓글남기기