📁
til
  • TIL(Today I Learned)
  • javascript
    • value-number-string-boolean-null-undefined
    • primitive-reference
    • Hoisting
    • Prototypes in Javascript
    • this
    • prototype
    • 콜백함수 (Callback function)
    • 함수의 호출
    • 자료구조 new keyword
    • closure
    • Promise
    • event-loop
    • array-object
    • 객체
    • Arguments
    • higher order function
    • operators-function-control-flow
    • 객체 생성 패턴 3가지
    • Javascript scopes
    • Functional Programming
    • Design Patterns
    • 데이터 타입
    • Object 객체
    • 표준 내장 객체의 확장
    • 참조
    • 함수
    • 상속(Inheritance)
    • this - 'this'를 사용하는 해당 함수를 '어떻게' 실행하느냐에 따른 4가지 this 정의
    • 전역객체(Global object)
    • 객체 지향 프로그래밍
    • The 'new' keyword - Object Creation in JavaScript
  • javascript-api
    • Number
      • Number.MAX_VALUE
      • Number.isInteger
      • Number.NEGATIVE_INFINITY
      • Number.isNaN()
      • Number.POSITIVE_INFINITY
      • Number.parseFloat
      • Number.EPSILON
      • number.toExponential
      • Number.MAX_SAFE_INTEGER
      • Number1 - 자연수, 정수, 10진수, 2진수, 부동소수점, 실수
      • Number.isSafeInteger()
      • Number.MIN_VALUE
      • Number.parseInt
      • Number.NaN
      • Number.isFinite()
      • Number.MIN_SAFE_INTEGER
      • toFixed
    • string.split
    • String.fromCodePoint
    • string.trimEnd
    • string.padStart
    • string.@@iterator
    • String.fromCharCode
    • string.toUpperCase
    • string.codePointAt
    • string.toLowerCase()
    • string.toString
    • string.includes
    • string.replace()
    • string.charAt
    • String.lastIndexOf
    • string.slice
    • string.search
    • string.padEnd
    • string.substring
    • string.length
    • string.trim
    • string.localeCompare
    • String.indexOf
    • string.endsWith
    • string.valueOf
    • String.raw
    • string.matchAll()
    • string.repeat
    • string.match
    • String.prototype
    • string.startsWith
    • string.charCodeAt
    • string.trimStart
    • string.concat
    • string.toLocaleUpperCase()
    • string.toLocaleLowerCase
    • String
  • learn-node
    • debugger
    • Tip
  • schema-design
    • Database Schema Design
    • Database Schema Design
  • react
    • LifeCycle
    • redux
    • Context API
    • 함수형 컴포넌트와 클래스, 어떤 차이가 존재할까?
    • Hooks과 useEffect 사용해 보기
    • Route
    • async wait 사용하기
    • Hooks API Reference
    • context
    • npm uninstall 하는법
    • test 만들기
  • tip
    • 클린코드
    • BxSlider로 텍스트 흐르는 효과 만들기
  • javascript30
    • Event Capture, Propagation, Bubbling and Once
    • Object and Arrays - Reference VS Copy
  • typescript
    • 우아한 타입스크립트 2부
    • The Basic Cheatsheet
    • TypeScript
    • Type Guards and Differnetiating Types
    • 우아한 타입스크립트
    • Generics
  • git-from-the-hell
    • git
    • init-status-add-commit-log-stage-repository
    • log-diff
    • 머지 후 branch 삭제하기
    • 지옥에서 온 Git
    • reset-revert
    • develop branch 를 pull 하고 싶을때
  • conference-and-seminar
    • 모던 프론트엔드 개발환경의 이해
  • fire-base
    • Firebase .gitignore
  • vanillacoding
    • Data Structures
    • Sorting Algorithms - part 1
    • Promise
    • class
    • 04.quiz
    • 07.event-loop
    • Design Patterns
    • OOP (Object Oriented Programming)
  • etc
    • 알고리즘 코드리뷰
    • 스스로 공부하는 법
    • 바닐라코딩 수강 후기
    • async 과제 후기 - 비동기, 동기, 클로저, 배열과 객체
    • 유용한 사이트
  • algorithm
    • The Supermarket Queue
    • Find the odd int
    • The Office III - Broken Photocopier
    • Directions Reduction
    • The Office II - Boredom Score
    • Divisible Sum Pairs
    • Codewars 이용자 솔루션 모음
    • Shortest Word
    • find key
    • Two Sum
    • Simple Pig Latin
  • Book
    • the essence of object-orientation
      • 타입과 추상화
      • 객체 지도
      • 이상한 나라의 객체
      • 추상화 기법
      • 05. 책임과 메시지
      • 07.함께 모으기
      • 04. 역할, 책임, 협력
      • 협력하는 객체들의 공동체
  • ecma-script2015
    • Object Literal Upgrades
    • default-parameter-template-literals-arrow-functions
    • spread-operator-rest-param
    • let-const-rest-parameter-spread-operator-destructuring
  • http
    • 웹 브라우저에 URL을 입력했을 때 어떻게 웹 페이지가 보여질까?
  • jest
    • toThrow(error?)
  • data-structures
    • Data Structures
  • express
    • express generator
    • CORS
  • css-flexible-box-layout
    • flex 해버렸지 뭐야
  • git
    • Git
  • mongodb
    • MongoDB
  • markdown
    • use-markdown
  • cmder
    • cmd 명령어 모음
  • debug
    • trackClicksEx function error
  • npm
    • NPM TOKEN 설정하기
  • storybook
    • Storybook
  • sort
    • Sorting Algorithms - part 1
  • javascript-koans
    • Javascript Koans 오답노트
  • rxjs
    • Rx.js
  • dom-elements
    • HTML Element
  • redux-toolkit
    • Redux Toolkit
  • github-actions
    • GitHub Actions
  • redux-middleware
    • redux middleware
  • rest
    • rest
  • css-rendering
    • 코드 스피츠 - CSS Rendering 1회차 2/2
    • 코드 스피츠 - CSS Rendering 1회차 1/2
  • you-dont-know-js
    • 타입
  • server
    • # shutdown local server
  • semantic-versioning
    • Semantic Versioning 2.0.0
