객체지향의 사실과 오해에 해당하는 글 2

객체지향의 사실과 오해 3 ~ 4장

Book Review|2019. 11. 5. 18:12
객체지향의 사실과 오해
국내도서
저자 : 조영호
출판 : 위키북스 2015.06.17
상세보기

3. 타입과 추상화

추상화는 어떤 내용을 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다. 그 방법으로 사물간의 차이점을 빼고 공통점을 일반화하여 단순하게 만들고 불필요한 세부사항을 제거하여 단순화 하는 것이다. 즉 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이다.

 

이런 추상화 개념을 이용해서 객체지향에 대입해서 생각해보자.

 

그룹화

각 객체는 명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 말한다.

여러 객체에서 공통적인 요소를 뽑아서 그룹화 하면 복잡성을 효과적으로 감소 시킬 수 있다. 예를 들어 토끼, 강아지 등을 동물이라는 공통의 그룹으로 묶고 사과, 딸기 등을 과일이라는 공통의 그룹으로 묶으면 차이점을 빼고 공통점만을 취해 단순화 할 수 있는 추상화의 일종이다.

 

객체지향에서 객체 개개별로 구별하면 좋지만 그렇기에는 너무 이해하기 어려워지기 때문에 공통적인 특성을 뽑아서 하나로 묶는데 이를 묶기위한 공통적인 기반을 개념(concept)라고 한다. 이런 개념을 이용해서 객체를 여러 그룹으로 분류(classification) 할 수 있다. 이렇게 분류가 된 객체를 그룹의 일원이 되었다고 하여 인스턴스(instance)라고 한다.

 

객체 분류의 개념

그럼 객체에서 그룹으로 분류하기 위해 사용되는 개념은 symbol (이름이나 명칭), intension (개념의 정의), extension (개념에 속한 객체들의 집합) 3가지의 관점을 가지고 있다.

 

토끼라는 객체는 동물이라는 개념의 symbol을 사용하였고 4개의 다리와 척추동물이라는 intension을 사용하였고 같이 소속된 돼지나 강아지들을 보면서 extension을 확인하였다. 이로써 토끼는 동물이라는 그룹으로 분류될 수 있게 되었다.

 

객체 분류의 단점

잘못된 객체 분류를 통해 그룹에 이상한 객체가 소속되면 유지보수가 어렵고 변화에 대처하기가 어려워진다.

위의 내용을 종합해보면 객체를 분류하는 건 공통의 요소를 뽑아서 일반화하고 단순화하여 복잡성을 극복하는 작업이다.

 

 

타입

타입은 개념(concept)와 동일한 의미로써 공통점을 기반으로 객체를 묶기위한 틀이다. 객체에서 가장 중요한건 어떠한 행동을 하느냐가 가장 중요하고 그에 따라 타입이 결정된다. 내부에서 표현하는 방식이 서로 다르더라도 행동이 같다면 둘의 타입은 같을 수 있다.

Animal animal1 = new Dog(); 
Animal animal2 = new Cat(); 

animal1.eat(); 
animal2.eat();

위 두개의 객체의 내부 행동은 다르지만 먹는다는 행동이 같기에 같은 타입을 가질 수 있다. 이를 다형성이라고 한다. 이를 통해서 외부의 행동만 제공하고 내부적으로 상세 내용을 숨기는 캡슐화 원칙을 수행 가능하다.

 

이처럼 객체에 타입을 지정할 때는 데이터가 아니라 행동에 따라서 지정 해야 하는 책임 주도 설계를 해야 한다.

 

일반화/특수화 (supertype/subtype)

객체 타입에는 일반적으로 포함되는 타입과 특수한 타입 두 가지로 나뉜다. 강아지로 예를 들어보면 강아지가 짖는건 일반적인 강아지 타입의 특징이다. 하지만 훈련된 애완견의 경우 일반 강아지와 다른 행동이 가능하다. 여기서 강아지라는 특징은 일반적인 것이고 애완견은 특수화된 타입을 의미한다. 여기서 알 수 있듯이 특수화와 일반화의 차이는 행동을 통해서 기반 된다. 특수화된 타입은 일반화 타입의 특징을 포함하고 있으며 일반적인 특징보다 더 적은 모집군을 가지고 있다.

 

이를 슈퍼타입, 서브타입이라고도 하는데 서브타입은 슈퍼티입의 행위에 추가적으로 특수한 행위를 추가한 것이기 때문에 슈퍼타입의 행동은 서브 타입에게 자동으로 상속된다.

 

3장 결론

  • 타입을 통해서 객체를 분류하는데 이 타입은 객체의 행동을 통해서 정해진다. 이렇게 분류한 타입을 이용하여 클래스를 이용하여 프로그램화 한다.

  • 추상화는 객체의 특징을 보고 일반화/특수화하여 불필요한 부분을 제거하고 단순하게 만들어서 분류하는 것이다.

 

4. 역할, 책임, 협력

객체지향에서 협력은 가장 중요한 프레임이다. 협력에 초점을 맞춰서 설계를 하게 되면 저절로 객체들의 행동이 드러나고 그에따라 상태가 결정된다. 객체의 모양을 빚는 것은 객체가 참여하는 협력으로 어떤 협력에 참여하는지가 객체에 필요한 행동을 결정하고, 필요한 행동이 객체의 상태를 결정한다.

 

책임

객체들간의 협력에서 각 객체가 적절한 행동을 해줄 책임을 가지고 있다. 책임은 객체지향의 중요한 재료로써 눙숙한 프로그램 설계는 객체에게 적절하게 책임을 부여해주는 것을 의미한다.

 

