Ch03. 개체지향 프로그래밍의 필요성
구조체의 한계
- 데이터의 비인간화
- 데이터가 많아지면 관리가 힘듦
- 실수할 여지가 증가
- 보완책 : 구조체 사용
- 한계1 : 여전히 데이터왕 동작이 분리되어 있음
- 한계2 : 어떤 구조체가 어떤 함수랑 연관 있는지 찾기 복잡함
사람이 세상을 인지하는 법
- 사람은 세상을 물체(object)의 집합으로 인지
- 물체는 상태를 가질 뿐만 아니라 동작도 할 수 있음
- 상태와 동작
- 상태 - 변수
- 동작 - 함수
- 모든 것이 개체는 아니다!
개체지향 프로그래밍
-
OOP
-
프로그래밍을 구성하는 기본 요소를 개체로 보려는 노력
-
OOP에서 프로그램이란?
- 상호작용하는 개체들의 집합
- 절차적 프로그래밍은 실행할 명령어의 목록을 프로그램으로 봤음
-
절차적 프로그래밍은 매우 객관적
- 어떤 프로그램이라도 최종적으로는 절차적으로 돔
-
개체지향 프로그램은 사람이 기준
- 매우 주관적
OOP 토론 시 피해야 할 사람
- 처음 듣는 주장을 하며 '그건 올바른 OOP가 아니야!'라는 사람
- '이건 순수(pure) OOP 언어가 아니야'라는 사람
- '모든 프로그램은 OOP로 만들어야 해!'라는 사람
- ~한 ~가 이리 말했으니 너는 틀려!'라는 사람
- '이 방법만 따르면 문제가 해결되!'라는 사람
- 개체(object)
- 개체란 서로 연관 있는 상태와 동작을 가지고 있다
- 사람들은 기본적으로 세상을 개체들의 모음으로 본다
OOP의 특성
- 캡슐화(encapsulation), 상속(inheritance), 다형성(polymorphism)
- 데이터 추상화(data abstraction)
- 연관(association), 컴포지션(composition), 집합(aggregation)
- 캡슐화
- 데이터와 그 데이터에 작용하는 메서드를 하나로 묶음
- 정보 숨기기(data hiding): 개체 안에 있는 데이터를 외부로부터 보호
- 상속
- 이미 존재하는 개체를 기반으로 확장된 개체를 만드는 방법
- 엄밀히 말하면 클래스
- 확장된 개체
- 기존의 개체에 속한 데이터와 동작을 모두 물려 받음
- 여기에 다른 데이터나 동작을 추가할 수 있음
- 실용적 용도: 코드 중복을 막음
- 사람에게는 점진적 학습이 가장 효율적
- 다형성
-
많은 사람들이 OOP의 핵심이라 여기는 특징
-
같은 지시를 내렸는데 다른 종류의 개체가 동작을 달리하는 것
- 같은 지시: 동일한 함수 시그내처 호출
-
절차적 언어에서 이런 일을 하려면 if문을 사용해야 했음
-
어떤 함수 구현이 실행될지는 실행 중에 결정됨
- 늦은 바인딩(late binding)
-
일반적인 함수 호출은 이른 바인딩(early binding)
- 컴파일 중 결정
-
다형성의 혜택을 받으려면 상속 관계가 필요
- 부모 개체에서 함수 시그내처를 선언
- 자식 개체에서 그 함수를 다르게 구현(overriding)
-
실용적인 용도: 다른 종류의 개체를 편하게 저장 및 처리 기능
- 예: 부모의 형(type)을 저장하는 배열에 모든 자식 개체를 저장
- for 문 하나로 모든 개체를 순회하며 동일한 함수를 호출
- 그러면 각 개체가 자신의 종류에 따라 다른 동작을 함
- 예: 부모의 형(type)을 저장하는 배열에 모든 자식 개체를 저장
-
참고 : 다른 두 형태의 다형성
- ad-hoc 다형성
- 함수 오버로딩, 연산자 오버로딩
- 즉, 함수명은 같은데 매개변수 목록이 다름
- 매개변수 다형성
- C#과 java의 제네릭(Generic)
- C++의 템플릿
- 허나 둘 다 일반적으로 다형성이라고 안 부름
- OOP와도 상관 x
- ad-hoc 다형성
- (데이터) 추상화
- 추상화
- 수학: 일반화란 의미
- OOP: 개체 속에 있는 실제 데이터나 함수 구현 방법에 종속되지 않겠다는 뜻
- 데이터 추상화
- 개체 사용 시 그 안에 정확히 어떤 데이터가 있는지 알 필요 없음
- 개체 안에 있는 데이터에 직접 접근 불가
- 개체의 함수를 통해 접근
- 즉, 캡슐화는 데이터 추상화를 이루는 방법 중 하나
- 추상화
- 다형성을 통한 추상화
- 추상 클래스(abstract class)나 인터페이스(interface)를 사용하는 추상화
- 연관
- 어떤 개체가 제공하는 기능을 다른 개체가 이용하는 관계
- 종종 상속과 비교해서 설명
- 상속은 자식 개체가 부모 개체의 모든 것을 내포하는 관계
- 연관은 한 개체가 다른 개체를 참조하는 관계
- 세부적으로 다시 집합과 컴포지션으로 나누기도 함
- UML 다이어그림을 그릴 때
- 이 셋을 구분하지 않고 다 합쳐서 컴포지션이라 하기도 함
- 컴포지션
- 함성, 조합, 조립, 구성 등 다양한 번역어가 존재
- 여러 개의 부품(그 자체로 개체)을 조립해서 새 개체를 만드는 방법
- 집합과의 차이
- 부품 그 자체로는 존재 의의가 없음
- 조립품이 소멸할 때 부품도 같이 소멸
- 집합
- 역시 여러 개체를 모아 다른 개체를 만들지만 별도로도 존재 가능
- 컴포지션과의 차이
- 각 개체들이 따로따로 살아남을 수 있음
- 예: A 대학이 문을 닫아도 학생들은 여전히 다른 대학에 등록 가능
'프로그래머 > Java Managed Programming' 카테고리의 다른 글
[개체지향 프로그래밍] 개체 모델링 | 클래스 다이어그램 | 유연성 | OOP (0) | 2021.02.13 |
---|---|
[개체지향 프로그래밍] 접근 제어자 | getter/setter | 캡슐화 | 추상화 (0) | 2021.02.07 |
[개체지향 프로그래밍] 개체 생성 | 가비지 콜렉터(garbage collector) | 생성자(constructor) (0) | 2021.02.07 |
[개체지향 프로그래밍] 클래스(class) | 접근 제어자(public, private) | 인스턴스(instance) (0) | 2021.02.07 |
[포프 tv 복습] Java 기본 문법, Java와 C,C#의 차이 (0) | 2021.01.10 |