📕 1. 객체지향 개요
📄 1. 객체지향
1). 다음과 같은 목적으로 사용하길 바란다
- 재사용과 확장 (응용 프로그램의 상당 부분을 변경하지 않고도 추가하거나 업그레이드).
- 유지보수
📄 2. Class & Instance
1). 클래스란?
데이터 (속성, 상태, 변수, 자료구조) 와 함수 (메서드, 동작) 로 구성된것.
2). 클래스와 인스턴스의 관계?
ⓐ Class : 집합
인스턴스의 공장, 인스턴스의 집합이다.
-
: Class 집합의 원소로는 Instance가 있다.
-
ⓑ Instance(Object) : 집합의 원소
Class가 집합이면 이제 Type형태로 이루어진 Product이다.
![](https://imgur.com/ipNpTU3.jpg)
📕 2. 주요 객체지향 개념
1. 캡슐화 2. 상속 3. 다형성 4. 관계
📄 1. 캡슐화
① 변경이 된다라는것은?
캡슐화 이야기를 시작하기 전에.. 변경이라는 이 단어에 대해서 짚고 넘어가야 할것 같다.
종종,
"자주 변경되는것" "확장, 수정, 변경이 일어난다." "변경되는 요소"
이란 이야기가 보일것이다.
변경이 지칭하는 바는 바로 런타임/컴파일중 변경도 아닌..
스크립팅작업 에서 코드추가하고 제거하고.. 그러한 작업을 말하는것 같다.변할 수 있는 모든 개념은 다음과 같다.
1. 데이터, 2. 메서드, 3. 객체, 4. 자식클래스(서브타입)
그리고 이 개념들은 각각 캡슐화가 되는 타겟이다.위와 같은 타겟들은 확장, 수정, 변경이 일어날것 같아 보이면, 그걸 이제
캡슐화
해줘야 하는것이
객체지향 4가지 개념중캡슐화
다.
② 캡슐화
"변경 가능성이 높은 내용(데이터, 메서드, 객체, 서브타입)" 캡슐화를 통해서 숨기고(외부 사용을 막고)
그리고 상대적으로 변경 여지가 적은 안정적인 부분을 공개(외부 사용을 허용)하자
- 내부의 로직의 상세 구현을 알필요 없이 공개된 것만 사용하게 유도한다.
리모컨 버튼이 어떻게 작동하는지 몰라도 리모컨을 사용할 수 있지? 구현을 몰라도 .method() 하면 사용 가능하다.
③ 접근한정자
접근 한정자를 통해 객체의 캡슐화를 구현한다.
public | protected | private |
---|---|---|
|
|
|
④ 외부에 공개되는것과 은닉해야하는것
- 외부에 공개해야하는것 : 상대적으로 변경 여지가 적은, 혹은 오직 접근하기 위한 역할만 하는것
- Public : Interface같은것.. 혹은 readonly, const, final같은것
- 객체 내부 구현를 안정적인 인터페이스 뒤로 숨겨 캡슐화 한다.
- 과도한 Get, Set은 캡슐화를 무너뜨리는 요인이 된다.
- 내부에 은닉해야하는것 : "자주 변하는", "변경 가능성이 높은 내부 구현 부분" 이런것들이 캡슐화 되어 은닉된다.
그렇게 함으로 내부 구현을 부분은 캡슐화를 통해서 숨기고 변경의 영향을 통제해야 한다.- Private, Protected
⑤ 캡슐화의 종류
위에 언급했던 변할 수 있는 개념 1. 데이터, 2. 메서드, 3. 객체, 4. 자식클래스(서브타입)
각각 캡슐화의 종류를 나눠보자면
![](https://imgur.com/UB9KLeU.png)
① 데이터 캡슐화 : 객체 내부에서만 사용하고 관리되는 캡슐화된 멤버 데이터.
- Product클래스의 멤버로 name은 private이기 때문에 데이터 외부로 부터 은닉된다.
- Product내부에서만 사용하고 관리되는 캡슐화 된 데이터.
② 메서드 캡슐화 : 내부 행동을 캡슐화 한것으로. 인터페이스를 통해서 공개한다.
로직 구현부로 외부로부터 접근을 의도적으로 막은 녀석들이고
따라서 메서드 수정에 용이하고, 사이드 이펙트가 없으니 변경이 자주 일어나도 된다.
- DiscountPolicy클래스에 정의되어 있는 getDiscountAmount() 메서드는 Protected라, 외부로 부터 은닉되고,
- DiscountPolicy클래스 내부와 자식클래스에서만 사용되고 관리된다.
① 객체 캡슐화 : 객체와 객체사이 관계가 캡슐화 된 상태이다.
- Product클래스는 DiscountPolicy 타입의 인스턴스 변수 discountPolicy를 합성(Composition)한다.
② 자식클래스(서브타입) 캡슐화(인터페이스 구현)
- [추상클래스 혹은 인터페이스] : "DiscountPolicy, DiscountCondition"
[Concrete한 자식/서브타입] : "Amount/PercentDiscountPercetage, Coupon/GrageClassCondition"
이 두 관계가 추상적인 관계로
부모클래스나 인터페이스가 자식클래스의 존재를 감추고 있다. - 합성관계로 [인터페이스 | 기반클래스] 타입을 가지는 클래스는
그 타입들의 Concrete한 서브타입들의 존재를 몰라도(어떻게 구현되어 있는지 몰라도). 사용 가능하다.
그리고 이 서브타입 캡슐화는 다형성의 기반이 된다.
📄 2. 상속
- "상속 모체인 클래스" 의 데이터와 함수를 "상속 하는 클래스"가 물려받는다. (재사용)
- 부모의 멤버개수 ≤ 자식클래스의 멤버의 개수
📄 3. 다형성
"부모클래스 타입"의 참조 변수로 "자식클래스 타입"의 인스턴스를 참조할 수 있다.
C#코드
class Parent { ... } class Child extends Parent { ... } ParentClass P = new ChildClass();
ParentClass 인스턴스가 다형성으로 자식클래스를 참조할때,
ParentClass에는 없고 ChildClass만이 가지고있는 멤버에 접근할수 있나?? : ❌- ParentClass 타입 변수는 오직 ParentClass 멤버만 접근할 수 있다.
- 그말인 즉슨 비록 자식이 가지고 있다 하더라고 부모에 구현이 안되어 있으면
쓸수가 없다는 말이다.
📄 4. 관계
- Association 연관화
- Aggregation & Composition : Has A
- 집합 : 생명주기가 같지 않음.
- 컴포지션 : 생명주기가 같음.
- Inheritance 상속 : Is A
- Generalization & Specialization
- 일반화 : 공통적인 성질들로 상위 객체를 구성하는것
- 특수화 : 상위 객체를 구체화하여 하위객체를 구성하는것
- 부분-전체(part-whole)' 또는 ’부분(is-a-part-of)' 로 설명되는 연관성
'컴퓨터 > 정보처리기사 SW 공학' 카테고리의 다른 글
| 니앙팽이 - 객체지향(OOP) | 2-5 | 구조체 (0) | 2023.02.01 |
---|---|
| 니앙팽이 - 객체지향(OOP) | 2-4 | 클래스의 this & 메소드 체이닝 (0) | 2023.02.01 |
| 니앙팽이 - 객체지향(OOP) | 2-3 | Static (클래스 멤버) (0) | 2023.02.01 |
| 니앙팽이 - 객체지향(OOP) | 2-2 | 접근한정자 (0) | 2023.02.01 |
| 니앙팽이 - 객체지향(OOP) | 2-1 | Class & Instance (0) | 2023.02.01 |