✏️ SOLID 객체지향 프로그래밍의 5가지 원칙

2024. 11. 28. 00:37·CS
728x90

SOLID 원칙(객체지향 설계 원칙)

1. SPR(Single Responsibility): 단일 책임 원칙

  • 클래스는 단 한 개의 책임(=기능)을 가져야 함
  • 한 클래스가 수행할 수 있는 기능이 여러 개면 안됨
  • 책임을 분리해서 한 개만 가져야 함

2. OCP(Open-Close): 개방-폐쇄 원칙 [추상화]

  • 확장(=새로운 기능 추가)에는 열려있어야 하고, 변경에는 닫혀있어야 함.
  • 기능 추가 요청이 오면 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야함.
  • 하나의 모듈 내 기능을 수정할 때, 다른 모듈을 계속해서 수정해야 한다면 유지보수가 복잡할 것.
  • OCP는 추상화(인터페이스)와 상속(다형성) 등을 통해 구현할 수 있다. 자주 변화되는 부분을 추상화함으로써 기존 코드 수정하지 않고도 기능을 확장할 수 있게 해 유연함을 높인다.
//추상화
abstract class Animal{
	abstract void speak();
}

class Cat extends Animal{	//상속
	void Bark(){
    	System.out.println("냐옹");
    }
}

class Dog extends Animal{	//상속
	void Bark(){
    	System.out.println("멍멍");
    }
}

class Animals{
	void zoo(Animal animal){
    	animal.speak();
    }
}

public class Main{
	public static void main(String[] args){
    	Animals hello = new Animals();
        
        Animal cat = new Cat();
        Animal dog = new Dog();
        
        hello.zoo(cat); //냐옹
        hello.zoo(dog); //멍멍
    }
}

 

 

3. LSP(Liskov Substitution): 리스코프 치환 원칙 [다형성]

  • 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 함
  • 즉, 부모 클래스의 인스턴스 사용하는 위치에 자식 클래스의 인스턴스를 대신 사용했을 때 코드가 원래 의도대로 동작해야 함
  • 부모 클래스와 자식 클래스 사이의 행위가 일관성이 있어야 한다
  • 상속관계가 아닌 클래스들을 상속관계로 설정하면 LSP에 위반
  • 예를들어, 위의 코드에서 Fish라는 클래스를 만든다고 가정하자. Fish는 Bark할 수 없기 때문에 Bark라는 메서드가 실행될 때 Exception을 처리해주게끔 코드를 짰다. 함께 일하는 개발자는 Fish내 Bark가 Exception으로 실행되는걸 몰랐기 때문에 문제가 발생할 수 있다. LSP는 개발자들이 함께 일을 함에 있어서 지켜야할 규칙같은 거라고 생각하면 편하다.
  • 리스코프 치환 원칙을 지키지 않으면, 개방 폐쇄 원칙을 위반하게 되는 것. 기능 확장을 위해 기존의 코드를 여러 번 수정해야하기 때문이다.

 

4. ISP(Interface Segregation): 인터페이스 분리 원칙

  • 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다
  • 범용적인 인터페이스보다 클라이언트(사용자)가 실제로 사용하는 인터페이스를 만들어야한다.
  • 즉, 인터페이스를 용도에 맞게 분리해서 구현해야 한다.
  • 사용하지 않는 인터페이스에 변경이 발생해도 영향을 받지 않도록 만들어야 한다.

 

5. DIP(Dependency Inversion): 의존 역전 원칙

  • 의존관계를 맺을 때, 변하기 쉬운 것 보다는 변하기 어려운 것에 의존해야 한다.
  • 즉, 어떤 클래스를 참조해야하는 상황이 생기면 그 클래스를 직접 참조하는 것이 아니라, 그 대상의 상위요소(추상 클래스 or 인터페이스)로 참조하라는 원칙이다.
  • 고수준의 모듈은 저수준의 모듈의 구현에 의존해서는 안된다.

 

728x90

'CS' 카테고리의 다른 글

✏️ 메시지 지향 미들웨어(MOM)  (1) 2024.12.02
✏️ 기능적 요구사항 vs 비기능적 요구사항  (0) 2024.12.02
✏️ 플랫폼  (0) 2024.12.02
'CS' 카테고리의 다른 글
  • ✏️ 메시지 지향 미들웨어(MOM)
  • ✏️ 기능적 요구사항 vs 비기능적 요구사항
  • ✏️ 플랫폼
DROPDEW
DROPDEW
💻 Developer | 기록하지 않으면 존재하지 않는다
  • DROPDEW
    제 2장 1막
    DROPDEW
  • 전체
    오늘
    어제
    • categories (401)
      • App/Android (1)
      • BE (36)
        • HTTP 웹 기본 지식 (8)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (12)
        • 스프링부트와 JPA 활용 (3)
        • 스프링부트 시큐리티 & JWT (0)
        • PHP (6)
      • FE·Client (23)
        • HTML (1)
        • React (19)
        • Unity (1)
      • Data (12)
        • AI (4)
        • Bigdata (6)
        • Database (1)
        • 빅데이터분석기사 (0)
      • Infra (0)
      • CS (7)
        • CS 면접 준비 (3)
      • 취준 (13)
        • 자격증·인턴·교육 (4)
        • 인적성·NCS (6)
        • 코테·필기·면접 후기 (3)
      • 코테 (268)
        • Algorithm (220)
        • SQL (35)
        • 정리 (13)
      • 인사이트 (27)
        • 금융경제뉴스 (7)
        • 금융용어·지식 (2)
        • 북마크 (7)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    브루트포스 알고리즘
    투포인터
    그리디알고리즘
    이분탐색
    최단경로
    수학
    백준
    자료구조
    너비우선탐색
    그래프탐색
    티스토리챌린지
    정렬
    시뮬레이션
    구현
    누적합
    문자열
    다이나믹프로그래밍
    오블완
    그래프이론
    매개변수탐색
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
DROPDEW
✏️ SOLID 객체지향 프로그래밍의 5가지 원칙
상단으로

티스토리툴바