ETC/Tip

Tip :: 객체지향의 원칙

VallistA2015. 7. 10. 10:48

절차지향과 객체지향등 여러 패러다임이 존재하는데, 그 존재하는 곳에서 최근의 개발자들이 게임을 개발하면서 뭘 개발하든 객체지향적인 언어로 개발하는 것을 볼 수 있다.

 

객체지향의 대표적인 언어로는 C#, Java 등 고급언어들이 상당히 많은데 이러한 객체지향적인 언어는 절차지향적인 방법보다 다른 방법론이기 때문에 기존에 소스코드 짜던데로 짜게되면 혼란을 줄수 있게 된다.

 

그래서 나온것이 객체지향의 5원칙이다. (SOLID)

객체지향의 5원칙의 앞글자만 따서 SOLID 라고도 부르며 이렇게 코딩하는것이 은근히 어렵다.

 

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

모든 객체지향에서 사용하는 클래스는 한가지의 책임을 가져야 한다는 원칙이다.

쉽게 설명하자면 캐릭터의 움직임을 담당하는 클래스가 있다. 그런데 개발자가 급해서 이 캐릭터의 움직임을 담당하는 클래스 안에 이미지를 렌더링하는 함수를 넣었다. 이것은 단일 책임 원칙 위반이다.

 

나중에 렌더링하는 함수의 성격이 바뀌거나 렌더링을 하는 함수의 이름이 변경될 경우 이 원칙에 대해서 어겼을 시 수정해야할 곳이 많아져 버린다. 하지만 이 원칙대로 분할해서 관리를 할 경우 빠른 스위칭이 가능해진다.

 

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

모든 소프트웨어 구성 요소는 확장에 대해서 개방되어 있지만 수정에 대해서는 폐쇄되어 있다는 것이 중점인 원칙이다.

 

사이드뷰 형식의 2D 액션배틀게임을 만든다고 가정하자.

위의 언급한 캐릭터 움직임을 담당하는 클래스를 만들었고, 우리는 캐릭터를 두 종 만들어야 한다.

근데 여기서, 우리는 AI를 만들어야 한다. 캐릭터 한 종은 자기 자신의 캐릭터이고 상대방 캐릭터를 만들어야 하기 때문이다.

근데 상대방 캐릭터에 들어가는 AI를 위의 SRP 원칙을 사용하여 분리를 시켰다. 이렇게 되면 우린 공통적으로 움직임을 담당하는 클래스를 만들어서 이동할 때 움직임을 담당하는 클래스를 콜 하면 될 것이다.

캐릭터 클래스의 이동 클래스 또는 함수를 따로 또 만들거나 수정할 필요가 없다. (수정에 대해선 폐쇄)

AI쪽만 손보면되는 것이다. (확장에 대해선 개방)

 

3. LSP : Liskov Substitusion Principle (리스코프 치환 법칙)

 

자식 클래스는 언제나 자신의 부모 클래스를 교체할 수 있다는 원칙이다.

 

부모 클래스가 들어갈 자리에 자식 클래스를넣어도 계획대로 잘 작동해야 한다는 것이다. (이것은 제너릭 프로그래밍과 관련이 있다.)

상속의 본질이며 이를 지ㅣ지않으면 부모 클래스 본래의 의미가 변해서 is a 관계의 의미가 없어지며, 그로 인해 다형성이 불가능해진다. 본질적인 구조를 바꾸지 않고 이를 해결하려 하면 의존성 역전 법칙을 동시에 어기게 될 수도 있다.

 

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

 

클라이언트에서 사용하지 않는 메서드는 사용해선 안된다. 그러므로 인터페이스를 다시 작게 나누어 만든다. OCP와 비슷한 느낌도 들지만 엄연히 다른 원칙이다. 하지만 ISP를 잘 지키면 OCP도 잘 지키게 될 것이다.

 

5. DIP : Depndency Inversion Principle (의존성 역전 법칙)

 

상위 클래스는 하위 클래스에 의존해서는 안된다는 법칙이다.

은근히 사람들이 제일 많이 어기는 법칙중 하나이며 팩토리 패턴을 귀찮다고 별도 클래스 분리 없이 상위 클래승 정적 메소드로 구현하는 경우가 대표적인 어기는 사례.

댓글

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!

자고 싶습니다. ㅠㅠ

Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today :

Total :

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment