본문 바로가기

iOS/학습정리

프로그래밍 방법론) 객체지향프로그래밍(OOP) - (3)

상속과 다형성

객체지향프로그래밍의 특징으로 크게 캡슐화, 은닉화, 추상화, 상속, 다형성이 있습니다. 그 중 상속과 다형성에 대해 알아볼까 합니다.

상속

기존 클래스를 재사용하여 새로운 클래스를 작성하는 것

상속을 통해 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이합니다.

장점

  • 코드 재사용성
  • 코드 중복 제거
  • 프로그램 생산성과 유지보수 향상

오버라이딩

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것

상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우에 사용한다.

오버라이딩 조건

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 다음의 조건이 같아야 한다.

  • 이름
  • 매개변수
  • 반환 타입

오버라이딩과 접근제어

  • open
    • 엔티티를 정의한 모듈의 모든 소스 파일 내에서 사용 가능
    • 정의한 모듈을 가져오는 다른 모듈의 소스파일에서도 사용 가능
    • 정의한 모듈과 다른 모듈 모듈 모두에서 오버라이딩 가능
    • 일반적으로 Framework에 공용 인터페이스를 지정할 때 사용
  • public
    • 엔티티를 정의한 모듈의 모든 소스 파일 내에서 사용 가능
    • 정의한 모듈을 가져오는 다른 모듈의 소스파일에서도 사용 가능
    • 정의한 모듈에서만 상속 및 오버라이딩 가능
    • 정의한 모듈을 가져오는 다른 모듈에서는 상속 및 오버라이딩 불가
    • 일반적으로 Framework에 공용 인터페이스를 지정할 때 사용
  • internal
    • 따로 접근제어를 선언해주지 않으면 기본으로 할당되는 default 접근제어
    • 엔티티를 정의한 모듈의 모든 소스 파일 내에서 사용 가능
    • 정의한 모듈을 가져오는 다른 모듈의 소스파일에서 사용 불가
    • 일반적으로 App이나 Framework의 내부 구조를 정의할 때 사용
  • fileprivate
    • 해당 파일 내에서만 사용 가능
  • private
    • 해당 요소가 선언된 블럭 내에서만 사용 가능
. open public internal fileprivate private
사용 전체 전체 정의한 모듈 정의한 파일 정의한 블럭
상속 전체 정의한 모듈 정의한 모듈 정의한 파일 불가
특징 가장 개방적 . default 접근제어 . 완벽한 은닉화

다형성

여러 가지 형태를 가질 수 있는 능력

상속과 함께 객체지향개념의 중요한 특징 중 하나입니다. 다형성은 상속과 깊은 관계가 있으므로 상속에 대해 충분히 알고 있어야 합니다.

자손 타입은 조상 타입의 변수와 메소드를 포함하면서 그 밖에 다른 변수나 메소드를 가질 수 있습니다. 따라서 자손 타입을 조상 타입으로 형변환하는 Up-casting은 Casting을 생략하고도 가능하여도 조상 타입을 자손타입으로 변환하는 Down-casting은 생략이 불가능 합니다.

  • Up-casting: 자손타입 -> 조상타입 (형변환 생략 가능)
  • Down-casting: 조상타입 -> 자손타입 (형변환 생략 불가)

=> 조사 더 필요

매개변수의 다형성

Protocol

최소한으로 가져야 할 속성이나 메서드가 정의된 인터페이스

실제 구현은 하지 않고 정의만 합니다.

/// 전송가능한 인터페이스를 정의합니다.
protocol Sendable {
  var from: String? { get }
  var to: String { get }

  func send()
}

클래스와 구조체에 프로토콜을 적용시킬 수 있습니다. 프로토콜을 적용하면, 프로토콜에서 정의한 속성와 메서드를 모두 구현해야 합니다.

this vs super

this

클래스 영역에서 정의한 변수와 동일한 이름의 변수가 사용되는 경우 this. 를 붙여 클래스 영역에 정의한 변수를 사용할 수 있습니다.

super

이미 클래스 내에 동일한 이름의 메소드, 변수가 있어도 super. 을 붙여 상속받은 클래스의 메소드, 변수를 사용할 수 있습니다.