나만의 공부 노트

1강 정리 본문

(2021) 스탠포드 강의

1강 정리

va95 2021. 12. 8. 21:14

@main에 관하여

 

1. @ 이 심볼은 대체 뭐지?

가이드에 나와있다. https://docs.swift.org/swift-book/ReferenceManual/Attributes.html

 

Attributes — The Swift Programming Language (Swift 5.5)

Attributes There are two kinds of attributes in Swift—those that apply to declarations and those that apply to types. An attribute provides additional information about the declaration or type. For example, the discardableResult attribute on a function d

docs.swift.org

attributes라고 하며, 키워드와 마찬가지로 swift 컴파일러 언어인 것 같다.

주로 선언 또는 타입에 붙어서 추가적인 정보를 컴파일러에게 알려주기 위해 붙이는 것 같다.

한 예로 @discardableResult가 있는데, return value를 사용하지 않아도 컴파일 워닝이 뜨지 않는다.

그리고 함수의 인자에도 attribute를 붙일 수도 있다고 한다!

 

종류)

  • available(버전에 따른 컴파일 가능)
  • discardableResult(리턴 버릴 때 워닝 X)
  • dynamicCallable(변수도 함수처럼 사용이 가능하도록 만들어줌)
  • dynamicMemberLookup(subscript를 구현하면, 객체의 멤버 변수의 이름을 다르게 접근한다던지, 값을 다르게 반환한다던지 가능해진다. 그것도 런타임에! 멤버 변수명이 같거나 다르다면 자동으로 subscript으로 이해한다고 한다.)
  • frozen(lib, framework를 만들 때 사용, struct나 enum에서 더 이상 변경이 없을 것이라고 명시하는 것, switch문에서 안전하게 사용이 가능해짐)
  • GKInspectable(SpriteKit editor UI에 노출되도록 GameplayKit의 컴포넌트를 expose)
  • inlinable(c의 inline과 동일, 함수를 call하는 부분에 복붙)
  • main(아래에서 설명함)
  • nonobjc(implict, 즉 암시적으로 적용되는 objc 속성을 명시적으로 제거함, 브릿징 순환을 막기 위해 사용)
  • NSApplicationMain(application delegate를 나타내기 위해 사용, NSApplicationMain(_:_:)을 사용하는 것과 동일하다. 해당 attributes를 사용하지 않으면 main.swift를 만들어서 function 구현해야함)
  • NSCopying(stored variable에 사용하며, swift 객체를 objc에서 copy 메서드를 사용할 때 프로토콜을 따르도록 만듦)
  • NSManaged(코어 데이터에서 사용되는 NSMangedObject를 상속받는 클래스의 변수, 함수에 사용함, 런타임에 코어 데이터가 구현체를 제공함)
  • objc(swift 함수를 objc 언어에서 사용할 때 쓰인다. IBXXX 시리즈는 보통 암시적으로 채택됨)
  • objcMembers(이건 클래스 변수, 함수 전부 objc 적용할 때 사용)
  • propertyWrapper(오.. SwiftUI에서 쓰이는 state, binding은 사실 정의된 struct이고..  struct의 get, set 로직을 정의 내려놓음..)
  • resultBuilder(오.. 이것도 some View return할 때 data를 자동으로 nest해주도록 하는 키워드)
  • requires_stored_property_inits(클래스의 변수들이 무조건 초기화 되도록 강제)
  • testable(test 파일에서 import한 모듈의 접근 권한을 변경해줌, internal인 얘들 접근 가능해짐)
  • UIApplicationMain(이것도 application delegate를 나타내기 위해 사용, UIApplicationMain(_:_:_:_:)을 수행하는 것과 동일)
  • usableFromInline(inline을 쓰면 본문도 Public API로 만들기 때문에 본문이 노출됨, 따라서 inline에서만 쓰이도록 붙여주어야함, internal로 접근이 제한됨)
  • warn_unqualified_access(함수명이 겹칠 때, 정확한 함수를 사용하지만 워닝을 내줌-> 좀 더 내용을 쓰라고 알려줌, 클로저의 중괄호 두 번의 케이스인듯)
  • Interface Builder의 attributes(IBXXX 시리즈.. xcode 내장된 개발 응용 프로그램, 자동으로 탑재)
  • autoclosure, convention, escaping은 type attributes(이 중 convention은 calling convetion)
  • unknown(switch case에서 nonfrozen인 케이스에 대해서 키워드 붙임)

 

2. main은?

Apply this attribute to a structure, class, or enumeration declaration to indicate that it contains the top-level entry point for program flow. The type must provide a main type function that doesn’t take any arguments and returns Void. For example:

 

@main

struct MyTopLevel {

    static func main() {

         // Top-level code goes here

    }

}

 

그럼 top-level code가 무엇이냐? https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID352

 

Declarations — The Swift Programming Language (Swift 5.5)

Declarations A declaration introduces a new name or construct into your program. For example, you use declarations to introduce functions and methods, to introduce variables and constants, and to define enumeration, structure, class, and protocol types. Yo

docs.swift.org

즉, c와는 다르게 전역 변수, 선언들이 동일 레벨에 있어서 순서 상관없이 어디서든 호출할 수 있는 것.

