flagtags / OOP-study

0 stars 0 forks source link

3장. 타입과 추상화 #3

Open j03y14 opened 6 months ago

j03y14 commented 6 months ago

지하철 노선도 디자인 예시 -> 노선도 디자인에서 가장 중요한 것은 지형을 사실적으로 묘사했냐가 아니라 연결성을 얼마나 직관적으로 표현했느냐이다.

꼭 알아야 하는 사실만 정확하게 표현하고, 몰라도 되는 정보를 무시하도록 함.

추상화를 통한 복잡성 극복

사람은 본능적으로 이해하기 쉬운 수준으로 현실을 분해하고 단순화 한다.

추상화: 불필요한 부분을 도려내가면서 사물의 본질을 드러나게 하는 과정

추상화는 목적에 따라서 달라진다.

추상화는 두가지 차원에서 이뤄진다.

기껏해야 트럼프에 불과해

모든 객체를 트럼프라는 하나의 개념으로 단순화(추상화 대신 단순화라는 표현을 쓴 이유?)

그룹으로 나누어 단순화하기

차이점을 무시하고 공통점을 찾아서 그룹핑

공통점을 기반으로 객체를 묶기 위한 그릇을 "개념"이라고 한다. 자동차, 비행기, 인간 등.. 의 개념을 적용함.

개념을 이용하면 객체를 여러 그룹으로 분류(classification)할 수 있다. 개념은 공통점을 기반으로 객체를 분류할 수 있는 체.

개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 개념의 instance라고 한다.

객체의 두번째 정의 객체란 특정한 개념을 적용할 수 있는 구체적인 사물을 의미한다. 개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 한다.

개념의 세가지 관점

이 구성요소보다 객체를 개념을 이용해 분리할 수 있다는 사실이 더 중요.

객체를 분류하기 위한 틀

어떤 객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다.

타입

타입은 개념의 정의와 동일하다.

데이터 타입도 개념이다.

객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다. 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.

동일한 책임을 수행하는 객체는 동일한 타입이다. 객체의 타입을 결정하는 것은 객체의 행동뿐이다.

=> 내부 데이터 표현이 달라도 되고, 내부 표현방식이 다를 수 있기 때문에 다형성이 생긴다.

타입의 계층

일반화 특수화 관계

타입과 타입 사이에는 트럼프와 트럼프 인간처럼 일반화/특수화 관계가 존재할 수 있다.

일반화/특수화 관계를 결정하는 것은 데이터가 아니라 행동이다.

abstract class를 extends 한 class가 데이터만 추가로 가진다면?

어떤 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성을 만족시켜야 한다.

정적모델

타입의 목적

타입을 사용하는 이유는 동적으로 변하는 객체의 복잡성을 극복하기 어렵기 때문.

타입은 시간에 따라 변하는 엘리스의 상태를 정적인 모습으로 다룰 수 있게 해준다.

타입을 사용하면 동적인 특성을 추상화 할 수 있게 한다.

kkirico commented 6 months ago

객체가 수행하는 행동에 따라 분류한다. 추상화 과정을 통해 개념(타입)을 정의한다.

  • 동일한 행동을 하는 객체는 동일한 메시지를 처리할 수 있다.
  • 객체를 분류하기 위해서는 객체가 외부에 제공하는 행동을 생각해야한다.

추상화 과정에서 일반화/특수화 는 동시에 일어난다.

3장

지하철 노선도는 목적을 중심으로 추상화 되어있다.

추상화를 통한 복잡성 극복

추상화의 목적은 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하는것이다.

추상화의 수준, 이익, 가치는 목적에 의존적이다.

추상화란,

어떤 양상 세부사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생햑하거나 감춤으로써 복잡도를 극복하는 방법이다.

복잡성을 다루기 위한 추상화는 두 차원에서 이루어진다.

  1. 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것이다.
  2. 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것이다.

객체지향과 추상화

개념: 공통점을 기반으로 객체들을 묶기 위한 그릇

개념을 이용해 객체를 여러 그룹으로 분류 할 수 있다.

