SOLID원칙

홍신영·2025년 2월 27일

디자인패턴

목록 보기
1/3

디자인 패턴의 기초, SOLID원칙에 대해 알아보자.

Single-Responsibility principle(단일 책임 원칙)

모든 클래스는 하나의 책임만 가진다.
클래스는 그 책임을 완전히 캡슐화 해야한다.
클래스가 제공하는 모든 기능은 이 책임과 부합.

Open- closed principle(개방 패쇄 원칙)

확장에 대해 열려 있어야 하고, 모듈의 동작을 확장할 수 있다는 것을 의미
요구사항이 변경될 때, 새로운 동작을 추가해 모듈을 확장
즉, 모듈이 하는 일을 변경할 수 있음.

수정에 대해서는 닫혀 있어야한다.
코드를 수정하지 않아도 모듈의 기능을 확장하거나 변경 가능.
모듈의 라이브러리의수정이 필요 없음.

공통으로 처리해야할 함수를 추상클래스로 선언하고 상속받아 사용하는 방법이 있다.
ex) Shape클래스에 abstract로 CalculateArea()함수를 선언후, Rectangle, Circle클래스에서 Shape을 상속받아 구현하는 등

Liskov substitution principle(리스코프치환원칙)

파생 클래스는 기본 클래스를 대체할 수 있어야 함.
하위클래스를 강력하고 유연하게 만드는 원칙
OOP의 상속을 사용하면 하위 클래스를 통해 기능을 추가할 수 있음. But, 주의하지 않으면 불필요한 복잡성이 발생할 수 있다.

부모클래스의 방향성을 무효화하면 원칙에 위배된다는 것이다.
예를 들어서 Vehicle이라는 클래스가 부모클래스로 있고, Car, Train을 자식 클래스로 두었을 때,
부모클래스에서 Forward, Back, Right, Left 기능을 선언했다고 가정해보자.
Car는 이 기능을 모두 사용한다. 하지만 Train의 경우 Right, Left는 사용하지 않기에 무효처리하도록 로직을짠다면 이는 리스코프원칙에 위배된다는 것이다.

그래서 이럴 땐, Interface를 사용하여 해결할 수 있다.
ITurnable, IMovable 인터페이스를 선언하여 Car에는 두개다, Train에는 IMovable만 상속받아 구현하면 해결완료이다.
이처럼 인터페이스를 사용하여 이 외에 다양한 기능들을 나누어 상속받을 수 있다.

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

클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙
큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리
클라이언트들이 꼭 필요한 메서드들만 이용할 수 있게한다.
시스템의 내부 의존성을 약화하고 유연성을 강화

이는 인터페이스를 작게 나누어(적당히) 필요한 기능들만 상속받을 수 있도록 하는 것이다.
예들들면 Unit인터페이스에 Health, Damage, MoveSpeed, Defense, GoForward등 다양한 메서드들이 있다고 했을 때, 이를 상속받는 클래스에서 이 기능들을 모두 사용한다면 덜 문제가 되겠지만, 아닌 경우가 더 많을 것이다. 그래서 이를 IMovable,IUnitStats 등으로 나누어 사용하라는 것이다.

Dependency Inversion Principle(의존역전원칙)

소프트웨어 모듈들을 분리하는 특정 형식
추상화는 세부 사항에 의존해서는 안된다.
클래스가 다른 클래스와 관계가 있으면 안된다.(다른 클래스의 작동방식을 알고 있으면 X)

예를들어 Switch와 Door가 있을 때, Door에 추가적인 기능들이 많이 생기다 보면, S witch에서 door를 참조해서 호출할 함수들이 많아진다. 이를 다시 한 번 인터페이스로 해결해보자.
ISwitchable이라는 인터페이스에 문에 관한 함수들을 선언하여Door가 상속받도록 한다.
Door에서 각 기능들을 구현하고, Switch에서는 ISwitchable인터페이스를 참조하여 Door의 기능을 호출하면 해결이다.

추상클래스와 인터페이스의 차이점

추상클래스 / 인터페이스
메서드를 완전히 또는 일부 구현가능 / 메서드를 선언만 가능, 구현X
변수 및 필드 선언/ 사용 가능 / 메서드와 프로퍼티 선언만 가능(필드X)
스태틱 멤버가능 / 스태틱 X
생성자 사용 가능 / 생성자 사용X
모든 엑세스 한정자 가능 / 모든 멤버는 퍼블릭으로 취급

** 추가적으로 C#은 다중상속이 불가하다. 로봇이면서 스위치기능을 상속받고 싶다면 다중상속을 하면 편하겠지만 C#에서 지원하지 않으므로, 이는 앞서 계속 말했듯이 인터페이스로 해결할 수 있다. 2가지를 상속 받고 싶다면, 하나는 추상클래스로 상속받고, 하나는 인터페이스로 상속받으면 되는 것.

참고: 유니티코리아

profile
게임 클라이언트 개발자 / 게임 QA

0개의 댓글