iOS/Swift

Top-Level Code가 무슨의미지??? - Swift

DevBabamba 2022. 10. 13. 13:43
반응형

Swift로 개발하면서 문서를 읽다보면 한번쯤은 접했을 이름입니다.

대충 공식문서를 훑어 보고 기억 저편에 사라져 있으실 분들도 계십니다.

아니면, 저 처럼 '오호라 신기한 단어군...! 오늘도 있어보일 수 있는 단어를 얻었어' 하고 지나갔을 수 있습니다.

설명은 못하면서 말이죠...ㅠㅠㅠ

(무늬만 개발자인 저는 언제나 스스로를 위기에 빠뜨리죠 ㅎㅎㅎㅠㅠ) 

(완벽하게 숙지하신분들이 굉장히신 분들입니다! ㅎㅎ)

 

이번에 SwiftUI 구조에 대해 적다가 Top-Level Code를 다시 발견하게 됐습니다.

이번엔 정리를 해야겠다 싶어 이글을 적게 됐습니다!

각설하고, Top-Level Code에 대해 적어보겠습니다!

 


1. Top-level Code?

이름만 보면 뭔가 코드상에서 가장 먼저 행동하도록 정의된 것으로 느끼게끔합니다.

개발밥 먹은지 몇년인데 대충 때려 맞추면 되지 ㅎㅎ

이렇게 어림짐작으로 넘어가면 꼭 문제가 발생합니다. ㅋㅋㅋㅋ ㅠ

 

그래서 좀 더 찾아 보았습니다.

 

Top-Level Code에 대해 Swift 문서에서는 다음과 같이 정의 합니다.(구글 번역기 님이 힘써주셨습니다.)

- Top-Level Code에는 Top-level 선언(Top-level declaration)실행 가능한 최상위 코드(executable Top-level code)의 두 가지 종류가 있다.

- Top-level 선언은 선언만으로 구성되며 모든 Swift 소스 파일에서 허용된다. 

- 실행 가능한 최상위 코드(executable Top-level code)에는 선언뿐만 아니라 명령문과 표현식이 포함되며 프로그램의 최상위 진입점으로만 허용된다.

 

의문이 늘어났습니다;;;

Top-level 선언(Top-level declaration) 실행 가능한 Top-level code(executable Top-level code) 가 차이가 있기에 구분을 했을 텐데요?

먼저 Top-level 선언 부터 알아 보겠습니다.

 

2. Top-level 선언(Top-level declaration)?

우리가 Xcode로 Swift app로 개발을 할 때, 여러 파일, 클래스, 함수 등이 정의 됩니다.

이때, 정의한 클래스 밖에 변수 등을 정의하더라도 어느 클래스에서든 접근 할 수 있습니다.

이상하지 않나요??

저는 이상하게 생각했었습니다.

정의한 것은 실행 순서가 어떻게 되길래 접근이 가능한거지??

 

사실 이것이 Top-level 선언입니다. (저도 작성하면서 알게 되었네요;;)

 

Swfit blog를 보면 다음과 같이 정의 되어있습니다.

For clarity, any executable statement not written within a function body, within a class, or otherwise encapsulated is considered top-level.

함수 안, 클래스 안 또는 기타 기타 캡슐화된 것에 쓰여지지 않은 모든 명령문은 Top-Level로 간주된다.

위의 그림처럼 함수 내 명령문, 클래스내 명령문 그리고 기타 캡슐화된것 외에는 모두 Top-Level으로 간주됩니다.

 

예를 들면 이렇습니다.

우선 TopLevelTest라는 Swift app을 생성해 봅니다.

그리고 Babamba라는 파일 그리고 클래스를 만듭니다.

그리고 클래스 밖에 babambaName변수 하나를 만듭니다.

그리고, ContentView에 babambaName을 사용해 보는것이죠

위의 캡쳐와 같이 babambaName 변수에 잘 접근하고 있습니다.

왜냐하면, babambaName은 Top-level로 선언 되었기 때문이죠!

 

3. 실행 가능한 Top-level code(executable Top-level code)?

그렇다면, 실행 가능한 Top-level code(executable Top-level code) 는 무엇일까요?

다시 한번 Swift 문서 내용을 적어봅니다.

Executable top-level code contains statements and expressions, not just declarations, and is allowed only as the top-level entry point for the program.

실행 가능한 최상위 코드(executable Top-level code)에는 선언뿐만 아니라 명령문과 표현식이 포함되며 프로그램의 최상위 진입점으로만 허용된다.

그럼 최상위 진입점으로 허용된 것으로 선언, 명령문, 표현식이 포함된다고 볼 수 있겠네요!

 

이 최상위 진입점은 main attribute, NSApplicationMain attribute, UIApplicationMain attribute, a main.swift file 또는 Top-level code가 포함된 파일입니다.

앞서 포스팅한  @main이 드디어 나왔네요!

위에서 만든 TopLevelTest App에서도 @main을 확인할 수 있습니다.

TopLevelTest struct에 @main attribute가 적용되어있습니다.

따라서 TopLevelTest struct가 최상위 진입점이라는 것이죠.

그래서 다른 클래스 등에서 @main을 적용하면 최상위 진입점이 두개가 되어 에러가 나타납니다.

(포스팅 SwiftUI 구조를 알아보자 2.1. @main을 참고하여 주세요!)

 

 


Top-level Code에 대해 알게 되었습니다.

이제 저는 좀 더 명확하게 아는척을 할 수 있게 되었습니다. ㅋㅋㅋ

 

이것으로 이번 포스팅을 마치겠습니다.

읽어주셔서 감사합니다!

 

 

 

반응형