ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift 구조체와 클래스 2 초기화(Initialization)
    Swift 2022. 12. 30. 02:42

    초기화는 뭘까?
    초기화는 클래스, 구조체, 열거형 인스턴스를 사용하기 위해 준비 작업을 하는 단계
    즉, 모든 프로퍼티를 기본 값으로 초기화 한다는 것!

     

    인스턴스는 뭘까?

    인스턴스는 메모리에 찍어내는, 실제로 메모리에 할당되어 구체적 실체를 갖춘 것을 의미함.
    메모리에 올라가서 각각의 어떤 데이터 역할을 하게되는 실제데이터임!

     

     

    생성자 init은 인스턴스를 만들 때 사용하는 특별한 메서드임.

    구조체와 클래스를 선언할 때 모든 저장 속성을 초기화 해줘야하는데 초기화를 하지 않으면 컴파일 에러가 남.
    구조체, 클래스는 모두 하나의 설계도일뿐
    안에 실제 데이터(속성), 동작(메서드)를 사용하기 위해서는 초기화 과정이 꼭 필요하다는 사실⭐️ 

     


    클래스의 초기화

    class introduce {
    
        var name: String
        var age: Int
        
        //init -> 초기화 메서드
        //파라미터가 구분 되지 않기 때문에 "self"를 붙여서 사용함.
        //self: 실제 데이터의 이름 
        //name: 파라미터에 쓰이는 이름
        init(name: String, age: Int) {
            self.name = name
            self.age = age
        }
        
        func sayMyName() {
            print("안녕하세요. 저는 \(name)입니다.")
        }
        
        func sayMyAge() {
            print("저는 \(age)살 입니다.")
        }
        
    }
    
    //인스턴스의 초기화가 완료되면 메모리에 정상적으로 인스턴스가 생성되고 아래와 같이 사용할 수 있음.
    var myInfo = introduce(name: "sehong", age: 20)
    myInfo.sayMyName() //안녕하세요 저는 sehong입니다.
    myInfo.sayMyAge() //저는 20살 입니다.

    여기서 잠깐 self 키워드를 간단히 짚고가자! ⭐️
    self 는 구조체나 클래스내에서 해당 인스턴스 자기자신을 가리키고 정확하게 명시하기 위해서 사용된다.

    self! 데이터! 자기자신! 

     

     

    구조체의 초기화
    구조체는 클래스와 달리 프로퍼티를 선언할 수 있는 초기화(memberwise initializers)를 자동으로 생성해서 제공!
    구조체내에 프로퍼티를 정의 했다면 구조체의 프로퍼티 이름으로 자동 생성 되어 아래와 같이 init 메서드 사용 없이도 사용이 가능하다!

    struct Car {
    	var name: String
        }
    }
    let truck = Car(name: "트럭")
    truck.name //트럭

     

    구조체는 생성자를 생성해주지 않아도 사용이 가능하지만 아래와 같이 사용해도 된다! 

    1. 생성과 동시에 초기화
    struct Book {
    	var author: String = "yagom"
    	var title: String = "swift5"
    }

         2. init 메서드에서 값 설정
            선언한 프로퍼티에 바로 값을 설정해줄 수도 있지만 init 메서드를 활용한 방법도 있음! 

    struct Book {
        var author: String
        var title: String
        
        init(author: String) {
            self.author = author
            self.title = "스위프트5"
        }
    }
    let findBook = Book(author: "sehong")
    print("\(findBook.author)이 쓴 책은 \(findBook.title)입니다.")
    //sehong이 쓴 책은 스위프트5입니다.

    위와 같이 init메서드를 사용했으면 초기화(memberwise initializers)는 제공되지 않는다는 것을 참고! 
    아래 Book.init을 보면 이미 직접 사용한 author은 초기화를 할 수있지만 title은 제공받지 못함!

     

    ⭐️프로퍼티중 하나라도 private이 선언되어 있으면 초기화가 제공되지 않는다는 사실도 참고⭐️

    'Cars' initializer is inaccessible due to 'private' protection level 은 구조체 내의 속성이 private이기 때문에 나는 에러입니다.

    해당 블록 내에서만 사용이 가능하므로 에러가 발생한다는 것! 즉 초기화가 제공되지 않는다!  

     

    ❓옵셔널 타입이면 어떨까?
    클래스 속성이 옵셔널 타입이면 nil을 가지고 있을수도 없을수도 있는데 초기화 안해줘도 되는거아님?! 

    class introduce2 {
    
        var name: String
        var age: Int?
        
        init(name: String) {
            self.name = name
        }
        
        func sayMyName() {
            print("안녕하세요. 저는 \(name)입니다.")
        }
        
        func sayMyAge() {
            print("저는 \(age)살 입니다.")
        }
        
    }
    
    var mySelf = introduce2(name: "sehong")
    mySelf.sayMyName() //안녕하세요 저는 sehong입니다.
    mySelf.sayMyAge()

    위의 코드는 나이는 공개하기 싫으니까 옵셔널로 설정하고 이름만 초기화를 시켜준 경우임.
    mySelf.sayMyAge()는 어떻게 출력이 될까? 출력은 될까? 에러가 뜰까? 
    "저는 nil살 입니다." 라고 출력이 됨!  질문처럼 옵셔널 타입을 가진 변수는 nil로 초기화 되기 때문에 초기값이 있을 필요가 없어 에러발생X

     

    하지만! 만약 옵셔널 프로퍼티가 상수라면?
    상수 프로퍼티는 초기화를 해주지 않을 때 nil 값을 계속 가지고 있다는 거기 때문에 쓸 필요가 없음!

     

     

     

     

    클래스, 구조체의 초기화 관련 부분을 간단히 다뤘고, 심화된 내용은 조금 더 읽어보고 이해하면서 추가하려고합니다.
    아직 많은 부분이 남아서 계속 시리즈로 적어나갈 예정입니다..!
    부족한 부분이 많습니다. 추가적으로 공부해야할 내용, 틀린부분 등등 여러 조언 감사히 받아드리겠습니다. 언제든지 해주세요.
    🏷️ 참고 사이트: https://jusung.gitbook.io/the-swift-language-guide/language-guide/14-initialization 

     

    초기화 (Initialization) - The Swift Language Guide (한국어)

     

    jusung.gitbook.io

    🏷️ 참고 도서: 야곰 스위프트 프로그래밍5

    댓글

Designed by Tistory.