Powered by GitBook
On this page

Was this helpful?

  1. Book
  2. the essence of object-orientation

타입과 추상화

그래서 결국 타입은 추상화다.

KEYWORDS

  • 추상화

  • 타입

추상화

현상은 복잡하다. 법칙은 단순하다. 버릴 게 무엇인지 알아내라. (리처드 파인만)

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

  1. 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것이다. -> 일반화 / 개념(concept)

  2. 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것이다.

-> 추상화의 목적은 복잡성을 이해가이 쉬운 수준으로 단순화라는 것

차이점을 무시한 채 유사성을 기반으로 추상화해서 바라보고 있는 것이다.

명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 객체지향 패러다임에서는 객체라고 한다.

개념(concept)

  • 공통점을 기반으로 객체들을 묶기 위한 그릇을 개념이라고 한다.

  • 공통점을 기반으로 객체를 분류할 수 있는 일종의 체라고 할 수 있다.

추상화의 두 가지 차원 중 첫번째 차원인 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것이다.인 일반화를 적용한 결과이다.

인스턴스(instance)

각 객체는 특정한 개념을 표현하는 그룹의 일원으로 포함된다.

개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스라고 한다.

개념의 세 가지 관점

  • 심볼(symbol): 개념을 가리키는 간략한 이름이나 명칭 -> 트럼프

  • 내연(intension): 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인할 수 있다 -> 트럼프에 대한 설명

  • 외연(extension): 개념에 속하는 모든 객체의 집합(set) -> 정원사, 병사, 신하, 왕자와 공주, 하객으로 참석한 왕과 왕비들, 하트 잭, 하트 왕과 하트 여왕

개념이 이 세 가지로 구성돼 있다는 사실보다 개념을 이용해 객체를 분류할 수 있다는 사실이 더 중요하다.

분류