객체에 어떤 개념을 적용하는 것이 가능해서 개념그룹의 일원이 될 때 객체를 그 개념의 인스턴스 라고한다.

객체란 특정한 개념을 적용할 수 있는 구체적인 사물을 의미한다. 개념이 객체에 적용됐을 때 그 객체를 개념의 인스턴스 라고 한다.

개념의 세가지 관점

심볼: 개념을 가리키는 명칭

내연: 개념의 완전한 정의, 내연의 의미를 이용해 객체가 개념에 속하는지 확인할 수 있다.

외연: 개념에 속하는 모든 객체의 집합

객체를 분류하기 위한 틀

분류란, 특정한 객체를 특정한 개념의 객체 집합에 포함시키거나 포함시키지 않는 작업을 의미한다.

적절한 분류체계는 개발자의 머릿속에 객체를 쉽게 찾고 조작할 수 있는 정신적인 지도를 제공한다.

분류는 추상화를 위한 도구다.

개념은 객체들의 복잡성을 극복하기 위한 추상화 도구다.

타입

타입은 개념이다.

타입은 개념과 동일하다. 따라서 타입이란 객체에 적용할 수 있는 아이디어나 관념을 의미한다.

객체와 타입

연산이 가능하면 숫자로 여러 문자로 구성되고, 다른 문자와 이어 붙일 수 있으면 문자로 참/거짓을 나타낼 수 있으면 논리형으로

  1. 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
  2. 객체 내부의 표현은 외부로 부터 철저히 감춰진다.

객체 내부 표현 방식이 다르더라도 어떤 객체들이 동일하게 행동한다면 그 객체들은 동일한 타입에 속한다.

객체의 타입을 결정하는 것은 객체의 행동 뿐이다. 동일한 행동: 동일한 책임: 동일한 메시지 수신 내부 데이터 표현 방식이 다르지만 동일한 메시지를 수신, 처리할 수 있다 → 다형성

행동에 따라 객체를 분류하기 위해서는 객체가 외부에 제공해야하는 행동을 먼저 생각해야한다.

  1. 객체가 외부에 제공하는 책임을 결정
  2. 책임을 수행하는 데 필요한 데이터를 외부 인터페이스 뒤로 캡슐화

타입의 계층

일반화/특수화

객체 지향에서 일반화/특수화 관계를 결정하는 것은 ‘행동’이다.

일반적인 타입은 특수한 타입보다 더 적은 수의 행동을 가지지만 더 큰 크기의 외연집합을 가진다.

슈퍼타입과 서브타입

두 타입간의 관계는 행동에 의해 결정된다.

정적 모델

타입은 추상화다.

프로그래밍 언어를 이용해 클래스를 작성하는 시점에는 시스템을 정적인 관점에서 접근하는 것이다.

실제로 애플리케이션을 실행해 객체 상태 변경을 추적하고 디버깅하는 동안에는 객체의 동적 모델을 탐험한다.

클래스

클래스는 타입이 아니다…

…결국 객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 행동이다.

이 구현 방법 중 하나가 클래스이다

kkirico commented 6 months ago

abstract class를 extends 한 class가 데이터만 추가로 가진다면?

일반화/추상화 관계에서 상동하다고 볼 수 있을 듯 하다. 클래스의 부모/상속 관계와는 완전히 동일 선상에 두고 볼 수 없는 듯 하다.

바꿔말하면, 타입의 계층 관계와 클래스의 상속 관계를 완전 동일하게 생각하지 않도록 주의해야 할 듯.

kkirico commented 6 months ago

어플리케이션의 복잡성을 극복하기 위해 추상화를 한다 공통점을 기반으로 그룹핑하는 것을 개념(타입) 이라고한다. 객체가 시간에 따라 동적으로 변하는 것을 극복하는 데 타입의 의미가 있다.

객체의 행동을 기준으로 공통점에 따라서 분류하고, 목적에 맞추어 덜어내서 타입을 정의하여 추상화한다. 타입 간에는 일반화 특수화 관계가 존재한다. 타입의 목적은 객체가 시간에 따라 동적으로 변하는것을 극복하는데 의미가 있다.