Swfit - 초기화 의미가 헷갈린다

이희수·2022년 12월 28일
0

Swift

목록 보기
3/4

생성자??뭐야


var a =  "Hi"

//a라는 변수의 형태는 문자열이고 문자열의 형태를 a라는 변수에 담고 있다 이것이 내가 알고있는 변수였다
//하지만

var a: String
a = "Hi"

// 메모리 공간만 생성을 위 a변수처럼 미리 생성을 하고 문자열을 담을 수 있는 경우다

var a: String = "Hi"

이것과 관련된 class도 처음부터 설계를 할때 위와 같은 형식으로 처음부터 위 문자열을 넣어서 만들고 싶다는 것인대 그게 가능하다는 것이다 이것을 가능하게 해주는 함수가 있다 class 내부에 함수 즉, 메서드 라고 한다
생성자 (Initalizer)라고 한다



class MemberList {
    var mName : String
    var mPhone : Int
    var mAdress : String
    
    init (a: String, b: Int, c: String) { //일반적으로 파라미터의 이름은 이렇게 쓰지 않는다
        mName = a
        mPhone = b
        mAdress = c
    }
    
}

생성자는 Initalizer의 앞글자를 따서 init이라는 이러한 문법 형식이다
이렇게 되면 타입만 선언시켜도 된다 설계도에 인스턴스를 만들때 vipA,mPhone,mAdress 이 멤버들의 타입만 설정해두면
특별해지는것은 인스턴스를 생성해보면 확인할 수 있다


var mOne = MemberList(a: "안드레스", b: 010, c: "경기도")
mOne.mName
//안드레스

var mTwo = MemberList(a: "홍길동", b: 011, c: "서울턱별시")

인스턴스를 생성하려면 ..

인스턴스를 생성하려면 이니셜라이져의 갯수를 맞춰야 한다 이것또한 MemberLIst의 class로부터 mOne, mTwo의 실제 데이터를가지고
데이터를 찍어내는 행위이다 mOne의 name을 확인해보면 바로 값이 확인된다 다른 값도 마찬가지이다

데이터를 생성할때마다 실제 데이터를 가지고 원하는 데이터를 찍어낼 수 있다



var mThree = MemberList(a: String, b: Int, c: String)
mThree.mName //이름을 바로 가질수 있음

이렇게 되면 mThree로 다른 데이터를 생성해보면 상단의 코드처럼 어떤형의 타입이 필요한지 알려준다
생성자 메서드를 정의를 해놓았기 때문이다

초기화 메서드인 생성자 (Initalizer)의 역할이다

해당 메서드는 함수이기 때문에 마찬가지로 파라미터의 이름을 변경할 수 있다 일반적으로 파라미터의 이름은 이렇게 쓰지 않는다


class MemberList {
    var mName : String
    var mPhone : Int
    var mAdress : String
    
    init (mName: String, mPhone: Int, mAdress: String) { //일반적으로 파라미터의 이름은 이렇게 쓰지 않는다
        self.mName = mName //오른쪽 할당해야 할 mName은 파라미터의 mName을 의미한다
        self.mPhone = mPhone // self.mPhone은 인스턴스를 찍어냇을때 데이터를 의미한다
        self.mAdress = mAdress
        //일반적으로 개발자들이 헷갈리지 않게 self키워드를 통해 둘의 이름을 통일하는 경향이 있다
    }
    
}

var mOne = MemberList(mName: "안드레스", mPhone: 010, mAdress: "경기도")



파라미터명과 저장속성의 명이 구분이 되지 않는다 그래서 self. 라는 키워드가 필요하다
self의 의미는 인스턴스를 지칭한다 즉, 실제 데이터의 이름을 의미한다


mOne의 이름과 핸드폰번호 주소는 실제 인스턴스다 메모리 공간에 해당 데이터들이 힙영역에 3개가 생기게 되는대
이 인스턴스(실제 데이터)를 가리키는 용어가 self이다 self를 붙히면 해당 인스턴스의 mName등을 의미하는 것이다
self키워드를 쓰지 않으면 가장 가까이에 있는 파라미터로 인식하기 때문에 에러가 난다
생성자 안에서 쓴 이름은 파라미터의 이름이 아니다 인스턴스의 이름이다 라는 지칭을 해줘야 한다 그래서 구분이 돼는것이다

정리하자
오른쪽에 있는 mName은 외부에서 안드레스의 데이터를 받는 mName이다 mOne의 데이터를 받아서 실제로 인스턴스의 mName에 대입한다
생성자의 역할은 초기화 한다!!!


초기화의 의미

구조체와 클래스와 동일하다


기존에 초기화의 함수없이 기본값을 설정하고 데이터를 찍어내는것을 하기 때문에 중간에 변경하는 행위들을 했었다
이제는 초기화 메서드를 이용한 방식으로 이 생성자는 인스턴스를 만들때 사용하는 특별한 메서드다



class MemberList {
    var mName : String
    var mPhone : Int
    var mAdress : String
    
    init (mName: String, mPhone: Int, mAdress: String) {
        self.mName = mName
        self.mPhone = mPhone
        self.mAdress = mAdress
        
    }
    
    func List () {
        print("list 주소를 출력해라 \(self.mAdress)")
    }
    //더 정확한 의미로 self를 붙혀, 어떤 인스턴스의 이름이다 라는것을 의미를 붙혀 표현할 수 있다 큰 상관은없긴하다
}


var mOne = MemberList.init(mName: "안드레스", mPhone: 010, mAdress: "경기도")
//이렇게 .init을 붙히는 정식 문법의 방식을 지금은 줄여서 쓰는 방식으로 약속했다
mOne.mName
mOne.mPhone
mOne.mAdress
mOne.List()

안드레스 , 010, 경기도 주소의 데이터를 가지고 mOne이라는 인스턴스를 생성했다 정확하게는 메모리 주소값이 들어고
실제 mName, mPhone, mAdress의 데이터들은 heap영역에 있다



기억

함수를 정의 하는것과 비슷하다
구조체와 클래스의 조건이 동일하며 모든 저장속성은 꼭!!! 초기화 해야한다
즉, 변수(저장속성)를 정의할때는 타입만 정의하였고 이후 인스턴스 값을 생성할때 그 구체적인 데이터를 정해진 파라미터 형식대로
초기화 해줘야 한다는 말이다 (생성자의 의미)
하나하나의 데이터를 넘겨서 저장속성 초기화가 생성자의목적이다



! 클래스, 구조체,는 설계도다
이 설계도를 이용해 실제 데이터나 메서드를 사용하기 위해서는 초기화 과 정이 꼭 필요
초기화 메서드의 의미는 데이터를 실제로 메모리에 생성하기 위한 필수적인 과정 인스턴스 초기화 -> 메모리에 정상적인 인스턴스 생성



-인스턴스 내에서 동일한 변수, 상수명 사용시
-참조를 정확하기 하기위한 slef키워드 사용





생성자를 심화있게 다루기 전에 기본적인 내용이 헷갈려 기록

0개의 댓글