[Swift] 객체지향 프로그래밍 - 기본개념 정리 (프로토콜, 익스텐션 포함)

Bibi·2022년 1월 13일

객체지향 프로그래밍

클래스, 객체, 인스턴스

  • 클래스 class
    • 객체가 공유하는 본질적 속성을 정의
    • 타입(=개념)을 구현하는 가장 보편적인 방법
  • 객체 object
    • 개별적인 실체로 식별 가능한 물리적/개념적 사물.
    • 상태(state), 행동(behavior), 식별자(identity)를 가진 실체
  • 인스턴스 instance
    • 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때, 객체를 그 개념의 인스턴스라고 한다.
    • 인스턴스화(=예시) : 타입에 해당하는 객체를 생성하는 것. 분류의 역.
    • 프로그래밍에서 타입은 클래스로 구현되므로, 인스턴스는 클래스의 예시라고 할 수 있다.
  • 추상화 abstraction
    • 실제 사물에서 원하는 특성만 취하고 필요 없는 부분을 추려 핵심만 표현하는 것
  • 분류 classification
    • 어떤 객체를 특정 개념의 객체 집합에 포함시키거나 포함시키지 않는 작업
    • 개념을 이용해 객체를 여러 그룹으로 분류할 수 있다.

객체지향 프로그래밍 개념

  • 프로퍼티 property
    • 객체의 상태를 구성하는 모든 특징 (정적)
    • 프로퍼티 값 property valye : 프로퍼티의 값. (동적)
  • 메소드 method
    • 객체가 수신된 메시지를 처리하는 방법
  • 캡슐화 encapsulation
    • 객체는 상태를 캡슐 안에 감춰 둔 채 외부로 노출하지 않는다. 객체가 외부에 노출하는 것은 행동뿐이다.
    • 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다.
    • 객체의 자율성을 높이는 효과가 있다.
  • 상속 inheritance
    • 기존 클래스를 재사용해 새로운 클래스를 작성하는 것.
    • 서브 클래스 subclass : (= 자식 클래스) 어떤 클래스를 상속받은 클래스.
    • 슈퍼 클래스 superclass : (= 부모 클래스) 자식 클래스에게 자신의 특성을 상속해준 클래스
    • 일반화와 특수화 관계를 구현하는 가장 일반적인 방법이다.
      • 단, 모든 상속 관계가 일반화 관계는 아니다. 코드 재사용을 위해 사용되기도 한다.
    • 서브타이핑 subtyping : 인터페이스 상속 interface inheritance. 서브클래스가 슈퍼클래스를 대체할 수 있는 경우.
    • 서브클래싱 subclassing : 구현 상속 inplementation inheritance. 서브클래스가 슈퍼클래스를 대체할 수 없는 경우.
  • 다형성 polymorphism
    • 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력.
    • 다형성을 지닌 객체들은 동일한 메시지를 수신할 수 있으므로, 동일한 타입(동일한 타입 계층)에 속하게 된다.

업캐스팅, 다운캐스팅

  • 업캐스팅 upcasting
    • 하위 클래스 타입을 상위 클래스 타입으로 변환
  • 다운캐스팅 downcasting
    • 상위 클래스 타입을 하위 클래스 타입으로 변환

상속과 인터페이스, [Swift] 프로토콜 protocol

  • 상속은 물려받는 것, 인터페이스는 장착하는 것.
  • [Swift] 인터페이스는 프로토콜 Protocol로 구현되어 있다.
    • 프로토콜은 요구사항을 정의할 뿐 기능을 구현하지는 않는다.
    • 프로토콜 요구사항에는 프로퍼티, 메서드, 이니셜라이저 등이 있다.
  • 상속
    • 예) 새는 조류를 상속받고, 날치는 어류를 상속받는다
  • 인터페이스
    • 예) 새와 날치 모두 "날다"라는 공통 특성을 가져 '날짐승' 카테고리로 묶일 수 있다.

[Swift] 익스텐션 extension

  • 익스텐션은 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가하는 것이다.
    • 타입의 기능을 확장(extension) 하기 때문에 익스텐션이다.
  • 외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 때 익스텐션을 사용.
  • 익스텐션은 타입에 새로운 기능을 추가할 수 있지만, 기존에 존재하는 기능을 재정의할 수는 없다

[Swift] 상속과 익스텐션 비교

  • 상속
    • 클래스 타입에서만 사용 가능
    • 수직 확장 : 특정 타입을 물려받은 새로운 타입을 정의하고 추가 기능 구현
    • 기능을 재정의할 수 있음 (오버라이딩 가능)
  • 익스텐션
    • 모든 타입에 적용 가능 - 구조체, 열거형, 클래스, 프로토콜, 제네릭..
    • 수평 확장 : 기존 타입에 기능을 추가
    • 기능을 재정의할 수 없음 (오버라이딩 불가)

0개의 댓글