일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 베주계수
- cicd
- while과 two-pointer
- 동일성과 동등성
- islowercase()
- isuppercase()
- stringbuilder의 reverse()
- Git사용법
- git 컨벤션
- 자바 유클리드
- 유클리드호제법
- 스프링뼈대
- 프로그래머스 레벨1
- 모던자바
- ineer join
- 자바 최소공배수
- GithubActions
- 최소공배수
- string과 stringbuilder
- sql 데이터형 변환
- StringBuilder
- Github Actions
- 스프링
- string
- 래퍼타입
- 자바 스트링
- 스프링환경설정
- addDoc
- toLowerCase()
- 최대공약수
- Today
- Total
주노 님의 블로그
객체지향의 사실과 오해 3장 타입과 추상화 본문
아래 내용은 객체지향의 사실과 오해 (조영호 저) 에서 나온 내용을 정리하고, 제 지능에 맞게 다듬어진 글입니다.
세줄요약
1. 개념은 객체를 분류하고 이해하기 위한 틀로, 이름(심볼), 정의(내연), 그리고 구성원(외연)을 통해 표현된다.
2. 객체지향 설계에서는 객체의 행동과 책임을 기준으로 타입(또는 개념)을 결정하며, 이를 통해 일반화/특수화 관계가 형성된다.
3. 클래스는 정적 모델로 객체의 타입을 구현하는 도구이고, 실행 중 변화하는 객체의 상태와 행동은 동적 모델로 관리된다.
지하철 노선도의 역사
초창기 지하철 노선도는 위치와 거리를 실제 지형과 비례하도록 그려졌답니다.
이 방식은 지리적 정확성을 강조했지만, 복잡해지는 지하철 노선에서는 비효율적이고 혼란스러워지는 문제가 있었습니다.
해리 벡은 기존의 지리적 정확성을 목적 중심의 추상화로 대체하며, 현재 우리가 사용하는 지하철 노선도의 기초를 만들었습니다.
추상화
추상화는 어떤 양상, 세부 사항, 구조를 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감추는 방법입니다.
Kramer의 설명에 의하면 복잡성을 다루기 위해 추상화는 두 차원에서 이뤄진다고 합니다.
첫 번째 차원은 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것.
두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것.
모든 경우에서 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것입니다.
객체지향 패러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복합니다.
그룹을 나누어서 단순화하기.
앨리스는 하트 여왕의 행렬과 토끼가 들어오는것을 보고 '기껏해야 트럼프에 불과해, 무서워 할 필요 없어. 라고 말을 하였습니다
위 내용을 본다면 앨리스는 정원에 있는 다양한 객체들을 관찰하며, 하얀 토끼를 제외한 모든 객체를 '트럼프'라는 하나의 개념으로 단순화했습니다.
우리는 명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 객체지향 패러다임 에서는 객체라고 불렀었었습니다.
근데, 왜 앨리스는 이 다양한 인물들을 ‘트럼프’라는 한 단어로 줄여 지칭할 수 있을까요?
그 이유는 정원에 있는 인물들이 공통적으로 트럼프라고 했을 때 떠오르는 일반적인 외형과 행동 방식을 지니고 있기 때문입니다.
공통점만을 취해 트럼프라는 개념으로 단순화한 것은 추상화의 일종입니다.
왜 그룹화를 해야하는가?
현실 세계에서 수많은 객체들을 개별적으로 처리하기에는 인간의 인지 능력이 한계가 있습니다.
따라서, 인간은 공통적인 특성을 기준으로 객체들을 여러 그룹으로 묶어 상황을 단순화합니다.
공통점을 기반으로 객체들을 묶기 위한 그릇을 개념(concept)이라고 합니다.
객체는 특정한 개념을 표현하는 그룹의 일원으로 포함될 수 있습니다.
객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스(instance)라고 합니다.
(예를들어. 동물이라는 개념(그룹)이 있고, 개라는 객체가 그 개념에 속할수 있다면, 개는 동물의 인스턴스입니다.)
객체란 특정한 개념을 적용할 수 있는 구체적인 사물을 의미한다. 개념이 객체에 사용했을 때 객체를 개념의 인스턴스라고 한다.
개념이란 객체를 분류할 수 있는 틀을 제공합니다.
앨리스가 주변의 복잡한 군상들을 '트럼프'라는 하나의 개념으로 단순화한 것처럼, 개념은 현실의 객체들을 분류하고 이해할 수 있도록 돕습니다.
개념의 세 가지 관점
- 심볼(Symbol):
- 개념을 가리키는 간략한 이름이나 명칭입니다.
- 예: '트럼프'는 앨리스 이야기에서 이 개념을 지칭하는 심볼입니다.
- 내연(Intension):
- 개념의 완전한 정의를 나타냅니다.
- 내연을 통해 객체가 해당 개념에 속하는지 여부를 확인할 수 있습니다.
- 예: "몸이 납작하고, 두 손과 두 발이 네모난 몸의 귀퉁이에 달려 있다"는 트럼프의 내연입니다.
- 외연(Extension):
- 개념에 속하는 모든 객체의 집합입니다.
- 예: 정원사, 병사, 신하, 하트 여왕과 같은 모든 객체는 트럼프의 외연에 속합니다.
개념을 구성하는 심볼. 내연. 외연은 객체의 분류 방식에 대한 지침을 제공합니다.
개념을 이용해 객체를 분류할 수 있다는 사실이 더 중요한점!
예를들어
정원사, 병사, 하트 여왕의 공통점을 기반으로 '트럼프'라는 개념으로 묶는것은 첫번째 차원의 일반화.
트럼프 객체에서 외형적 공통점(몸이 납작하고, 네모난 몸 모서리에 손발이 있음)만을 강조하고, 개인적인 차이는 무시는 두번째 차원의 단순화 입니다.
객체 분류의 중요성
분류란 객체에 특정 개념을 적용하는 작업입니다.
이를 통해 객체를 적절한 집합의 멤버로 포함시키는 과정입니다.
객체를 적절한 개념으로 분류하는 것은 객체지향 설계의 품질을 결정합니다.
객체를 개념에 따라 적절하게 분류하지 못한 애플리케이션은, 유지보수가 어렵고 변경에 취약하게 됩니다.
(자전거와 자동차를 같은 개념으로 분류한다면?? move메서드를 상속받을수 있지만,
연료주입 이라는 메서드를 추가한다면??)
반면에 객체를 적절한 개념에 따라 분류한 애플리케이션은 유지보수가 용이하고 변경에 유연하게 대처할 수 있습니다.
타입과 개념의 관계
타입이란 개념과 동일한 정의를 가지며, 공통점을 기반으로 객체를 묶기 위한 틀입니다.
타입은 개념과 마찬가지로 심볼, 내연, 외연을 통해 정의됩니다.
(심볼 - int, 내연 - +, *, - 등이 수행가능함 , 외연 - {1, 2, 3, 4})
타입은 공통 특성을 기반으로 데이터를 그룹화합니다.
타입에 속하는 데이터는 타입의 인스턴스라고 불립니다.
데이터 타입
초기 컴퓨터 메모리는 0과 1로 이루어진 비정형적 데이터를 저장했으나, 이를 정리하고 관리하기 위해 데이터 타입이라는 개념이 도입되었습니다(int String boolean).
타입 시스템은 데이터가 잘못 사용되지 않도록 제약을 부과하는 역할을 합니다.
타입의 두 가지 중요한 사실 (Cardelli, 1985)
첫째. 타입은 데이터가 어떻게 사용되는지에 관한 것입니다.
데이터의 타입은 데이터에 적용할 수 있는 작업으로 정의됩니다.
둘째. 타입에 속한 데이터를 어떻게 표현하는지는 철저히 감춰집니다.
(110111을 알 필요 없이 int 타입이라고 기술되는것)
표현 방식은 몰라도 데이터를 사용하는 데 지장이 없습니다.
객체와 타입
객체에서 가장 중요한 것은 행동입니다.
객체를 설계할 때, 객체가 이웃 객체와 협력하기 위해 어떤 행동을 해야 하는지 결정하는 것이 핵심입니다.
이는 객체의 책임을 정의하는 과정이며, 객체지향 설계의 본질입니다.
데이터 타입처럼
첫째. 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
어떤 객체들이 동일한 행동을 수행할 수 있다면 그 객체들은 동일한 타입으로 분류될 수 있다.
둘째. 객체의 내부 표현은 감춰진다.
객체의 행동을 가장 효과 적으로 수행할 수만 있다면 객체의 내부의 상태를 어떤 방식으로,표현하더라도 무방하다.
객체의 타입과 행동 중심 설계
객체의 타입은 객체가 수행하는 행동에 의해 결정됩니다.
결과적으로 동일한 책임을 수행하는 객체는 동일한 타입으로 분류될 수 있습니다.
객체의 타입을 결정하는 것은 객체의 행동뿐이다, 데이터가 어떤것인지는 신경쓰지 않습니다.
같은 타입에 속한 객체는 행동만 동일하다면 서로 다른 데이터를 가질 수 있습니다.
동일한 타입에 속한 객체는 내부의 데이터 표현 방식이 다르더라도 동일한 메시지를 수신하고 이를 처리할 수 있습니다.
위 내용은 객체지향의 다형성에 의미를 부여할 수 있습니다.
다형성이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 뜻합니다.
행동만이 고려 대상이라는 말은
외부에는 데이터를 보여주지 않아도 된다.!
즉, 외부에 데이터를 감춰야 한다는 것을 의미합니다
따라서 훌륭한 객체지향 설계는 외부에 행동만을 제공하고,
데이터를 책임을 수행하는 데 필요한 외부 인터페이스 뒤로 캡슐화해야 합니다.
타입의 계층
앨리스가 진짜 그 사람들을 트럼프로 봤을까?
앨리스가 치료를 목적으로 정신건강의학과를 방문한적이 없다면, 그냥 트럼프와 비슷한 몇가지의 특징을 공유했기때문에, '트럼프'라고 불렀을 뿐입니다, 정확하게 말하면 '트럼프 인간'으로 봤습니다.
트럼프와 비슷한데 왜 트럼프 인간이라고 불렀을까요?
등장인물들의 외양은 트럼프와 유사하지만 행동 자체는 트럼프와 완벽하게 동일하지 않기 때문입니다.
이 두 개념 사이의 관계를 일반화/특수화〈generalization/specialization) 관계라고 한다.
트럼프는 트럼프 인간보다 더 일반적인 개념(상위개념)
트럼프 인간 타입은 트럼프 타입의 하위 개념입니다.
일반화/특수화는 행동에 관한 것이라고 할 수 있는데요
객체의 일반화/특수화 관계를 결정하는 것은 데이터(상태)가 아니라 '행동'입니다.
트럼프 카드와 트럼프 인간은 겉보기 상태(데이터)는 비슷할 수 있습니다.
하지만 트럼프 인간은 걸을 수 있고, 말할 수 있는 행동을 제공합니다.
(일반화/특수화 관계의 예)
- 동물 → 포유류 → 고양이
- 탈것 → 자동차 → 스포츠카
- 트럼프 → 트럼프 인간
내연을 의미하는 행동의 가짓수와 외연을 의미하는 집합의 크기는 서로 반대라는 사실이다.
(내연 : 한 타입이 제공하는 행동의 수(하위타입이면 더 많은 행동을하게됨)
외연 : 집합의 수(하위 타입일수록 적어질것임))
슈퍼타입과 서브타입
일반적인 타입을 슈퍼타입(Supertype)이라고 하고 좀 더 특수한 타입을 서브 타입(Subtype)이라고 한다.
어떤 타입이 다른 타입의 서브타입이 되려면, 반드시 "행위적 호환성"을 만족해야 합니다.
(슈퍼타입의 모든 행동이 서브타입에서도 동작 할 수 있어야 한다는뜻.)
일반적으로 서브타입은 슈퍼타입의 행위와 호환되기 때문에 서브타입은 슈퍼타입을 대체할 수 있어야 한다.
[Liskov 1988], (리스코프 치환원칙)
일반화는 추상화를 위한 도구입니다.
추상화의 두 번째 차원은 불필요한 세부 사항을 제거하고 중요한 부분을 강조하는 것입니다.
객체지향 패러다임에서 일반화/특수화 계층은 추상화를 효과적으로 활용하는 대표적인 사례입니다.
동적 모델, 정적 모델
왜 타입을 사용해야 할까요?
타입은 시간에 따라 동적으로 변하는 객체의 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 해주기 떄문입니다.
객체는 실행중 변화하지만, 타입은 변화하지 않기 때문입니다.
동적으로 변화하는 객체의 상태를 단순화하여 정적인 모습으로 다룰 수 있다?
결국 타입은 추상화입니다.
객체를 생각할때 두가지 모델을 동시에 고려하는데 그 두가지가 동적모델, 정적모델인것을 알수 있었습니다
동적 모델: 객체가 실행 중에 상태가 변하고 행동하는 과정을 포착하는 것
정적 모델: 시간과 독립적으로 객체를 표현하는 방식.
우리가 왜 두가지 모습을 다룰까요?
클래스를 작성하는 시점에는 시스템을 정적인 관점에서 접근하지만,
애플리케이션을 실행해 객체의 상태 변경을 추적하고 디버깅하는과정은 동적 모델을 관리할겁니다.
클래스
정적인 모델(Static Model)은 클래스를 이용해 구현됩니다.
클래스는 타입을 구현하는 도구이지만, 클래스 와 타입은 동일한것이 아니라는걸 다시 알아주셔야합니다.
타입은 객체를 분류하기위해 사용하는 개념, 클래스는 타입을 구현할수 있는 여러 구현 매커니즘 중 하나입니다.
객체지향에서 중요한 것은 동적으로 변하는 객체의 ‘상태’와 상태를 변경하는 ‘행동'입니다.