Updated:

0. 서론

Swift에서 사용하는 protocol의 목적이 궁금해 다형성(Polymorphism)에 대한 공부를 하던 중,

class 동물 {
    func eat() {
        fatalError("Should be implemented")
    }
}

class : 동물 {
    override func 먹기() {
        print("말이 당근을 먹네요")
    }
}

class 고양이: 동물 {
    override func 먹기() {
        print("고양이가 츄르를 먹네요")
    }
}

var animal: 동물 = ()
animal.eat() // 말이 당근을 먹네요
animal = 고양이()
animal.eat() // 양이가 츄르를 먹네요
//출처 : SyncSwift Conference 2022 - protocol과 some, any에 대한 고찰 (박종호님)

다음과 같은 코드에서 animal 지역변수는 컴파일 타임에서 동물이라는 클래스에 의존하고 있고, 런타임에서는 말 또는 고양이 등의 동물을 상속하는 다른 타입의 인스턴스를 주입할 수 있다고 설명하였다.

여기서 말하는 ‘컴파일 타임’과 ‘런타임’은 무엇인가?

1. 컴파일 타임

컴파일 타임이란?

컴파일 타임(compile time)은 컴파일러에 의해 수행되는 동작(컴파일 타임 동작), 성공적으로 컴파일되기 위해서 소스 코드가 충족해야 하는 프로그래밍 언어 요구사항(컴파일 타임 요구사항), 또는 컴파일 동안 추론될 수 있는 프로그램의 속성을 나타낸다. (위키백과 - 컴파일 타임)

쉽게 이야기 하자면 컴파일 타임은 코드 자체의 오류가 없는지 찾아내고 이후에 프로그램으로써 실행하는 과정이라고 이해하면 된다.

우리가 코드를 작성하다 변수명을 잘못 작성하거나, 변수나 메소드에 올바르지 못한 타입을 할당하거나, 오타를 내거나 할 때 발생하는 신택스에러(Syntax Error)나 파일위치나 참조가 엉켜서 생기는 오류가 바로 컴파일 타임 에러이다.

2. 런타임

런타임이란?

런타임은 컴퓨터 과학에서 컴퓨터 프로그램이 실행되고 있는 동안의 동작을 말한다. “런타임”이라는 용어는 컴퓨터 언어 안에 쓰인 프로그램을 관리하기 위해, 특정한 컴파일러나 가상 머신이 사용하는 기본 코드의 라이브러리나 프로그램을 통틀어 런타임 라이브러리라고도 일컫는다. (위키백과 - 런타임)

코드가 컴파일 이후 프로그램으로써 실행되는 때를 런타임이라고 말한다.

3. 컴파일 타임과 런타임의 차이점

그래서 이 둘의 차이점은 무엇일까?

컴파일 타임 상에서 신택스 에러나 파일참조 에러가 없이 실행될 수 있다.

하지만 컴파일러에서 문제가 없더라도 여전히 프로그램 상에서 오류가 발생할 수 있는데 이런 경우 런타임 에러가 발생했다고 한다.

런타임 에러의 예시로는 0으로 나누거나, nil값을 강제 언래핑 하거나, 메모리 부족이 나타나거나 하는 오류가 있다.

4. 마무리

Protocol을 공부하던 중 만난 런타임과 컴파일 타임에 대해 알아봤다.

애플 디벨로퍼 아카데미를 수료하기 전 마지막 프로젝트를 마무리 하기 바빠 미뤄둔 공부를 이제 다시 시작했다.

SyncSwift 2022에서 박종호님의 ‘protocol에 대한 고찰’ 세션을 보며 느끼기도 했고 내가 직접 사용하면서 궁금한 점이 생기기도 했는데 protocol 뿐만 아니라 모르는 키워드들이 많아 공부할 점이 많은 것 같다.

포항살이를 마무리 하고 고향으로 돌아와 정신 없지만 연말 잘 마무리하고 내년을 위해 다시 공부하면서 화이팅하자!

포항 그리워 ㅜㅜ





참고 : 위키백과 - 컴파일 타임 (https://ko.wikipedia.org/wiki/컴파일_타임)
참고 : 위키백과 - 런타임 (https://ko.wikipedia.org/wiki/런타임)
참고 : 런타임이란? 컴파일타임 과의 차이는? (https://spaghetti-code.tistory.com/35)