• 티스토리 홈
  • 프로필사진
    2료일
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
2료일
  • 프로필사진
    2료일
    • 분류 전체보기 (118)
      • SWIFT개발 (29)
      • 알고리즘 (25)
      • Design (6)
      • ARkit (1)
      • 면접준비 (32)
      • UIkit (2)
      • Vapor-Server with swift (3)
      • 디자인패턴 (5)
      • 반응형프로그래밍 (12)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 초기화(initialization.. 편의? 지정?)
        2024년 03월 05일
        • 2료일
        • 작성자
        • 2024.03.05.:18

        https://bbiguduk.gitbook.io/swift/language-guide-1/initialization

         

        초기화 (Initialization) | Swift

        타입의 저장된 프로퍼티에 초기값을 설정하고 초기 설정을 수행합니다. 초기화 (Initialization) 는 인스턴스의 클래스, 구조체, 또는 열거형을 사용하기 위해 준비하는 단계입니다. 이 단계에는 인

        bbiguduk.gitbook.io

        여기들어가면 어마어마하ㄷ..분량이... 그만큼 초기화가 swift에서 중요하다.

        Swift는 모든 저장된 프로퍼티가 초기값을 받을 수 있도록 클래스 타입에 대해 2가지의 초기화 구문을 정의한다.

        => 바로 지정된 초기화와 편의 초기화라는 친구들이다.

        지정된 초기화(designated Initializer)

        해당 클래스에 의해 도입된 모든 프로퍼티를 완벽하게 초기화하고 적절한 상위 클래스 초기화를 호출하여 상위클래스 체인까지 초기화 프로세스 진행한다.

        편의초기화(Convenience initializers)

        초기화 구문 파라미터를 기본값으로 설정하여 초기화구문을 돕는 보조초기화. 그림에서 보듯 이것은 수평으로 호출된다!

        swift에서 클래스초기화는 2단계이다.

        1. 1단계 (Phase 1)

        • 각 저장 프로퍼티에 초기값이 설정됨

        • 상위 클래스의 초기화가 호출됨 (슈퍼클래스 초기화가 완료될 때까지 자기 프로퍼티를 건드릴 수 없음)

        2. 2단계 (Phase 2)

        • 초기화가 끝난 후, 추가적인 설정이 가능해짐

        • 이때부터는 self를 사용하여 프로퍼티 값을 읽거나, 메서드를 호출할 수 있어.

        이렇게 2단계초기화를 통해 부모의 초기화에 의해 자식에서 잘못덮어씌어지는 일을 막을수있다.

        Swift Compiler가 에러없이 2단계초기화까지 되었는지 4가지 검사를 한다고 한다.

        • 지정된 초기화 구문은 상위 클래스 초기화 구문에 위임되기 전에!! 클래스에 의해 먼저 내꺼다 초기화 되었는지 확인!
        • 지정된 초기화 구문은 상속된 프로퍼티에 값을 할당하기 전 상위클래스 초기화 구문에 위임해야한다.
        • 편의 초기화 구문은 모든프로퍼티에 값을 할당하기전 다른 초기화 구문에 위임해야한다
        • 초기화구문은 1단계 초기화가 완료될때까지 인스턴스 메서드를 호출하거나 인스턴스 프로퍼티 값을 읽거나 self로 값 참조 X

        자동 초기화 구문 상속 (Automatic Initializer Inheritance)

        1. 하위클래스가 지정된 초기화 구문을 정의하지 않았어? 자동으로 상위 클래스 지정초기화 구문 상속한다.

        2. 하위클래스가 규칙 1에 따라 상속하거나 정의의 부분으로 사용자 정의구현을 제공하여 모든 상위클래스 지정된 초기화구문의 구현을 제공하면 모든 상위 클래스 편의 초기화 구문을 자동으로 상속! 

        class Food {
            var name: String
            init(name: String) {
                self.name = name
            }
            convenience init() {
                self.init(name: "[Unnamed]")
            }
        }
        class RecipeIngredient: Food {
            var quantity: Int
            init(name: String, quantity: Int) {
                self.quantity = quantity
                super.init(name: name)
            }
            override convenience init(name: String) {
                self.init(name: name, quantity: 1)
            }
        }

        이렇게 Food를 상속받는 클래스가 있고 여기에는 초기화가 두가지방식이있다.

        여기서 봐야할게 RecipeIngredient에 제공된 convenience init은 상위 클래스의 designated init과 같은 파라미터를 가지고 있다.

        그래서 상위 클래스의 designated init을 재정의하기에 override붙여줘야함

        class ShoppingListItem: RecipeIngredient {
            var purchased = false
            var description: String {
                var output = "\(quantity) x \(name)"
                output += purchased ? " ✔" : " ✘"
                return output
            }
        }

        이번엔 recipeIngredient를 상속받는 클래스를 한번더 만들어봤다.여기서 주목할것은 이미 프로퍼티에 값이 다있어서 init이 필요가 없다.이렇게되면 자동으로 상위 클래스에서 모두 지정된 초기화 구문과 편의 초기화구문을 상속받는다.

        init?(실패가능한 초기화)

        기존에는 컴파일 시점에 모든 프로퍼티가 초기화 되어있어야하기에 실패하면 바로 컴파일 에러가 뜬다고 위에서 말했다.

        하지만 init뒤에 물음표 하나 붙이면 초기화에 실패하더라도 에러발생시키지않고 nil을 리턴한다. 그래서 실패가능한초기화로 생성할경우 무조건 인스턴스가 옵셔널 타입이라 옵셔널체이닝후 사용을 해야한다. 코드가 더러워질수도...?

        class Product {
            let name: String
            init?(name: String) {
                if name.isEmpty { return nil }
                self.name = name
            }
        }
        
        class CartItem: Product {
            let quantity: Int
            init?(name: String, quantity: Int) {
                if quantity < 1 { return nil }
                self.quantity = quantity
                super.init(name: name)
            }
        }

        위의 코드와 같이 어떤 CarItem 초기화를 할때 quantity가 1 이하면 어? 나 생성안해~ 하면서 nil을 리턴하게 되는것이다.

         

        구조체는 Class와 달리 지정생성자 명시적으로 작성X.

        Memberwise initiallizer: Swift Compiler가 구조체의 모든 프로퍼티를 초기화 할 수 있도록 자동으로 생성해주는 기본 생성자.

        구조체는 상속이 없으므로 부모클래스의 초기화 로직을 고려할 필요가 없어 독립적읻고 단순하기에 컴파일러가 모든 프로퍼티 기반으로 초기화메서드를 쉽게 생성할 수 있다. 

        '면접준비' 카테고리의 다른 글

        Uniform type Identifiers  (1) 2024.04.18
        매크로(Macros)  (2) 2024.03.07
        Function(1급시민 , inout & 클로저✨)  (2) 2024.03.04
        Assertions && Preconditions  (1) 2024.03.02
        LLVM? Swift가 컴파일되는 과정 Swift 기초  (2) 2024.03.01
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바