Taking baby-developer steps

[객체지향의 사실과 오해] 3. 타입과 추상화 - 6 정적 모델 본문

CS 지식/객체지향

[객체지향의 사실과 오해] 3. 타입과 추상화 - 6 정적 모델

Surin Lee 2023. 11. 19. 23:00

타입의 목적

 왜 타입을 사용해야 할까? 객체가 시간에 따라 동적으로 변화할 때 요긴하게 쓰인다. 타입을 사용하면 동적으로 변하는 객체의 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 한다. 

타입은 결국 추상화다

 타입은 추상화로 볼 수 있다. 객체에서 불필요한 특정 시간, 상태 변화를 제거하고 정적인 관점에서 객체를 표현할 수 있게 된다. 예를 들어 객체 작가는 "글을 쓴다, 글을 퇴고한다, 글을 삭제한다, 밥을 먹는다"의 행동을 할 수 있다. 작가는 "허기짐"의 상태를 가진다. 앞에서 서술한 작가의 행동 및 상태만으로 객체를 표현할 수 있었다. 이는 시간에 따른 상태변경이 배제된 단순화된 효과적 방법이다.

동적 모델, 정적 모델

 스냅샷(snapshot) -> 어떤 객체가 특정 시점에 구체적으로 어떤 상태를 가지느냐를 나타낸다. 객체 다이어그램(object diagram)이라고도 한다. 스냅샷처럼 실제로 객체가 살아 움직이는 동안의 상태 변화와 어떤 행동을 하는 지를 포착하는 것을 동적 모델(dynamic model)이라고 한다.

 예를 들어, 위에서 정적모델로 소개된 작가 클래스의 스냅샷을 표현하자면 다음과 같다. "작가의 인스턴스인 도치는 19일 오후 2시에 허기짐의 상태가 3인 상태에서 글을 퇴고하고 있다."

 

 타입 모델(type diagram)-> 객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 것이다. 객체가 속한 타입의 정적인 모습을 표현해, 정적 모델(static model)이라고 한다.

 

 개발자들은 주로 클래스를 작성하는 시점에는 시스템을 정적인 관점에서 접근하고, 애플리케이션을 실행해 객체의 상태 변경을 추적하고 디버깅하는 동안에는 객체의 동적인 모델을 주시한다. 객체지향 개발은 애플리케이션의 동적인 관점, 정적인 관점을 모두 다뤄야 한다.

클래스

 타입을 구현하는 가장 보편적 방법은 클래스를 이용하는 것이다. 클래스와 타입은 동일한 것이 아니다. 타입은 객체를 분류하기 위해 사용하는 개념이다. 클래스는 단지 타입을 구현할 수 있는 여러 구현 메커니즘 중 하나일 뿐이다. 실제 JS와 같은 프로토타입 기반 언어에는 클래스가 존재하지 않는다.

 대부분 프로그래밍 언어는 클래스를 기반으로 해,  클래스와 타입을 동일한 개념으로 혼동하기도 한다. 클래스와 타입을 구분하면 설계를 유연하게 유지하는데 도움이 된다고 한다. 클래스는 타입의 구현 외 코드를 재사용하는 용도로도 사용되기 때문에 클래스와 타입을 동일시 하는 것은 혼란을 불러올 것이다.

 객체를 분류하는 기준은 타입이다. 타입을 나누는 기준은 객체가 수행하는 행동이다! 객체를 분류하기 위해 타입을 결정하고, 그 타입을 언어로 구현할 수 있는 방법 중 하나가 클래스 이다.

 

객체지향에서는 동적으로 변하는 객체의 "상태"와 상태를 변경하는 "행동"이 중요하다. 


느낀점

 객체는 클래스가 아니다. 라는 말은 들어봤지만, 사실 확 와닿지는 않았다. C++를 사용하며, 행동을 하는 주체로서 항상 클래스를 설계하고 구현했기 때문에 코드상에선 객체 == 클래스 라고 생각하고 있었다. 조금 더 자세히는 객체를 표현하는 방법이 클래스라고 생각했다. 이 책에서는 클래스는 "객체를 분류하는 타입"을 구현하는 하나의 방법일 뿐이라고 소개한다. 프로그램 상으로 구현한 클래스가 같은 타입에 속하는 인스턴스들을 판별하고 분류하는 역할을 한다고 생각하는 편이 올바른 방향인 걸까. 조금 더 프로젝트를 진행하며 객체 설계 단계에서 이에 유의해야겠다.


참고문헌 : 객체지향의 사실과 오해 

Comments