두 종류가 있는데, 탑 레벨 선언문과 실행 가능한 코드이다.

탑 레벨 선언문은 오직 선언만으로 구성되고 어느 스위프트 소스 파일에서든지 가능하지만, 탑 레벨 실행 코드는 선언 뿐만 아니라 구현 + 엔트리 포인트까지 포함한다.

엔트리 포인트는 파일이 어떻게 조직화되어있는지 상관없이 main, NSApplicationMain, UIApplicationMain, main.swift, top-level executable code 최대 하나가 구성되어 있어야 한다.

 

요약)

https://barosalki.tistory.com/entry/iOS-Swift-53-main-type%EA%B8%B0%EB%B0%98%EC%9D%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%A7%84%EC%9E%85%EC%A0%90

 

[iOS & Swift 5.3+] @main : type기반의 프로그램 진입점

iOS 프로젝트를 처음 생성하면 자동으로 생성되는 몇 가지 파일이 있죠? 그 중에서 "AppDelegate.swift"는 AppDegate 클래스를 정의하고 앱이 시작되는 진입점을 알려주고 앱의 입력이벤트를 전달하는

barosalki.tistory.com

 

공식)

https://github.com/apple/swift-evolution/blob/main/proposals/0281-main-attribute.md

 

GitHub - apple/swift-evolution: This maintains proposals for changes and user-visible enhancements to the Swift Programming Lang

This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - GitHub - apple/swift-evolution: This maintains proposals for changes and user-visible enhance...

github.com

 

정리하자면..

Objective-C 기반의 프로젝트에서는 "main.m" 소스파일에 있는 main()함수를 실행하며 프로그램이 시작되고 Swift기반의 Xcode 프로젝트에서 Mac 템플릿을 생성하면 기본적으로 "main.swift" 파일을 포함하여 main함수를 쉽게 찾을 수 있었다.(기존의 c언어와 비슷)

그러나 Xcode에서 새 iOS 프로젝트를 만들고 앱이 어디서 부터 시작되는지 알기위해 main() 함수 혹은 "main.swift" 파일을 찾아 보면, 쉽게 찾을 수가 없는데, 그 이유는 iOS 기본 템플릿에선 Swift파일에 @UIApplicationMain을 포함함으로서 컴파일러가 iOS 앱의 진입점을 합성하기 때문에 따로 "main.swift"파일이 필요하지 않기 때문이다. 그렇다고 main()함수가 존재하지 않는 것은 아닌데.. Swift기반의 iOS프로젝트에서는 UIKit 프레임워크가 이를 숨겨서 관리하므로 찾기 힘들다.(UIKit이 자체적으로 main함수를 가져서 모든 앱의 시작점을 동일하게 만들고, main함수 내에서 호출하는 함수를 @main으로 지정을 해서 호출하는 구조인 것 같다.)

@UIApplicationMain은 정확히 UIAppliactionMain(_:_:_:_:)를 호출하고, 아래 타입의 객체를 Delegate class로 전달한다.

그렇다면 왜 main으로 바뀌였나 하면, UI, NS 구분 없이 사용하기 위해서 + UI의 경우 class만 사용이 가능하지만 struct 같은 타입 기반을 지원하기 위해 main으로 변경함

 

 

https://velog.io/@iris14_seo/iOS-%EC%95%B1%EC%9D%98-Life-Cycle-entry-point

 

[iOS] 앱의 시작 - entry point

회사에서 일할때는 세팅된 프로젝트에서 작업하고, 개인프로젝트는 기계적으로 'create a New Project' 해서 작업하다보니, 문득 'App이 어떻게 돌아가는가?'에 대한 공부가 부족하다는 생각이 들었다.

velog.io


some에 관하여

불분명한(opaque) 반환 타입으로된 함수나 메소드는 반환 값의 타입 정보를 숨깁니다. 함수의 반환 타입에 구체적인 타입을 제공하는 대신에, 해당 반환 값은 지원하는 프로토콜로 설명합니다. 반환 값의 근본적인 타입은 비공개로 유지되기 때문에, 타입 정보를 숨기는 것은 모듈과 모듈을 호출하는 코드 사이의 경계에서 유용합니다. 타입이 프로토콜 타입인 값을 반환하는 것과는 다르게, 불분명한 타입은 타입의 독자성(identity)을 지켜줍니다 - 컴파일러는 타입 정보를 사용할 수 있지만, 모듈의 클라이언트는 사용할 수 없습니다.
-> 즉, 컴파일러는 타입을 정확하게 알고 반환하고 있는 상태이지만, 클라이언트(=개발자)에서는 some XXX으로만 알고 사용해야하는 타입

https://0urtrees.tistory.com/135

 

스위프트 Opaque Types 1) 불투명타입의 필요성

Opaque Types 불투명 타입 Opaque 반환 타입을 가진 함수, 메서드는 자신의 반환타입 정보를 외부에 숨길 수 있습니다. 일반적인 반환타입 처럼 명확한 반환 타입을 외부에 제공하는 대신 말이지요. //

0urtrees.tistory.com

'(2021) 스탠포드 강의' 카테고리의 다른 글

3, 4강 정리  (0) 2022.01.02