@markdown


![객체지향과 디자인 패턴](https://t1.daumcdn.net/cfile/tistory/9916C533598564DC1C)

_

# 객체지향과 디자인 패턴

_

## 내가 배운 자바

_

자바의 기본을 배울때 클래스가 나온다. 객체지향 프로그래밍 언어이기 때문이다.

여기서 예제로 동물을 정의하고 고양이, 개 등을 만들면서 공부했다.

상위 클래스에서 bark(), roam() 등의 함수를 만들고

콘크리트 클래스에서 이를 정의한다.

_

최범균의 *['객체지향과 디자인 패턴'](http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788969090010)* 책을 읽으며 지금까지 공부한 방법이 맞는가 싶었다.

템플릿, 파사드, 옵저버, 팩토리, 스테이트 패턴 등 객체지향 패턴에 맞지 않는 방법으로 객체지향을 공부했다.

기본원리인 SOLID 는 커녕 마치 C언어를 다루듯 코드를 짰다.

때문에 자바 초보자였던 나는 클래스 하나에 많은걸 넣었고, 내식대로 추상화를 하고 클래스를 만들었다.

_

## 학교에서 배우는 자바

_

언어 배우는 순서에서도 문제가 있었을까?

나는 대학교에서 처음 코딩을 배웠다. 학교에서 언어를 배울때는 C언어를 먼저 배웠다.

이후 C++, JAVA, Javascript 순으로 배워갔다.

이때, C언어를 먼저 배운게 화근이었던가. JAVA를 할땐 리팩토링을 해도 한 클래스에서 함수단위로 쪼갰고 한 패키지의 크기가 커졌다.

내코드엔 아키텍쳐는 없었으며, 실행 결과만 존재했다.

_

지금가지 배운 방식이 그렇다. 

_

## 문제

_

패턴이나 아키텍쳐, 깔끔한 코드에 대해서 배우지 못하다 보니 코더도, 개발자도 아닌 언어만 아는 애매한 위치가 되어 버렸다.

할 줄은 알지만 제대로 할 줄은 모르는 개발자가 되었다.

_

### 사각형 구현 문제

_

직사각형과 정사각형이 존재한다고 할때, 일반적으로 정사각형은 직사각형에 포함 되므로 상속관계로 정의하게 배웠다.

나는 실제로 이 예제를 칠판에 써가며 배웠고 그렇게 알고 있었다.

그런데 저자는 이렇게 만들지 말라고 하며 상속관계가 아니라고 한다.

_

직사각형의 한변을 증가시키는 increaseHeight() 함수가 있다고 하자.

_

이를 정사각형에서 온전히 구현할 수 있을까?

사각형의 세로길이만을 증가시키고 싶었지만, 가로길이까지 증가가 되어 버리고 만다.

_

즉, 같은 함수로 다른 행동을 하게 되므로 IS-A 관계가 성립되지 않고, 그렇기 때문에 둘을 상속 관계로 만들 수 없다.

이는 객체지향 기본원리 SOLID 중 리스코프 치환원칙에 위배된다.

_

이렇게 부모클래스를 올바르게 구현하지 못한다면 오히려 따로 만드는 것이 관리에 용이해 질 수 있다.

_

### 동물 상속 문제

_

모든 동물군의 부모클래스가 되는 Animal 이 존재하고 이를 상속받는 구현 클래스가 있다고 하자.

이들이 상속받는 Animal 클래스의 모든 함수를 온전히 대체할 수 있을까?

상황에 따라 다르겠지만, *['Head First JAVA'](http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788979143713&orderClick=LAH&Kc=)* 에 나온 예제로 얘기를 해보겠다.

이곳에서 Animal 객체는 roam() 이라는 함수로 `돌아다니는 것` 을 정의하고 있다.

그런데 이 돌아다닌 다는 것의 특징을 조류에도 포함 시킬 수 있을까?

혹은, 땅속을 돌아다니는 두더지 같은 동물들도 포함 시킬 수 있을까?

_

만약 사자가 돌아다니고 있는 동물을 eat() 함수로 잡아 먹을 수 있다고 했을때, 사자는 날아다니는 새나 땅속에 있는 두더지 까지 잡아 먹을 수 있게 되버린다.

_

이를 해결하려면 먼저 중간에 Animal 을 받는 Bird, Mole 이라는 클래스를 새로 만들고 roam() 을 새로 정의하고 상속을 받게 해야할 것이다.

또한, Animal 에서는 현재 지상인지 하늘인지, 땅속인지를 갖을 수 있는 상태값도 필요해진다.

Animal에 멤버변수가 추가되었으니 다른 모든 구현 클래스에서도 상태값이 바뀔 수 있는 조작이 필요해진다.

보는 것처럼, 확장성이 용이하지 않다.

_

예제가 잘못 되었다는 것은 아니다. 다만 시작부터 단순 상속만을 공부할때 잘못된 습관을 들이게될 확률이 커진다. (나처럼)

_

## 디자인 패턴, 좋은코드, 설계

_

학교에서는 이런것들을 가르쳐주지 않는다.

언어를 배우고, 프로젝트를 만들고, 발표를 하고, 심사를 한다.

_

나는 개인적으로 디자인 패턴과 좋은 코드를 쓰는 방법은 언어를 배우기 전부터 한번쯤 봐야한다고 생각한다.

마치 우리가 운전면허를 따기전에 안전운전이 왜 필요한지 알리고, 사고의 위험성을 알리고, 안전한 운전 방법을 배운뒤 면허를 발급하는 것처럼.

_

이렇게 코드 한줄에도 많은 생각을 하게되면 자연스럽게 설계에 대해 고민하게 될 것이며, 나아가 멋진 코더, 개발자, 아키텍트가 될 수 있을 것이다.

'기타' 카테고리의 다른 글

[Tistory] 티스토리 마크다운 적용  (0) 2017.07.05

+ Recent posts