[android/kotlin] 객체 지향 프로그래밍의 원칙(솔리드원칙)

남윤희·2023년 11월 29일
0

kotlin

목록 보기
23/25

여태까지 코딩을 하며 객체지향의 원칙이 있는지 몰랐다. 그래서 한번 정리 해 보려고 한다.

원칙은 총 5가지이다.

  • SRP(단일 책임 원칙),
  • OCP(개방-폐쇄 원칙),
  • LSP(리스코프 치환 원칙),
  • ISP(인터페이스 분리 원칙),
  • DIP(의존 역전 원칙)

앞 글자를 따서 SOILD 원칙이라고 부른다.

객체 지향 프로그래밍의 원칙

1. SRP(Single Responsiblity Principle) : 단일 책임 원칙

객체는 오직 하나의 책임을 가져야 한다. (객체는 오직 하나의 변경의 이유만을 가져야 한다.) 클래스는 그 책임을 완전히 캡슐화해야 함을 말한다.

사칙연산 함수를 가지고 있는 계산 클래스가 있다고 치자. 
이 상태의 계산 클래스는 오직 사칙연산 기능만을 책임진다. 
만일 프로그램이 대대적으로 공사를 들어가게 되더라도 
계산 클래스가 수정될만한 사유는 누가 봐도 사칙연산 함수와 관련된 문제뿐이다. 
이처럼 단일 책임 원칙은 클래스의 목적을 명확히 함으로써 구조가 난잡해지거나 
수정 사항이 불필요하게 넓게 퍼지는 것을 예방하고 기능을 명확히 분리할 수 있게 한다.

2. OCP(Open Closed Principle): 개방-폐쇄 원칙

객체는 확장에 대해서는 개방적이고 수정에 대해서는 폐쇄적이어야 한다는 원칙이다. 즉, 객체 기능의 확장을 허용하고 스스로의 변경은 피해야 한다.

캐릭터를 하나 생성한다고 할때, 
각각의 캐릭터가 움직임이 다를 경우 
움직임의 패턴 구현을 하위 클래스에 맡긴다면 캐
릭터 클래스의 수정은 필요가없고(Closed) 
움직임의 패턴만 재정의 하면 된다.(Open)

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

자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙이다. 즉 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다는 것. 상속의 본질인데, 이를 지키지 않으면 부모 클래스 본래의 의미가 변해서 is-a 관계가 망가져 다형성을 지킬 수 없게 된다.

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

클라이언트에서 사용하지 않는 메서드는 사용해선 안 된다. 그러므로 인터페이스를 다시 작게 나누어 만든다. OCP와 비슷한 느낌도 들지만 엄연히 다른 원칙이다. 하지만 ISP를 잘 지키면 OCP도 잘 지키게 될 확률이 비약적으로 증가한다. 정확히 말하자면 인터페이스의 SRP라고 할 수 있다.

한 클래스는 자신이 사용하지않는 인터페이스는 구현하지 말아야 한다. 
하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 낫다.

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

추상성이 높고 안정적인 고수준의 클래스는 구체적이고 불안정한 저수준의 클래스에 의존해서는 안 된다는 원칙으로서, 일반적으로 객체지향의 인터페이스를 통해서 이 원칙을 준수할 수 있게 된다. (상대적으로 고수준인) 클라이언트는 저수준의 클래스에서 추상화한 인터페이스만을 바라보기 때문에, 이 인터페이스를 구현한 클래스는 클라이언트에 어떤 변경도 없이 얼마든지 나중에 교체될 수 있다. (디자인 패턴 중 전략 패턴을 떠올리면 된다)

의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 
변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다.
한마디로 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺으라는 것이다.

참조(나무위키)
적용사례 참고자료

profile
안드로이드 주니어 개발자

0개의 댓글