[iOS_Swift] 클래스(class)와 구조체(struct)의 이니셜라이저(initializer)

2021. 10. 18. 00:18Programming/iOS_Swift

기본적으로 클래스와 구조체는 인스턴스를 생성하는 과정에서 초기화를 반드시 하게 된다. 코드 상에서는 init이라고 표시된다. 예시를 통해 보자.

 

 

 

위 예시를 보면 따로 init이 보이지 않는다. 그러면 초기화를 하지 않은 것인가? 라고 생각할 수 있는데 이렇게 저장프로퍼티에 기본값이 할당되어 있다면 따로 사용자 정의 이니셜라이저를 만들지 않아도 기본적인 이니셜라이저가 자동으로 실행이 된다. 또한 인스턴스 student1에도 초기값을 할당하지 않고 생략해도 된다. 이거에 대한 이유 또한 프로퍼티에 기본값이 있기 때문이다.

 

위 예시와는 약간 달라졌는데 이번에는 이니셜라이저가 추가됐고 프로퍼티에 기본값을 할당하지 않은 대신에 이니셜라이저에 초기값을 할당했다. 그럼에도 결과는 동일하다.

 

그런데 만약에 나는 클래스의 저장프로퍼티에 기본값을 주기도 싫고 이니셜라이저에 초기값을 할당하기도 싫고 인스턴스에서 초기값을 설정하고 싶다. 그러면 어떻게 해야할까.

 

init에 매개변수를 만들어줘서 할당해주면 된다. 사실 나는 self.name = name 이라는 이 코드가 잘 이해가 안됐다. name이라는 저장프로퍼티의 값이 다시 어떻게 name이 되는거지? 싶었는데 뒷 부분의 name은 init의 매개변수이고 self.name의 name은 클래스 SeSacStudent의 저장 프로퍼티이다. 즉 init의 매개변수를 저장 프로퍼티에 할당하는 것이다. 변수명을 바꿔보면 좀 더 이해가 잘된다.

 

init의 매개변수명을 바꿔줬고 결과는 위와 동일함을 알 수 있다!

 

이렇듯 클래스의 경우 저장프로퍼티에 기본값이 할당되어 있지 않는 이상, 무조건 이니셜라이저를 넣어줘야한다. 반면 구조체의 경우 이러한 제한에서 자유로운 편인데 바로 멤버와이즈 이니셜라이저 때문이다. 멤버와이즈 이니셜라이저는 구조체가 위 클래스의 예시처럼 저장 프로퍼티에 기본값을 가지고 있지 않더라도 사용자 정의 이니셜라이저를 따로 만들어 줄 필요가 없다. 자체적으로 저장프로퍼티를 매개변수로 갖는 이니셜라이저이다.

위 예시처럼 따로 이니셜라이저를 만들 필요가 없음을 알 수 있다.

 

 

개인적으로 이니셜라이저 부분은 정리가 명확히 안돼서 공부하면서도 정말 헷갈렸던 부분인데, 늦게라도 정리를 해서 정말 다행이다,,