인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

S W님의 프로필 이미지
S W

작성한 질문수

앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지

화면 이동과 데이터 전달 (활용 앱30강)

self와 클래스이름.self의 차이점

해결된 질문

작성

·

266

1

안녕하세요 강사님
섹션8에 활용 앱 30강을 수강 중 self, FirstViewController.self의 차이점이 궁금해서 질문드립니다.
영상의 나온 코드를 작성 후 정상적으로 작동이 되었습니다. 그런데 Xcode에서는 self 대신 FirstViewController.self를 사용하면 경고창이 사라진다고 하길래 Fix 후 실행시켰지만 backbutton 클릭 시 앱이 종료되었습니다.

 

self와 FirstViewController.self는 어떤 차이점이 있길래 back누를 시 앱이 종료되는 걸까요?

    let backButton: UIButton = {
        let button: UIButton = UIButton()
        button.setTitle("Back", for: .normal)
        button.setTitleColor(.white, for: .normal)
        button.backgroundColor = .blue
        button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
        // self -> FirstViewController.self 변경
        button.addTarget(FirstViewController.self, action: #selector(backButtonTapped), for: UIControl.Event.touchUpInside)
       
        return button
    } ()

답변 1

1

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

안녕하세요! S W 님.
해당 내용은 사실 Swift 문법적인 내용이라..
자세하게 답변드리기 보다는.. 아래와 같은 "메타 타입"의 개념을 살펴보시는 것이 좋습니다.
(구글링 ===> Swift + 메타타입)
https://woozzang.tistory.com/160


1) self는 ===> 메모리에 올라가 있는 실체, 즉 인스턴스를 가리키는 것이고요.
2) 타입.self는 ===> 타입 자체를 가리키는 것이예요.

그래서..
예를 들어,
1)
let myClass: MyClass = MyClass( )
오른쪽에서 MyClass 인스턴스를 생성해서 왼쪽 상수에 담으면.. 힙 메모리에 올라간 (데이터의) 실체가 왼쪽 상수에 담긴것이지요.
그리고 이 데이터 실체를 클래스 내부에서 self라고 합니다. (인스턴스 자신)
그래서 보통은 MyClass 내부에서 자신의 인스턴스를 가리킬때, self를 사용하는 것이고요.
(쉽게 이야기 하자면 self는 붕어빵을 가리키는 것이고요.)

2)
let myClassType: MyClass.Type = MyClass.self
이런 개념도 있어요. 이건 뭐냐면.. 타입 자신입니다. 즉, 구체적인 힙 메모리의 데이터를 가리키는 것이 아니라, 데이터 영역에 존재하는 클래스 타입을 가리키는 것입니다.
(쉽게 이야기 하자면, 붕어빵 틀을 가리키는 것이예요. 그리고 그 붕어빵 틀의 타입을 타입.Type 이라고 표현합니다.)

그래서 최대한 간단히 설명드려볼려고 했지만, 어쨌든.. 해당 자리에는 self를 쓰셔야 하고, 일단 let을 lazy var로 선언하셔야할 것 같네요.

감사합니다. :)

S W님의 프로필 이미지
S W

작성한 질문수

질문하기