객체에 어떤 개념을 적용할 것인지를 결정하는 것은 결국 객체들을 개념에 따라 분류하는 것과 동일하다.

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

분류는 객체지향의 가장 중요한 개념 중 하나다. 어떤 객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다. -> 직관적으로 분류하라!

타입

타입의 정의는 개념의 정의와 완전히 동일하다.

타입은 공통점을 기반으로 객체들을 묶기 위한 틀이다. 타입은 개념과 마찬가지로 심볼, 내연, 외연을 이용해 서술할 수 있으며 타입에 속하는 객체 역시 타입의 인스턴스라고 한다.

데이터 타입

컴퓨터 안에 살아가는 데이터를 목적에 따라 분류하기 시작하면서 프로그래밍 언어 안에는 서서히 타입 시스템(type system)이 자라나기 시작했다.

  1. 타입은 데이터가 어떻게 사용되느냐에 관한 것이다.

  2. 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부로부터 철저하게 감춰진다.

객체와 타입

객체를 일종의 데이터처럼 사용한다.

  1. 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.

  2. 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.

객체를 타입으로 분류할 때 사용해야 하는 기준은 행동이 우선이다.

그 객체가 타입에 속한 다른 객체와 동일한 행동을 하기만 하면 된다.

객체의 타입을 결정하는 것은 객체의 행동뿐이다.

같은 타입에 속한 객체는 행동만 동일하다면 서로 다른 데이터를 가질 수 있다.

동일한 행동이란 동일한 의미하며, 동일한 책임이란 동일한 메시지 수신을 의미한다.

다형성

동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 뜻한다.

다형적인 객체들은 동일한 타입(또는 타입 계층)에 속하게 된다.

데이터 주도 설계

데이터를 먼저 결정하고 객체의 책임을 결정하는 방법은 유연하지 못한 설계

책임 주도 설계

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

데이터 주도 설계의 단점을 보안하기 위한 설계

일반화/특수화(generalization/specialization)의 관계

일반화와 특수화는 동시에 일어난다.

더 특수하다는 것은 일반적인 개념보다 범위가 더 좁다는 것을 의미한다.

객체지향에서는 일반화/특수화 관계를 결정하는 것은 객체의 상태를 표현하는 데이터가 아니라 객체가 외부에 제공하는 행동이라는 것이다.

한 타입은 다른 타입보다 더 특수하게 행동해야 하고 반대로 한 타입은 다른 타입보다 더 일반적으로 행동해야 한다.

일반적인 타입이란

특수한 타입이 가진 모든 행동들 중에서 일부 행동만 가지는 타입을 가리킨다.

특수한 타입이란

일반적인 타입이 가진 모든 타입을 포함하지만 거기에 더해 자신만의 행동을 추가하는 타입을 가리킨다.

타입의 내연을 의미하는 행동의 가짓수와 외연을 의미하는 집합의 크기는 서로 반대이다.

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

슈퍼타입(Supertype)과 서브타입(Subtype)

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

타입의 목적

타입은 시간에 따라 동적으로 변하는 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 한다.

그래서 결국 타입은 추상화다

타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다. 결국 타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법인 것이다.

스냅샷

하나의 객체가 특정 시점에 구체적으로 어떤 상태를 가지느냐

객체 다이어그램

객체지향 모델링을 위한 표준 언어인 UML에서 스냅샷

동적 모델

스냅샷처럼 실제로 객체가 살아 움직이는 동안 상태가 어떻게 변하고 어떻게 행동하는지를 포착하는 것

타입 모델

다른 하나는 객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 것

정적 모델

동적으로 변하는 객체의 상태가 아니라 객체가 속한 타입의 정적인 모습을 표한

클래스

정적인 모델은 클래스를 이용해 구현된다. 따라서 정적인 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것이다.

객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이라 사실

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

클래스는 타입을 구현하기 위해 프로그래밍 언어에서 제공하는 구현 메커니즘이다.

Previousthe essence of object-orientationNext객체 지도

Last updated 4 years ago

Was this helpful?