SOLID 원칙 : 객체지향 설계 5대 원칙

윤진원·2022년 8월 3일
1

CS 지식

목록 보기
1/1
post-thumbnail

SOLID 원칙이라고 불리는 객체지향 5대 원칙이 존재한다.
일단 객체지향 프로그래밍이 무엇인지 부터 알아보자.

객체지향 프로그래밍이란 ?

객체지향 프로그래밍(OOP : Object Oriented programming)문제를 여러 개의 객체 단위로 나누어서 작업하는 방식으로, 객체들이 서로 유기적으로 상호작용하는 프로그래밍 방식이다.

  • 절차 지향 : "무엇을 어떤 절차로 할 것인가?"가 핵심이 된다.
  • 객체 지향 : "누가 어떤 일을 할 것인가?"가 핵심이 된다.

객체지향의 특징, 장점과 단점은 다음 포스팅에 알아보기로 하고 SOLID 원칙에 대해 알아보자.

SOLID 원칙이란 ?

객체 지향 프로그래밍을 설계할 때, 유지보수와 확장이 쉬운 시스템을 만들고자 할 때 지향해야 할 5가지 원칙.

- S : SRP (단일 책임 원칙)
- O : OCP (개방-폐쇄 원칙)
- L : LSP (리스코프 치환 원칙)
- I : ISP (인터페이스 분리 원칙)
- D : DIP (의존관계 역전 원칙)

SRP (Single Responsibility) : 단일 책임 원칙

  • 모든 클래스는 하나의 책임을 갖는다.
  • 클래스는 그 책임을 캡슐화해야 한다.
  • 클래스를 변경하는 이유는 단 하나여야 한다.
  • 한 책임의 변경에 의해 다른 책임과 관련된 코드가 영향을 받을 수 있다.

예를 들어 설명하면, A, B, C 메소드가 존재한다. B 메소드는 A 메소드 기반으로 만들어졌고, C 메소드는 B 메소드를 기반으로 만들어졌다고 해보자.

만약 A 메소드에 문제가 생기거나 코드를 유지보수 해야 할 일이 생겨 코드를 수정하면 그를 기반으로 만들어진 B메소드, 또 B 메소드를 기반으로 만들어진 C 메소드까지 모두 수정해야 한다.
→ 따라서 이들을 분리하고 한 클래스가 한 가지 책임만 지도록해야 한다.

OCP (Open-closed) : 개방-폐쇄 원칙

  • 확장에는 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.
  • 기능을 추가하거나 변경해야 할 때 원래 코드를 변경하지 않아도, 기존의 코드에 새로운 코드를 추가함으로써 기능의 추가나 변경이 가능하다.
  • 이 원칙을 위해 주로 추상화다형성을 활용한다.

확장에 대해 열려 있다는 말은 모듈의 행위가 확장될 수 있음을 의미한다. 이 말은 요구사항이나 부가 기능이 필요할 때, 새로운 행위를 추가하여 모듈을 확장시킬 수 있다는 말이다.

변경에 닫혀 있다는 말은 어떤 모듈을 확장할 때, 기존의 코드의 변경을 초래하지 않는다는 뜻이다.

LSP (Liskov Substitution) : 리스코프 치환 원칙

  • 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
  • 상속 관계가 아닌 클래스들을 상속 관계로 설정하면, 이 원칙에 위배된다.

→ 쉽게 얘기하면 자식 클래스는 부모 클래스가 따르던 구현 조건 사항을 자식 클래스도 따라야 한다는 말이다.

이 원칙의 일반적인 예시는 직사각형을 상속한 정사각형 클래스의 예시이다.
정사각형 클래스가 직사각형 클래스를 상속하면 정사각형의 특징인 "네 변의 길이는 동일하다" 라는 특징과 그렇지 않은 직사각형의 차이로 인하여 직사각형을 정사각형 클래스로 치환해서 사용할 때, 두 클래스의 특징 차이 때문에 오류가 날 수 있다는 의미이다.

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

  • 클라이언트는 자기가 사용하지 않는 메소드에는 의존하지 않아야 한다.
  • 큰 덩어리의 인터페이스를 구체적으로 작은 단위로 분리시켜, 꼭 필요한 메소드만 사용하게 한다.

→ 즉, 클라이언트는 필요로 하는 인터페이스를 잘게 분리함으로써, 사용하지 않는 인터페이스에 변경이 일어나도 영향을 받지 않아야 한다 라는 의미이다.

DIP (Dependency Inversion) : 의존관계 역전 원칙

  • 추상화에 의존하고, 구체화에 의존하면 안된다.
  • 상위 모듈은 하위 모듈에 의존하지 않고, 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
  • 추상화는 세부 사항에 의존해서는 안된다.

→ 즉, 의존 관계를 형성할 때 구체적인 것 (변하기 쉬운 것)에 의존하기 보단 추상적인 것 (변하기 어려운 것)에 의존하자는 의미이다.
저수준 모듈이 변경되어도 고수준 모듈은 타격을 입지 않는 형태가 좋다.

정리

디자인 패턴을 공부하던 중 OCP(개방-폐쇄 원칙)과 의존성 뒤집기 원칙이 나와 질문을 하던중 세미나 멘토분이 SOLID 원칙에 대해 말씀하셔서 찾아보고 공부하게 되었다.
아직 이 원칙을 적용해서 코딩할 만큼의 실력은 되지 않지만 머릿속에 새겨두자.

profile
기억보단 기록을

1개의 댓글

comment-user-thumbnail
2022년 12월 11일

잘 봤습니다!

답글 달기