티스토리 뷰

클래스와 객체는 붕어빵 틀과 붕어빵이 아니다.

처음 객체지향 프로그래밍을 접하는 사람들은 이런 말을 한 번 쯤 듣는다. 아마 안들어본 사람이 없을 것 같다.

붕어빵 틀에서 붕어빵을 찍어내지? 그러니까 붕어빵 틀은 클래스가 되는 거고 붕어빵은 객체가 되는거야.
이 new라는 연산자를 사용해서 붕어빵 틀에서 붕어빵을 찍어낼 수 있어

나도 객체 지향을 처음 접할 때 위의 설명을 들었고, 잘못된 개념으로 객체 지향을 이해하고 있다가 약 5분 전 김종민님이 쓰신 스프링 입문을 위한 자바 객체 지향의 원리와 이해라는 책의 극초반 내용에서 깨달음을 얻었다.(정말 좋은 책이니 다들 읽어보았으면 좋겠다.)

붕어빵 틀과 붕어빵은 결코 클래스와 객체 관계가 될 수 없다.

왜?

코드로 보면 이해가 한결 쉬워진다.

다음 코드를 보고 이상한 점이 느껴지지 않는가?
새로운 붕어빵틀을 만들어냈는데, 어떻게 이게 붕어빵이 되는거지?

다음 코드를 한 번 더 보자.

붕어빵틀-붕어빵이 클래스와 객체 관계라면 설계도면-건물이 클래스와 객체 관계가 되지 못할 이유가 뭐가 있겠는가? 클래스가 객체를 찍어내는 틀이라면서?
클래스와 객체는 분류와 사물의 관계여야 한다. 붕어빵 틀이라는 클래스를 통해 만들어진 객체는 붕어빵 틀의 일종이어야 한다는 얘기다.

이제 제대로된 클래스-객체 관계를 코드로 만나보자.

이해가 되었는가? 붕어빵이라는 분류에서 팥붕어빵, 크림붕어빵, 초코붕어빵이라는 사물을 만들어냈다. 이때 팥, 크림, 초코는 각각 붕어빵이라는 큰 범주 안에서 각각의 재료를 차별화한 것이다. (붕어빵이라는 클래스의 '재료'라는 속성이 다른 것이다.)

위에 언급한 설계도-건물의 관계도 이렇게 수정할 수 있다.

설계도라는 분류에서 부르즈할리파설계도, 롯데월트타워설계도라는 사물을 만들어냈다. 이때 부르즈할리파-롯데월드타워와 165-129는 설계도라는 큰 범주 내에서 각각의 이름과 층이라는 속성을 다르게 설정한 것이다.

클래스는 분류에 대한 개념이지 실체가 아니다. 객체는 실체다. 기억하자.