[OOP/C++] 솔리드 원칙 : 객체지향 5가지 원칙

신지한·2024년 4월 22일
0

면접준비

목록 보기
1/9
post-thumbnail

📢 공부내용에 앞서서

본 게시글은 면접준비 및 자기계발을 목적으로 작성된 게시글입니다
공부한 내용을 토대로 남들에게 설명할 수 있도록 이해하는 과정에 작성한 게시글이니 참고바랍니다

📌 본 게시글은 오늘코딩님 영상을 참고하여 작성하였습니다



📖 객체지향 5원칙

  • 단일 책임 원칙 (Single Responsibility Principle)
  • 개방 폐쇄 원칙 (Open/Closed Principle)
  • 리스코프 치환 원칙 (Liskov/s Subsitution Principle)
  • 인터페이스 분리 원칙 (Interface Segregation Principle
  • 의존성 역전 원칙 (Defendency Inversion Principle)

📌 단일 책임 원칙

모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤ- 위키 백과

단일 책임 원칙은 "하나의 클래스는 하나의 책임만 갖는다"라는 원칙이다
게임에서 플레이어의 오디오, 인풋, 움직임 등의 기능을 별도의 클래스로 나눠서 만들고
이것들을 각각 별도의 컴포넌트로 오브젝트에 부착한다

⭐ 단일 책임 원칙의 장점

  • 가독성이 좋아짐 : 단일 기능 단위로 분리했으니 코드의 길이가 짧고 명확해짐
  • 확장성이 좋아짐 : 하나의 기능으로만 이루어졌기 때문에 이 클래스를 상속받아 확장하기에 용이함
  • 재사용성이 좋아짐 : 단일 기능으로 이뤄져있기 때문에 모듈식으로 여러 부분에서 재사용할 수 있게 됨

한 클래스를 한 관심사에 집중하도록 유지하는 것이 중요한 이유는, 이것이 클래스를 더욱 튼튼하게 만들기 때문이다

📌 개방 폐쇄 원칙

'소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다'는 프로그래밍 원칙이다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤ- 위키 백과

클래스가

  • 확장에는 개방되어있고
  • 수정에는 닫혀있어야한다

👉 잘못된 예시

Calculator 클래스에 새로운 도형에 대한 함수를 만들게되면 클래스 자체를 수정해야함

👉 바른 예시

Shape이라는 클래스를 선언하여 Rectangle과 Circle같은 도형들이 상속받도록 함

public class Calculator
{
	public float GetArea(Shape shape)
    {
    	return shape.CalculateArea();
    }
}

다음과 같은 코드에서 Shape을 파라미터로 받아 해당 도형의 CalculateArea를 실행

위와 같은 방법으로 할 시 도형이 더 추가되더라도 기존 코드를 변경하지 않고 shape을 상속시키면 됨

추상화를 통한 개방-폐쇄 원칙

: 객체 지향 프로그래밍 언어에서는 고정되기는 해도 제한되지는 않은, 가능한 동작의 묶음을 표현하는 추상화가 가능하다. 모듈은 추상화를 조작할 수 있다. 이런 모듈은 고정된 추상화에 의존하기 때문에 수정에 대해 닫혀 있을 수 있고, 반대로 추상화의 새 파생 클래스를 만드는 것을 통해 확장도 가능하다. 따라서 추상화는 개방-폐쇄 원칙의 핵심 요소이다
(출처: https://ko.wikipedia.org/wiki/개방-폐쇄_원칙)

📌 리스코프 치환 원칙

'소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다'는 프로그래밍 원칙이다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤ- 위키 백과

파생 클래스가 기본 클래스를 대체할 수 있어야 한다. 상속을 할 때 지켜야하는 원칙을 말함

하위 클래스는 어떠한 경우에도 부모 클래스를 대체할 수 있어야 한다
ex) 자동차를 상속받아서 다양한 자동차를 만드는건 괜찮은데 자동차를 상속받아놓고 비행기를 만들면 안됨

해당 원칙을 잘 지키기 위해서는 추상 클래스를

  • 조금 더 간단하게 만들고
  • 조금 더 분류해서 만들고
  • 상속을 쓰는 것 보다는 인터페이스를 생성해서 여러 인터페이스를 조합

하는 것이 좋다

📌 인터페이스 분리 원칙

클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤ- 위키 백과

인터페이스를 사용할 때 한번에 크게 사용하지말고 작은 단위로 나눠서 사용해라

인터페이스를 분리해서 쓸수록 코드 간의 결합도가 낮아지고 수정이 용이해진다

🤔인터페이스(interface)란?

인터페이스(interface)는 객체가 수행할 수 있는 작업에 대한 설명이다. 예를 들어 전등 스위치를 켜면 조명이 켜지고 어떻게 작동하든 상관이 없다. 객체 지향 프로그래밍에서 인터페이스는 객체가 "X"가 되기 위해 가져야 하는 모든 기능에 대한 설명이다.

(출처: https://users.cs.utah.edu/~germain/PPS/Topics/interfaces.html)

interface 인터페이스 이름
{
	반환형 메소드이름1(매개변수 목록);
	반환형 메소드이름2(매개변수 목록);
    ...
}

<인터페이스 특징>

  • 인터페이스는 메소드, 이벤트, 인덱서, 프로퍼티만 가질 수 있다
  • 접근 제한 한정자를 사용할 수 없고, 모든 것이 public으로 선언된다
  • 인터페이스는 자신을 상속받는 클래스에게 오버라이딩을 강제한다
  • 자식 클래스에서 구현할 메소드들은 public 한정자로 수식해야 한다
  • 구현부가 없다
  • 인스턴스를 만들 수 없지만, 인터페이스를 상속받는 클래스의 인스턴스를 만드는 것은 가능하다
  • 클래스는 인터페이스를 여러 개 상속 받는 것이 가능하다

(출처: https://daekyoulibrary.tistory.com/entry/C-객체지향의-꽃-인터페이스Interface-1편)

📌 의존성 역전 원칙

소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤ- 위키 백과

고수준 모듈이 저수준 모듈에서 직접 가져오면 안된다

특정 클래스에 직접적으로 의존하는게 아니라 인터페이스를 거쳐서 사용하기 때문에 느슨한 결합이 이루어짐

📌 객체지향 코드 설계 목표

"느슨한 결합과 높은 응집력을 목표로 해야한다"

profile
게임 개발자

0개의 댓글