Swift 4+ Keywords - "open"

접근 제어자 (Access Modifier)

프로그래밍 언어에서 Java 를 예로 들자면 public, private, protected 으로 필드, 함수, 클래스접근 범위를 제어할 수 있습니다. final, open, override, abstract 과 같이 상속 관련 키워드들도 ‘접근 제어자’의 범주에 함께 포함됩니다. (접근 제어자를 가시성 변경자 (Visibility Modifier)로 부르기도 합니다.)

취약 기반 클래스 (Fragile Base Class)

취약 기반 클래스 문제^1**는 **상속에 의해 발생하는 문제로 기반 클래스와 그를 상속하는 하위 클래스가 있다고 가정하였을 때 기반 클래스의 변경이 발생하면 하위 클래스가 깨지는 문제를 의미합니다. 기반 클래스를 하위 클래스에서 상속할 시 어떤 메소드를 어떻게 오버라이드할 지에 대한 규칙을 명시하지 않는다면 하위 클래스에서 의도와 다른 방식으로 메소드 오버라이드를 할 수 있습니다. 또한 기반 클래스의 메소드 목적이 변경되었을 때 하위 클래스의 오버라이드 메소드는 기존 의도와 예기치 못한 채 달라지게 되기 때문에 기반 클래스의 변경은 그를 상속하는 모든 하위 클래스에 영향을 줍니다. 이를 기반 클래스가 취약하다는 의미로 취약 기반 클래스라고 부릅니다.

초기 객체지향 프로그래밍 언어에 해당하는 Java, C#, C++ 의 경우에는 객체지향의 특징인 상속이 용이하도록, 접근 제어자를 따로 명시하지 않는다면 모든 기본 클래스는 상속이 가능합니다. 하지만 취약 기반 클래스 문제를 방지하기 위하여 ‘Effective Java’ 저서에서도 “상속을 위한 설계와 문서를 갖추거나, 그럴 수 없다면 상속을 금지하라”로 언급되듯 모든 기본 클래스는 상속하지 말 것을 소프트웨어 아키텍쳐 및 디자인 패턴에서 권장하고 있습니다.

초기 객체지향 프로그래밍을 사용하면서 발견된 한계와 문제들은 언어를 꾸준히 업데이트하면서 보완되기도 하지만, 새로 나오는 언어들은 이러한 좋은 패턴들을 자신들의 특징으로 가져가기도 합니다. 현대 객체지향 프로그래밍 언어인 KotlinSwift 가 그 중 하나에 속합니다. 우스갯소리로 이런 언어들을 짬뽕이라고 얘기하기도 하지만 그만큼 패턴들을 문법으로서 강제하는 장점을 갖습니다.

Swift, Kotlin - final class

Java 는 취약 기반 클래스 문제를 갖는 초기 프로그래밍 언어로써 기본적으로 모든 기본 클래스는 상속이 가능합니다.
Kotlin 과 Swift 는 위 문제 해결을 위하여 기본적으로 **모든 기본 클래스는 상속이 불가능(final)**합니다.
따라서 Swift 의 두 타입인 class 와 struct 모두 기본적으로 상속이 불가능합니다.

추가로 Java 의 변수, 클래스, 함수 모두 기본적으로 아무 접근 제어자를 명시하지 않으면 package-private 로 선언되지만
Kotlin 과 Swift 의 경우 아무 접근 제어자를 명시하지 않으면 public 으로 선언되어 어디서든지 사용할 수 있으며, public 은 기본적으로 final로 상속이 불가능합니다.

  • public = Uninheritable, Callable
  • open = Inheritable, Callable
1
2
3
4
5
open class User {
open func login() { }
public func playGame() { }
public init() { }
}

Kotlin, Swift 모두 상속을 하기 위해서는 클래스, 함수, 변수 모두에 open 키워드를 추가해야합니다. 함수와 변수에 open 키워드를 사용하여 클래스 전체 레벨이 아닌 함수, 변수 레벨에서 ‘상속 가능한 것’과 ‘상속 불가능한 것’들을 쉽게 관리할 수 있다는 장점이 있습니다.


살펴본 바와 같이 Java 와 Kotlin, Swift 의 상속에 대한 처리는 완전히 반대입니다. Public 한 클래스와 함수들에게 기본적으로 상속 가능하게 하고 상속을 제한하기 위해서 private 나 protected 와 같은 접근 제한자를 사용하게 하는 Java 와 반대로 Kotlin, Swift 는 개발자들에게 기본적으로 모두 상속 불가능하게 하고 상속을 하기위해선 open 을 명시하게끔 제한함으로써 잘못 상속하는걸 방지합니다. 그래서 Swift 에서 얼핏 open 을 사용하다보면 함수, 변수 단위의 상속 여부를 결정하기 때문에 Java 에서 abstract 와 비슷하단 느낌을 받습니다.


참조

  1. https://www.hackingwithswift.com/example-code/language/what-does-the-open-keyword-do
Author

Aaron Ryu

Posted on

2019-03-09

Updated on

2019-06-29

Licensed under

Comments