일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는 것에 관한 모든 것이라는 것을 깨닫고 나면 훌륭한 컴퓨터 프로그램을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다루는 능력이라는 것이 명확해진다.
- 키스 데블린(Keith Devlin) -
이전에 현실에 존재하는 객체들의 특징을 간추리고 요약해서 소프트웨어 객체로 추상화 할 수 있는 능력이 중요하다는 생각이 잘 못 자리잡게 된 것이라는 저자의 말을 볼 수 있었다.
결국 이 인용을 통해 분명한 저자의 의도를 알 수 있다. 현실에 존재하는 객체들의 특징을 추상화 하는 것이 아닌, 컴퓨터 소프트웨어 세계에서 하나의 객체를 창조해서 그 객체를 의인화하여 추상화하는 능력 이를 강조하는 것이라고 생각한다.
예시로 지하철 노선도가 나오는데, 1930년대 지하철 노선도는 실제로 역간의 거리를 고려해서 노선도를 만들었고, 그러다 보니 사람들이 지하철 노선도를 이해하기 어려웠다. 하지만, 1933년 해리 벡이 사실적인 지형과 축척은 무시하고 역과 역사이의 연결성에만 집중한 지하철 노선도를 만들었고, 이는 현재까지도 우리가 사용하고 있는 지하철 노선도와 동일하다.
해리 벡이 이와 같은 노선도를 만들 수 있던 이유는 사실보다는 목적성에 집중하여 만든 결과이다.
사람들은 너무 복잡하면 이해하기를 어려워하거나 포기한다. 허나 이해하려고자 하는 사람들은 이해하기 쉽고 예측 가능한 수준으로 분해하고 단순화를 통해서 이해를 하려고 시도한다.
여기서 저자의 추상화의 본질이 나온다.
현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정 이라고 한다.
책에서는 추상화를 다음과 같이 정의했다.
추상화
어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.
- 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만들기
- 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만들기
어떤 것이든 단순하게 만드는 것이 중요하다. 그리고 객체지향 패러다임에서는 추상화를 통해 이러한 복잡성을 해결하여 유연한 애플리케이션을 개발할 수 있게 해준다.
이 책에 자주 나오는 예시인 앨리스에서 추상화를 나타내기 위해 크게 여러 인물이 등장한다.
트럼프 퀸, 킹, 병사, 정원사 / 토끼
이때, 앨리스는 트럼프 그룹에 속한 모든 등장인물을 그저 트럼프 그 자체로만 바라본다. 실제로 해당 트럼프 군에 속한 각 등장인물들은 서로 다른 특성을 지니고 있지만, 모두 똑같은 그룹으로 쳐다봄으로써 단순하게 바라볼 수 있게 되었다.
여러가지 등장인물을 트럼프/토끼 단 2개로만 나누어 바라볼 수 있게 된 것이다.
이렇게 공통점을 기반으로 객체들을 묶기 위한 그릇을 개념이라고 한다.
이러한 개념을 이용해서 위처럼 객체를 여러 그룹으로 분류 할 수 있다. 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스 라고 한다.
갑자기 용어가 3개가 등장해서 혼동이 올 수 있다.
책에서는 이렇게 얘기하는 것을 지향하진 않겠지만, 개념을 인터페이스 혹은 추상 클래스, 인스턴스를 각 구상 클래스로 이해를 하면 이해하기에 단순 할 것이다.
여기서 객체에 대한 개념을 얘기 할 때 3가지 관점이 나타난다.
- 심볼 : 개념을 가리키는 의미
- 내연 : 개념의 완전한 정의, 이를 이용해 개념에 객체가 속하는지 알 수 있다.
- 외연 : 개념에 속하는 모든 객체의 집합
타입
이번 파트에서 가장 중요한 부분이라고 생각한다.
지금까지 개념에 대해서 자세하게 들여봤다. 개념을 공학자들은 다른 말로 사용하곤 하는데 이를 타입 이라고 부른다.
따라서 타입의 정의는 개념과 동일하다. 타입에는 다음과 같이 중요한 사실을 인지해야 한다.
- 타입은 데이터가 어떻게 사용되느냐에 관한 것
- 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부로부터 철저하게 감춰진다.
이러한 기존의 타입에 대한 관점을 더불어서, 객체의 타입에 가지고 오게 되면 다음과 같이 변형된다.
- 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
- 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.
이전에 했던 말을 기억하는가? 객체의 자율성을 가지고 이 책은 많은 부분을 얘기한다. 결국 여기서도 객체의 타입이라고 얘기했지만 객체의 본질인 객체의 자율성과 그 자율성을 지키기 위한 캡슐화를 강조하는 모습을 볼 수 있다.
그리고 객체는 행동으로 인해 객체의 상태를 변경하기 때문에, 책에서는 객체들이 동일하게 행동한다면 동일한 타입에 속한다고 판단한다고 한다.
이전에 identical 에 대해서 얘기를 하는가. 식별자가 같다면 상태가 다르더라도 같은 객체로 바라본다.
여기서도 같은 타입에 속한 객체가 행동만 동일하다면 서로 다른 데이터를 가질 수 있다고 한다.
그리고 여기서 기존에 객체지향언어에서 가장 중요한 특징인 다형성에 대해서 설명을 해준다. 정의는 우리가 알고 있던 것과 같다.
다형성이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 의미한다.
동일한 요청을 서로 다른 방식으로 응답을 하려면 일단, 각 객체들이 동일한 메시지를 수신할 수 있어야 하기 때문에 객체들은 동일한 타입에 속하게 된다는 것이다.
이걸 읽어보니 결국 타입이 무엇을 얘기하고자 하는지 이해가 되는가. 어떤 역할에 대해서 얘기를 하고 있는 것이다.
일반화/특수화 관계
이어서 추상화를 얘기하면서 일반화/특수화 관계에 대해서 얘기를 한다. 일반화/특수화 관계를 단순히 추상화와 구체화로 다시 비유해서 얘기할 수 있다. 여기서 일반화를 추상화, 특수화를 구체화로 이해하면 될 것이다.
우리는 이미 저 개념에 대해 익숙하다 일반적으로 구체화 된 것이 추상화 된 것보다 더 세심하고 더 많은 것들을 한다.
즉, 여기서 특수화는 일반적인 타입이 가진 모든 타입을 포함하지만 거기에 더해 자신만의 행동을 추가하는 타입이다.
이를 일반화는 슈퍼타입(Supertype), 특수화는 서브타입(Subtype) 이라고 부르기도 한다.
일반적으로 어떤 타입이 다른 타입의 서브타입이 되려면 행위적 호환성을 만족시켜야 하는데, 여기서 행위적 호환성이란 서브타입은 슈퍼타입을 대체할 수 있어야 한다는 이야기이다.
어디선가 들어본 정의인 것 같다. 바로 객체지향의 설계 5원칙 SOLID 에서 나타난 리스코프 치환 원칙에 대해서 설명하는 것이다.
타입은 우리가 개발을 하는데 있어서 많은 부분을 담당해준다. 시간에 따라 동적으로 변하는 엘리스의 상태를 정적인 모습으로 표현할 수 있게 해준다. 따라서, 타입을 이용하면 객체의 동적인 특성을 추상화를 할 수 있게 되는 것이다.
객체는 두 가지 모델을 동시에 고려하는데
첫번째는 객체가 특정 시점에 구체적으로 어떤 상태를 가지느냐인 스냅샷. 이는 객체 다이어그램 이라고도 불린다.
이러한 모델을 동적 모델이라고 한다.
두 번째는 객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 타입 모델 이다.이는 정적인 모습을 표현하기 때문에 정적 모델이라고도 한다.
우리가 개발의 관점에서 클래스를 작성하는 시점에는 시스템을 정적인 관점에서 바라보는 것이고, 객체의 상태 변경을 추적하고 디버깅하는 동안에는 객체의 동적 모델을 바라보는 것이다.
1장에서도 클래스란 도시 전설에 대해서 얘기를 했지만, 이 부분을 읽고 저자는 다음과 같은 주의사항을 전달한다.
클래스와 타입은 동일하지 않다. 클래스는 단지 타입을 구현할 수 있는 여러 구현 메커니즘 중 하나 일 뿐
객체를 불류하는 기준은 타입이며, 타입을 나누는 기준은 객체를 수행하는 행동이라는 사실만을 기억해야 한다.
즉, 매 장에서 반복적으로 말을 하고 있는 동적으로 변하는 객체의 '상태'와 상태를 변경하는 '행위'에 대해 접근하라는 것이다.
객체지향의 사실과 오해 | 조영호 - 교보문고
객체지향의 사실과 오해 | 객체지향에 대한 선입견을 버려라!『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝
product.kyobobook.co.kr
'도서 > 객체 지향의 사실과 오해' 카테고리의 다른 글
[객체지향의 사실과 오해] 4. 역할, 책임, 협력 (0) | 2023.04.25 |
---|---|
[객체지향의 사실과 오해] 2. 이상한 나라의 객체 (0) | 2023.04.22 |
[객체지향의 사실과 오해] 협력하는 객체들의 공동체 (0) | 2023.04.19 |
일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는 것에 관한 모든 것이라는 것을 깨닫고 나면 훌륭한 컴퓨터 프로그램을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다루는 능력이라는 것이 명확해진다.
- 키스 데블린(Keith Devlin) -
이전에 현실에 존재하는 객체들의 특징을 간추리고 요약해서 소프트웨어 객체로 추상화 할 수 있는 능력이 중요하다는 생각이 잘 못 자리잡게 된 것이라는 저자의 말을 볼 수 있었다.
결국 이 인용을 통해 분명한 저자의 의도를 알 수 있다. 현실에 존재하는 객체들의 특징을 추상화 하는 것이 아닌, 컴퓨터 소프트웨어 세계에서 하나의 객체를 창조해서 그 객체를 의인화하여 추상화하는 능력 이를 강조하는 것이라고 생각한다.
예시로 지하철 노선도가 나오는데, 1930년대 지하철 노선도는 실제로 역간의 거리를 고려해서 노선도를 만들었고, 그러다 보니 사람들이 지하철 노선도를 이해하기 어려웠다. 하지만, 1933년 해리 벡이 사실적인 지형과 축척은 무시하고 역과 역사이의 연결성에만 집중한 지하철 노선도를 만들었고, 이는 현재까지도 우리가 사용하고 있는 지하철 노선도와 동일하다.
해리 벡이 이와 같은 노선도를 만들 수 있던 이유는 사실보다는 목적성에 집중하여 만든 결과이다.
사람들은 너무 복잡하면 이해하기를 어려워하거나 포기한다. 허나 이해하려고자 하는 사람들은 이해하기 쉽고 예측 가능한 수준으로 분해하고 단순화를 통해서 이해를 하려고 시도한다.
여기서 저자의 추상화의 본질이 나온다.
현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정 이라고 한다.
책에서는 추상화를 다음과 같이 정의했다.
추상화
어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.
- 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만들기
- 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만들기
어떤 것이든 단순하게 만드는 것이 중요하다. 그리고 객체지향 패러다임에서는 추상화를 통해 이러한 복잡성을 해결하여 유연한 애플리케이션을 개발할 수 있게 해준다.
이 책에 자주 나오는 예시인 앨리스에서 추상화를 나타내기 위해 크게 여러 인물이 등장한다.
트럼프 퀸, 킹, 병사, 정원사 / 토끼
이때, 앨리스는 트럼프 그룹에 속한 모든 등장인물을 그저 트럼프 그 자체로만 바라본다. 실제로 해당 트럼프 군에 속한 각 등장인물들은 서로 다른 특성을 지니고 있지만, 모두 똑같은 그룹으로 쳐다봄으로써 단순하게 바라볼 수 있게 되었다.
여러가지 등장인물을 트럼프/토끼 단 2개로만 나누어 바라볼 수 있게 된 것이다.
이렇게 공통점을 기반으로 객체들을 묶기 위한 그릇을 개념이라고 한다.
이러한 개념을 이용해서 위처럼 객체를 여러 그룹으로 분류 할 수 있다. 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스 라고 한다.
갑자기 용어가 3개가 등장해서 혼동이 올 수 있다.
책에서는 이렇게 얘기하는 것을 지향하진 않겠지만, 개념을 인터페이스 혹은 추상 클래스, 인스턴스를 각 구상 클래스로 이해를 하면 이해하기에 단순 할 것이다.
여기서 객체에 대한 개념을 얘기 할 때 3가지 관점이 나타난다.
- 심볼 : 개념을 가리키는 의미
- 내연 : 개념의 완전한 정의, 이를 이용해 개념에 객체가 속하는지 알 수 있다.
- 외연 : 개념에 속하는 모든 객체의 집합
타입
이번 파트에서 가장 중요한 부분이라고 생각한다.
지금까지 개념에 대해서 자세하게 들여봤다. 개념을 공학자들은 다른 말로 사용하곤 하는데 이를 타입 이라고 부른다.
따라서 타입의 정의는 개념과 동일하다. 타입에는 다음과 같이 중요한 사실을 인지해야 한다.
- 타입은 데이터가 어떻게 사용되느냐에 관한 것
- 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부로부터 철저하게 감춰진다.
이러한 기존의 타입에 대한 관점을 더불어서, 객체의 타입에 가지고 오게 되면 다음과 같이 변형된다.
- 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
- 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.
이전에 했던 말을 기억하는가? 객체의 자율성을 가지고 이 책은 많은 부분을 얘기한다. 결국 여기서도 객체의 타입이라고 얘기했지만 객체의 본질인 객체의 자율성과 그 자율성을 지키기 위한 캡슐화를 강조하는 모습을 볼 수 있다.
그리고 객체는 행동으로 인해 객체의 상태를 변경하기 때문에, 책에서는 객체들이 동일하게 행동한다면 동일한 타입에 속한다고 판단한다고 한다.
이전에 identical 에 대해서 얘기를 하는가. 식별자가 같다면 상태가 다르더라도 같은 객체로 바라본다.
여기서도 같은 타입에 속한 객체가 행동만 동일하다면 서로 다른 데이터를 가질 수 있다고 한다.
그리고 여기서 기존에 객체지향언어에서 가장 중요한 특징인 다형성에 대해서 설명을 해준다. 정의는 우리가 알고 있던 것과 같다.
다형성이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 의미한다.
동일한 요청을 서로 다른 방식으로 응답을 하려면 일단, 각 객체들이 동일한 메시지를 수신할 수 있어야 하기 때문에 객체들은 동일한 타입에 속하게 된다는 것이다.
이걸 읽어보니 결국 타입이 무엇을 얘기하고자 하는지 이해가 되는가. 어떤 역할에 대해서 얘기를 하고 있는 것이다.
일반화/특수화 관계
이어서 추상화를 얘기하면서 일반화/특수화 관계에 대해서 얘기를 한다. 일반화/특수화 관계를 단순히 추상화와 구체화로 다시 비유해서 얘기할 수 있다. 여기서 일반화를 추상화, 특수화를 구체화로 이해하면 될 것이다.
우리는 이미 저 개념에 대해 익숙하다 일반적으로 구체화 된 것이 추상화 된 것보다 더 세심하고 더 많은 것들을 한다.
즉, 여기서 특수화는 일반적인 타입이 가진 모든 타입을 포함하지만 거기에 더해 자신만의 행동을 추가하는 타입이다.
이를 일반화는 슈퍼타입(Supertype), 특수화는 서브타입(Subtype) 이라고 부르기도 한다.
일반적으로 어떤 타입이 다른 타입의 서브타입이 되려면 행위적 호환성을 만족시켜야 하는데, 여기서 행위적 호환성이란 서브타입은 슈퍼타입을 대체할 수 있어야 한다는 이야기이다.
어디선가 들어본 정의인 것 같다. 바로 객체지향의 설계 5원칙 SOLID 에서 나타난 리스코프 치환 원칙에 대해서 설명하는 것이다.
타입은 우리가 개발을 하는데 있어서 많은 부분을 담당해준다. 시간에 따라 동적으로 변하는 엘리스의 상태를 정적인 모습으로 표현할 수 있게 해준다. 따라서, 타입을 이용하면 객체의 동적인 특성을 추상화를 할 수 있게 되는 것이다.
객체는 두 가지 모델을 동시에 고려하는데
첫번째는 객체가 특정 시점에 구체적으로 어떤 상태를 가지느냐인 스냅샷. 이는 객체 다이어그램 이라고도 불린다.
이러한 모델을 동적 모델이라고 한다.
두 번째는 객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 타입 모델 이다.이는 정적인 모습을 표현하기 때문에 정적 모델이라고도 한다.
우리가 개발의 관점에서 클래스를 작성하는 시점에는 시스템을 정적인 관점에서 바라보는 것이고, 객체의 상태 변경을 추적하고 디버깅하는 동안에는 객체의 동적 모델을 바라보는 것이다.
1장에서도 클래스란 도시 전설에 대해서 얘기를 했지만, 이 부분을 읽고 저자는 다음과 같은 주의사항을 전달한다.
클래스와 타입은 동일하지 않다. 클래스는 단지 타입을 구현할 수 있는 여러 구현 메커니즘 중 하나 일 뿐
객체를 불류하는 기준은 타입이며, 타입을 나누는 기준은 객체를 수행하는 행동이라는 사실만을 기억해야 한다.
즉, 매 장에서 반복적으로 말을 하고 있는 동적으로 변하는 객체의 '상태'와 상태를 변경하는 '행위'에 대해 접근하라는 것이다.
객체지향의 사실과 오해 | 조영호 - 교보문고
객체지향의 사실과 오해 | 객체지향에 대한 선입견을 버려라!『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝
product.kyobobook.co.kr
'도서 > 객체 지향의 사실과 오해' 카테고리의 다른 글
[객체지향의 사실과 오해] 4. 역할, 책임, 협력 (0) | 2023.04.25 |
---|---|
[객체지향의 사실과 오해] 2. 이상한 나라의 객체 (0) | 2023.04.22 |
[객체지향의 사실과 오해] 협력하는 객체들의 공동체 (0) | 2023.04.19 |