이런 책임을 분류하는 기준은 외부에 제공해줄 수 있는 정보와 외부에 제공해 줄 수 있는 서비스에 대한 정의이다. 이런 책임을 바탕으로 객체지향에서 객체는 어떤 객체에 요청 메시지에 따라 어떤 책임 행동을 해줄 수 있는지 결정하는 것이 포인트이다.

 

역할

역할은 객체지향에서 재사용이 가능하고 유연한 설계를 가지는데 중요한 구성요소이다. 동일한 역할을 동일한 책임을 수행할 수 있다는 뜻이다. 또한 동일한 역할을 하는 객체를 추상화하여 유연성을 가지게 하고 재사용성과 단순하게 객체지향을 설계할 수 있다.

 

이 처럼 역할이 추상화되면 상황에 따라 여러 객체를 대체하면서 사용할 수 있어 유연성이 증가한다.

 

협력에 따라 흐르는 객체의 책임

- 설계 시 객체들 사이에 주고받을 요청과 응답의 흐름을 깔끔하게 만들고 (협력 설계) 그 객체들이 협력에 참여하여 자신의 역할을 책임있게 수행해야 한다.

- 즉 객체간의 관계를 먼저 만들고 그 다음 역할과 책임을 설계하라.

 

 

출처 : 객체지향의 사실과 오해 (조영호)

댓글()

객체지향의 사실과 오해 1 ~ 2장

Book Review|2019. 10. 27. 17:45
객체지향의 사실과 오해
국내도서
저자 : 조영호
출판 : 위키북스 2015.06.17
상세보기

객체지향의 사실과 오해를 읽고 핵심적으로 생각되는 부분만 정리해봤다.

 

1. 협력하는 객체들의 공동체

현실세계의 객체

객체지향을 실세계와 대입하는 경우가 많다. (완벽하게 동일 시 할 수는 없지만 이해하기에는 편리함)

 

그럼 객체 지향을 현실세계에 대입했을 때 커피집을 생각해보면 손님, 캐리어, 바리스타는 개개인의 객체를 의미하고 각 객체는 서로간의 협력관계가 있고 그 속에서 자신의 책임을 다한다.

 

예를 들어보면 손님은 주문을 하고 캐리어는 계산을 받고 바리스타는 커피를 만드는 역할을 한다. 그리고 서로간의 협력 관계를 통해 주문을 하고 받고 커피를 만드는 작업을 진행한다.

 

이렇듯 객체지향에서 가장 중요한 개념은 각자의 역할, 책임 그리고 서로간의 협력이다.

그 중에서 협력은 객체지향에서 중요한 개념으로 서로간의 충분히 협력적이어야하고 다른 객체에 적극적으로 도움을 요청할 정도로 열린 마음을 가져야한다. 여기서의 협력적인 의미는 다른 객체에 수동적이라는 뜻이 아니라 요청에 응답하는 것을 의미하고 어떻게 응답하는 지는 객체 스스로 결정한다. 또한 객체는 충분히 자율적인 존재로 구성된 협력 공동체이다. 협력적일 수 있지만 결국 스스로 행동할 줄 알아야한다.

 

 

객체의 특징

- 객체는 상태와 행동을 가지고 있으며 스스로 자기 자신을 책임진다.

- 객체지향이 절차지향과 다른 가장 큰점은 실행시간에 어떤 행위를 할지 결정하는 것이다. 절차지향의 컴파일 시 결정되는 부분과 가장 큰 다른 점이다.

- 객체의 자율성으로 객체가 외부의 요청을 받는 메소드와 객체가 작업을 하는 구체적인 방법을 나눔으로써 매커니즘이 나눔으로써 매커니즘이 정해지는데 이게 바로 캡슐화이다.

- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.

- 객체지향은 클래스 기반이 아니라 객체를 중심으로 바라봐야한다. 지나치게 클래스를 강조하는 프로그래밍 언어적인 관점은 객체의 캡슐화를 저해하고 클래스를 서로 강하게 결합시킨다. 어떤 클래스가 필요한가가 아니라 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가를 중요시 여기자.

- 클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하라.

 

 

2. 이상한 나라의 객체

객체는 인간이 분명하게 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것을 의미한다. 객체는 현실세계와 정확하게 같지 않고 모방하는 것이다. 그리고 그 현실세계를 기반으로 새로운 세계를 창조하는 것이 객체지향이다.

 

객체에 있는 상태를 특정시점에 객체가 가지고 있는 정보의 집합이다. 객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티로 구성된다. 프로퍼티는 단순한 값을 나타내는 속성과 다른 객체를 참조하는 Link로 구성된다. 

 

객체는 자율적인 존재로써 다른 객체가 값을 바꿀수 없다. 하지만 객체의 행동은 상태에 영향을 받고 변경시키는데 이러한 행동은 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에 메시지를 전달할 수 있다.

 

객체의 상태는 캡슐속에 감춰두고 행동만 외부로 노출시켜서 그 행동으로 상태가 변경될 수 있도록 하는 것, 객체가 주체가 되어 행동하는 것을 캡슐화라고 한다.

 

 

 

1장과 2장에서 객체지향속에서 객체의 정확한 정의를 다시 정리할 수 있었던 것 같다. 

단순하게 코드로 보여주는게 아니라 이야기로 객체지향에 대해 이해하면서 볼 수 있어서 좋았다.

좋은 책이다.

 

출처 : 객체지향의 사실과 오해 (조영호)

댓글()