컴퓨터/정보처리기사 SW 공학

| 니앙팽이 - 객체지향(OOP) | 1 | 객체지향 프로그래밍

객체지향

📕 1. 객체지향 개요


📄 1. 객체지향

1). 다음과 같은 목적으로 사용하길 바란다

  • 재사용과 확장 (응용 프로그램의 상당 부분을 변경하지 않고도 추가하거나 업그레이드).
  • 유지보수

📄 2. Class & Instance

1). 클래스란?

데이터 (속성, 상태, 변수, 자료구조)함수 (메서드, 동작) 로 구성된것.

2). 클래스와 인스턴스의 관계?

ⓐ Class : 집합
인스턴스의 공장, 인스턴스의 집합이다.

  • : Class 집합의 원소로는 Instance가 있다.

ⓑ Instance(Object) : 집합의 원소

Class가 집합이면 이제 Type형태로 이루어진 Product이다.


📕 2. 주요 객체지향 개념

1. 캡슐화 2. 상속 3. 다형성 4. 관계


📄 1. 캡슐화

① 변경이 된다라는것은?

캡슐화 이야기를 시작하기 전에.. 변경이라는 이 단어에 대해서 짚고 넘어가야 할것 같다.

  • 종종, "자주 변경되는것" "확장, 수정, 변경이 일어난다." "변경되는 요소" 이란 이야기가 보일것이다.
    변경이 지칭하는 바는 바로 런타임/컴파일중 변경도 아닌..
    스크립팅작업 에서 코드추가하고 제거하고.. 그러한 작업을 말하는것 같다.

  • 변할 수 있는 모든 개념은 다음과 같다. 1. 데이터, 2. 메서드, 3. 객체, 4. 자식클래스(서브타입)
    그리고 이 개념들은 각각 캡슐화가 되는 타겟이다.

  • 위와 같은 타겟들은 확장, 수정, 변경이 일어날것 같아 보이면, 그걸 이제 캡슐화 해줘야 하는것이
    객체지향 4가지 개념중 캡슐화다.

② 캡슐화

"변경 가능성이 높은 내용(데이터, 메서드, 객체, 서브타입)" 캡슐화를 통해서 숨기고(외부 사용을 막고)
그리고 상대적으로 변경 여지가 적은 안정적인 부분을 공개(외부 사용을 허용)하자

  • 내부의 로직의 상세 구현을 알필요 없이 공개된 것만 사용하게 유도한다.
    리모컨 버튼이 어떻게 작동하는지 몰라도 리모컨을 사용할 수 있지? 구현을 몰라도 .method() 하면 사용 가능하다.

③ 접근한정자
접근 한정자를 통해 객체의 캡슐화를 구현한다.

publicprotectedprivate
  • 자기자신, 파생클래스, 비파생클래스
    모두 접근 가능하다.
  • 이 한정자만 어셈블리(패키지) 끼리도
    접근 가능하다.
  • 자기자신, 파생 클래스에서만
    접근 가능.
  • 비파생 클래스에선
    접근 불가능.
  • 오직 자기 자신에서만
    접근 가능하다.

④ 외부에 공개되는것과 은닉해야하는것

  1. 외부에 공개해야하는것 : 상대적으로 변경 여지가 적은, 혹은 오직 접근하기 위한 역할만 하는것
    • Public : Interface같은것.. 혹은 readonly, const, final같은것
    • 객체 내부 구현를 안정적인 인터페이스 뒤로 숨겨 캡슐화 한다.
    • 과도한 Get, Set은 캡슐화를 무너뜨리는 요인이 된다.
  2. 내부에 은닉해야하는것 : "자주 변하는", "변경 가능성이 높은 내부 구현 부분" 이런것들이 캡슐화 되어 은닉된다.
    그렇게 함으로 내부 구현을 부분은 캡슐화를 통해서 숨기고 변경의 영향을 통제해야 한다.
    • Private, Protected

⑤ 캡슐화의 종류
위에 언급했던 변할 수 있는 개념 1. 데이터, 2. 메서드, 3. 객체, 4. 자식클래스(서브타입) 각각 캡슐화의 종류를 나눠보자면

1. 개별 객체에 대한 변경 관리

① 데이터 캡슐화 : 객체 내부에서만 사용하고 관리되는 캡슐화된 멤버 데이터.

  • Product클래스의 멤버로 name은 private이기 때문에 데이터 외부로 부터 은닉된다.
  • Product내부에서만 사용하고 관리되는 캡슐화 된 데이터.

② 메서드 캡슐화 : 내부 행동을 캡슐화 한것으로. 인터페이스를 통해서 공개한다.
로직 구현부로 외부로부터 접근을 의도적으로 막은 녀석들이고
따라서 메서드 수정에 용이하고, 사이드 이펙트가 없으니 변경이 자주 일어나도 된다.

  • DiscountPolicy클래스에 정의되어 있는 getDiscountAmount() 메서드는 Protected라, 외부로 부터 은닉되고,
  • DiscountPolicy클래스 내부와 자식클래스에서만 사용되고 관리된다.

2. 객체들간 관계에 대한 변경을 관리

① 객체 캡슐화 : 객체와 객체사이 관계가 캡슐화 된 상태이다.

  • Product클래스는 DiscountPolicy 타입의 인스턴스 변수 discountPolicy를 합성(Composition)한다.

② 자식클래스(서브타입) 캡슐화(인터페이스 구현)

  • [추상클래스 혹은 인터페이스] : "DiscountPolicy, DiscountCondition"
    [Concrete한 자식/서브타입] : "Amount/PercentDiscountPercetage, Coupon/GrageClassCondition"
    이 두 관계가 추상적인 관계로
    부모클래스나 인터페이스가 자식클래스의 존재를 감추고 있다.
  • 합성관계로 [인터페이스 | 기반클래스] 타입을 가지는 클래스는
    그 타입들의 Concrete한 서브타입들의 존재를 몰라도(어떻게 구현되어 있는지 몰라도). 사용 가능하다.
    그리고 이 서브타입 캡슐화는 다형성의 기반이 된다.


📄 2. 상속

  • "상속 모체인 클래스" 의 데이터와 함수를 "상속 하는 클래스"가 물려받는다. (재사용)
  • 부모의 멤버개수 ≤ 자식클래스의 멤버의 개수
  • SuperClassSubClassSuperClass ⊆ SubClass

📄 3. 다형성

  1. "부모클래스 타입"의 참조 변수로 "자식클래스 타입"의 인스턴스를 참조할 수 있다.

    • C#코드

      class Parent { ... }
      class Child extends Parent { ... }
      ParentClass P = new ChildClass();
      
  2. ParentClass 인스턴스가 다형성으로 자식클래스를 참조할때,
    ParentClass에는 없고 ChildClass만이 가지고있는 멤버에 접근할수 있나?? : ❌

    • ParentClass 타입 변수는 오직 ParentClass 멤버만 접근할 수 있다.
    • 그말인 즉슨 비록 자식이 가지고 있다 하더라고 부모에 구현이 안되어 있으면
      쓸수가 없다는 말이다.

📄 4. 관계

  1. Association 연관화
  2. Aggregation & Composition : Has A
    • 집합 : 생명주기가 같지 않음.
    • 컴포지션 : 생명주기가 같음.
  3. Inheritance 상속 : Is A
  4. Generalization & Specialization
    • 일반화 : 공통적인 성질들로 상위 객체를 구성하는것
    • 특수화 : 상위 객체를 구체화하여 하위객체를 구성하는것
      • 부분-전체(part-whole)' 또는 ’부분(is-a-part-of)' 로 설명되는 연관성