이번에는 초기화 구문인 Init에 대해서 알아보도록 하자.
이전에 구조체와 클래스에 대한 내용을 확인했다. 이전 글을 확인해보면 알겠지만, 구조체와 클래스는 초기화 선언이 필요하다.
이런 초기화는 initializer 라고 해서, 클래스와 구조체 또는 열거형 인스턴스를 사용하기 위한 필요 과정이라고 생각하면 된다.
여태까지 이미 초기화를 통해서 사용을 했었지만, 이번에는 편하게 사용하여, 다양하게 활용할 수 있는 방법에 대해서 알아보려고 한다.
Init 즉, 초기화는 인스턴스의 프로퍼티마다 초기값을 설정해 주고, 새 인스턴스를 사용하기 전에 필요한 설정을 해주기 위해서 사용한다.
초기화는 특정 타입의 새로운 인스턴스가 호출될 때에 생성이 된다.
이렇게 글로만 설명하면, 뭔가 이해가 부족하기 때문에 한번 사용법과 사용에 대해서 확인해보도록 하자.
Init 구문 사용 방법
init ( 매개변수 : 타입 ) {
프로퍼티 초기화
인스턴스 생성시 필요한 설정을 해주는 코드 작성
}
이렇게 사용이 가능하다.
또한, 초기화 구문은 반드시 init 키워드를 사용해야 하며, 매개변수의 갯수 이름 타입을 커스텀으로 지정이 가능하다.
초기화 구문을 정의할 때에 매개변수 이름을 다르게 해준다면, 여러개의 생성자를 생성할 수 있다는 뜻이다.
이렇게 Student 라는 class 를 선언하였지만, Class 'Student' has no initializers 에러가 표기가 되었다.
에러의 내용대로 초기화가 진행이 안되었다는 뜻이다.
그전에는 좌측의 사진과 같이 진행을 했지만 이번에는 초기화를 언급하는 부분인 만큼 초기화를 통해서 선언을 하면 우측과 같이 사용이 가능하다.
우측의 init 구문에 대해서 추가적으로 설명을 진행해보자.
위에서 언급한 내용대로 소괄호 부분에 매개변수를 넣고, 이 매개변수를 사용하는데. self를 사용한다. 여기서 self 는 즉, 나 자신의 name은 name의 변수를 받는다. 라고 이해를 하면 된다.
그럼이제 Student 인스턴스를 생성해보도록 하자.
아직까지는 구문만 복잡할 뿐 차라리 그전처럼 좌측의 내용대로 진행하는 것이 더 편하지 않나. 이런 생각을 하고 있을 것 같다.
이렇게 student 인스턴스를 생성했다. 기존 결과값은 확인을 했다 싶이 초기화를 진행한 내용대로 정상적으로 표기가 되었다.
그럼 이제 위에서 언급한 내용대로 매개변수의 이름과 갯수를 커스텀으로 작성할 수 있다고 했는데 해당부분을 확인을 해보도록 하자.
이렇게 매개변수를 커스텀으로 진행이 가능하다.
즉 좌측은 age 를 50으로 고정으로 초기화를 진행한 부분이고, 우측의 경우에 추가된 내용은 name을 "TEST"로 고정으로 준 부분이다.
이 2개의 소스를 활용해서 출력물을 확인해보도록 하자.
이렇게 서로 다른 init 을 호출 할 수 있다. student2는 init 매개변수로 name만 사용했고, student3는 init 매개변수로 age만 사용했다.
그결과 출력 내용이 초기화 구문에서 선언한 대로 해당 값으로 나온 내용을 확인할 수 있다.
하지만, 초기화를 했다고 해서 그 값이 변경이 안되는 내용은 아니다.
이렇게 초기화 선언 후에 값 또한 변경이 가능하다.
이렇게 초기화를 진행할 경우에는 변수를 생성할 때에 굳이 똑같은 값을 계속해서 작성해줄 필요성이 상당히 줄어든다.
게임을 좋아하는 사람들의 경우에는 예를들어 기본적인 몬스터의 생명치는 고정으로 두고, 여러개를 만든다던가 그런 작업을 충분히 할 수 있다는 부분이다.
그럼 이니셜라이저에 대해서 확인을 해보았는데, 영어에서도 반댓말이 있듯이, 이니셜라이저의 반대의 개념도 있다.
디이니셜라이저라는 내용으로, 인스턴스가 메모리에 해제되기 직전에 호출되며, 클래스 인스턴스와 관련하여 원하는 정리 작업을 할 수 있다.
이제 사용을 안한다 하면 불필요한 메모리 낭비를 막을 수 있다는 뜻이다. 하지만, 해당 내용은 구조체가 아닌 클래스에서만 사용이 가능하다.
deinit의 경우, 특별한 사용 구분이 없이 deinit 선언 후 작업에 대한 내용을 작성해 주면 된다.
반대로 특별한 작업의 내용을 작성하지 않아도 된다.
deinit 호출 테스트를 위해서 Student 클래스에 위의 그림과 같이 deinit 구문을 작성하였고, 필자는 테스트를 위해서 옵셔널 변수를 만들어줬다.
student4라는 student 클래스의 옵셔널 변수를 만들어서, name에 "TT"를 넣고 해당 변수에 nil을 대입했다.
해당 변수에 nil을 대입할 경우에는 인스턴스가 더 이상 필요하지 않다고 스위프트에서 판단하여, deinit을 호출하게 되는 부분이다.
이렇게 사용을 하면 이후에 student의 인스턴스에 대한 메모리가 해제되기 때문에 불필요한 메모리 용량을 삭제 할 수 있어 관리가 용이한 부분이다.
이번에는 init에 관련된 내용을 진행을 했고, 이렇게 초기화를 프로그래머가 하고 싶은 대로 진행을 할 수도 있고, 메모리 할당에 대한 내용까지 삭제가 가능한 부분을 확인했다.
'APPLE > Swift 문법' 카테고리의 다른 글
[ 기초 문법 ] 상속 (0) | 2022.08.14 |
---|---|
[ 기초 문법 ] 프로퍼티 (0) | 2022.08.11 |
[ 기초 문법 ] 구조체와 클래스 (0) | 2022.08.09 |
[ 기초 문법 ] 옵셔널 (0) | 2022.08.08 |
[기초 문법] 반복문 (0) | 2022.08.05 |