OOP

📌 복잡한 구현(How, Private view)은 감추고, Interface(What, Public view)는 공개하는 것
Abstraction (추상화)

  • 외부에서는 오직 Interface를 통해서만 내부 데이터 통제 가능

장점

  1. Safety (안전성): 외부에서 함부로 Implemetation에 접근하지 못함
    • ↔️ 구현이 감춰지지 않았다면, 이해하기 위해 모든 접근 경로를 알고 있어야 함 ➡️ Readability (가독성)와도 이어짐
    • 함부로 변경 불가 ➡ Reliable (신뢰성)와도 이어짐
  2. Readability (가독성): 사용자가 복잡한 How를 볼 필요 없이, What만 보고 쉽게 이해하고 쉽게 사용
  3. Independence (독립성): 구현이 변경되더라도 외부에서는 전혀 알 수 없음
    • Propagation(전파)의 완충제
      • 변하지 않는 것을 Interface에, 변하는 것을 Implement하여 새 Class로 캡슐화
      • Client에서 Implement가 아닌 Interface에 대해 Dependency (의존)를 가지도록 함 ➡ 구현이 변화하더라도 Client에 영향 주지 않음
    • Interface는 바꿀 수 없지만, 서로 독립적이라면 Interface에 영향을 주지 않으므로 구현을 자유롭게 수정할 수 있음
  4. Maintainability (유지보수성)

ADT (Abstract Data Type)

📌 추상 자료형, 구현과는 독립적인 데이터 및 관련 연산의 집합
= Data + Operations without Implementation
= 하나의 문법적인 단위에 관련 데이터와 op를 Data Abstraction, Encapsulation (캡슐화), Information Hiding (정보 은닉)한 것

  • Class의 Idea 제시해 준 개념

Class

📌 대부분의 OOP 언어에서, ADT를 정의하기 위한 문법
= Attribute + Behavior
= ADT (Abstract Data Type) + Inheritance (상속) + Polymorphism (다형성)
C Structure, 동작 없이 데이터만 존재하는 묶음, Class가 더 확장된 개념임

  • 설계 지침
    1. 하나의 클래스는 하나의 Entity를 기술
    2. 책임 분리
    3. Reusability (재사용성) 고려
      • 특정한 가정 피하기 ➡ 순서 등, 외부 요인에 독립적으로 설계
      • 지나친 최적화 피하기

Object

📌 프로그램에서 표현된 하나의 Entity (개체)
객지프 > OOP02-2 (웹 보기)

📌 Instance of Class
= Internal Implementation (Data + OP) + Outer Interface

  • 객체 별로 멤버 변수를 가짐
  • 클래스로 정의된 모든 객체가 메소드, (static으로 정의된) 클래스 메소드 및 멤버 변수를 공유
  • Message Passing ➡️ 외부에서는 객체의 Method Call을 통해서만 작업 요청 가능

Visibility Modifier

JavaCPP
📌 멤버의 가시성을 지정하는 방법, 클래스의 Interface와 구현 부분을 구분하는 방법

  1. default: 같은 패키지 내에서 접근 허용
  2. public (모든 패키지 허용) ↔ private (해당 클래스 내에서만 허용)
    • Inner Class일 경우 private으로 정의 가능
  3. protected: private처럼 동작하되, 해당 클래스를 Inheritance (상속)받은 Child 클래스에서는 접근 가능

Getter (Accessor), Setter (Mutator)

📌 private 멤버 변수에 접근 제약을 설정하기 위한 메소드 ➡ Consistency (일관성)

  • Getter로는 Read 권한을, Setter로는 Write 권한을 줄 수 있음