객체 생성자와 해제자

sonny·2024년 10월 18일
1

TIL

목록 보기
16/52

전에 컬렉션에 대해 썼던 블로그에 간단하게 이니셜라이저에 대한 내용을 적긴 했지만 자세히 다뤄보지는 못했다. 오늘은 객체 생성자와 해제자까지 통틀어 한번 쉽게 이해해보려 한다.

생성자 ( Initializer )]

생성자는 객체가 처음 생성될 때 호출되어 객체의 초기 상태를 설정하는 역할을 해준다.

Swift에서 생성자는 init 키워드를 사용하여 정의하는데, 생성자는 객체의 필수적인 속성들을 초기화하는데 사용되며 객체가 올바르게 설정된 상태로 사용될 수 있도록 도와준다.

위에 예시 코드에서 Person 객체를 생성할 때 init 메서드가 호출되어 nameage를 설정했다.

해제자 ( Deinitializer )

해제자는 객체가 메모리에서 해제될 때 호출되는 메서드로 Swift에서는 deinit 키워드를 사용하여 정의해준다.

객체가 메모리에서 사라지기 전에 리소스 정리 등의 작업을 수행할 수 있는데, 예를 들어 파일을 닫거나 네트워크 연결을 끊는 등의 작업을 할 수 있다는 것이다. 해제자는 직접 호출되지 않고 객체의 생명 주기가 끝날 때 시스템에 의해서 자동으로 호출된다.

위 예시에서 person 객체에 nil을 할당하면, 해당 객체는 더 이상 필요하지 않기 때문에 메모리에서 해제되며 deinit이 호출된다.

  • 생성자 (Initializer) : 객체가 생성될 때 호출되어 초기화 작업을 한다.
  • 해제자 (Deinitializer) : 객체가 메모리에서 해제될 때 호출되어 정리 작업을 한다.

왜 중요할까.

객체의 생성자와 해제자는 프로그램에서 매우 중요한 역할을 한다고 한다.

1. 객체의 초기화와 안정성

생성자는 객체가 생성될 때 필요한 초기 데이터를 설정하는 역할을 하기 때문에 객체가 올바른 상태에서 동작할 수 있도록 보장 해준다. 만약 객체가 제대로 초기화되지 않으면? 그 땐 프로그램이 비정상적으로 작동할 수 있다. 만약 필수적인 속성들이 초기화되지 않은 상태에서 사용되면 예기치 않은 오류나 충돌이 발생할 수 있는 것이다.

2. 리소스 관리

해제자는 객체가 더 이상 필요 없을 때 사용한 자원을 정리하는 역할을 해준다. 만약에 파일 핸들이나 데이터베이스 연결, 네트워크 소켓 등은 프로그램이 끝날 때까지 남겨두면 메모리 누수나 성능 저하가 발생할 수 있다고 하는데 그럴 때 해제자를 통해 리소스를 정리하지 않으면 프로그램이 점점 더 많은 메모리나 자원을 차지하게 되어 최종적으로 시스템의 성능에 심각한 영향을 미칠 수 있다고 한다. 리소스 관리에 있어 해제자는 이토록 중요한 역할을 해주는 것이다.

3. 메모리 효율성

객체를 필요할 때 생성하고 필요 없을 때 메모리에서 해제하기 때문에 프로그램이 더 효율적으로 메모리를 사용할 수 있게 된다. 이건 특히 많은 객체를 생성하고 삭제하는 앱을 만들게 될 때 아주 중요하게 사용 될 것이다.

4. 메모리 누수 방지

해제자가 없다면 객체가 해제될 때 필요한 정리 작업을 할 수 없기 때문에 객체가 계속 메모리 상에 남아 있는 메모리 누수가 발생할 수 있다. 메모리 누수가 발생하면 앱의 성능이 점점 저하될 수 있고, 심한 경우 앱이 튕겨버리며 강제 종료될 수도 있다.

결론적으로 생성자는 객체가 올바르게 동작할 수 있도록 필수 초기화를 제공하고, 해제자는 객체가 사라질 때 리소스 정리를 책임지기 때문에 프로그램의 안정성 , 성능 , 메모리 관리 측면에서 매우 중요한 역할을 한다.

따라서 효율적이고 안정적인 코드 작성을 위해 필수적인 개념이니 꼭 알고 있어야한다.


그럼 언제 많이 쓰이는가

난 현재 Swift를 배우고 있으니... Swift를 기준으로 언제 많이 사용되는지를 예시와 함께 알아보았다.

생성자와 해제자는 다양한 상황에서 많이 쓰인다. 특히 객체지향 프로그래밍을 사용하는 경우, 두 개념은 자연스럽게 자주 등장하게 된다. 구체적인 예시와 함께 어떤 상황에서 많이 쓰이는지 설명하면 다음과 같다.

1. 객체 초기화가 필요한 상황

생성자는 객체의 속성을 초기화할 때 많이 사용된다. 예를 들어, 앱에서 사용자를 관리하는 경우 사용자의 이름, 나이, 이메일 등의 데이터를 저장하기 위해 생성자를 통해 초기화할 수 있다.

유저정보 관리

유저 정보 관리를 한다고 가정했을 때 앱에서 유저가 회원가입할 경우 유저 객체를 생성하면서 초기 데이터를 설정한다.

게임 캐릭터 설정

게임 캐릭터 설정 시 게임에서 캐릭터의 초기 스탯(체력, 마나, 공격력 등)을 설정할 때 생성자를 사용해 쉽게 초기화할 수 있다.

2. 리소스 관리

해제자는 외부 자원 (파일, 데이터베이스, 네트워크 소켓 등) 을 사용할 때 중요하게 쓰인다고 한다. 객체가 메모리에서 해제될 때 이 자원들을 정리하지 않으면 메모리 누수가 발생할 수 있다.

파일 처리

파일을 읽거나 쓸 때 파일을 열고 닫는 작업을 해야 한다. 해제자를 사용하면 파일을 닫는 작업을 자동으로 처리할 수 있다.

데이터베이스 연결

데이터베이스에 연결하고 데이터를 처리한 후, 연결을 끊는 작업도 해제자가 필요하다. 그렇지 않으면 연결이 계속 열려 있어 시스템 리소스를 차지하게 된다.

3. 메모리 관리가 중요한 경우

메모리를 많이 사용하는 프로그램(예: 이미지 처리, 데이터 분석, 게임 등)에서 객체를 많이 생성하고 소멸할 때 메모리 관리가 매우 중요하다. 생성자와 해제자를 통해 메모리 자원을 효율적으로 관리할 수 있다.

이미지 처리

이미지 데이터를 읽어들일 때 메모리에 주로 많은 데이터를 로드해야 한다. 객체가 필요 없을 때 해제자를 통해 메모리를 정리하는 것이 중요하다.

4. 클래스 상속 시 기본 속성 설정

클래스를 상속할 때, 상위 클래스의 속성들을 자식 클래스에서 올바르게 초기화하는 것이 중요하다. 생성자를 통해 이런 기본 속성들을 상속받고 설정할 수 있다.

언제 많이 사용하는지 요약하자면,

  • 생성자와 해제자는 객체의 초기화와 소멸에서 필수적으로 사용되고 리소스 관리가 필요한 상황에서 자주 쓰인다.

  • 데이터베이스, 파일 시스템, 네트워크 연결 등 외부 자원을 사용할 때 해제자를 통해 안전하게 자원을 해제하는 것이 중요하다.

  • 상속 관계나 복잡한 객체를 다룰 때 올바르게 객체를 초기화하고 메모리 관리를 하기 위해 생성자와 해제자가 필요하다.


음...

오늘 객체의 생성자와 해제자에 대해 공부하면서 객체의 생명주기라는 개념을 좀 이해하게 된 것 같다. 생성자는 객체를 생성할 때 필수적인 초기 설정을 담당하고 있다는 것과, 해제자는 객체가 메모리에서 해제될 때 자원을 정리하는 역할을 하는 것을 알게되었는데 처음에는 단순하게 느꼈었지만 실제로 객체를 다루는 다양한 상황에서 이게 얼마나 중요한지를 좀 알게 되었다.

생성자는 해당 객체의 속성을 초기화해서 프로그램이 예기치 않은 오류 없이 안정적으로 동작할 수 있게 도와주는데, 예를 들면 사용자 정보를 관리해준다거나 이름이나 메일 같은 필수 데이터를 생성자를 통해 설정하지 않으면 객체가 정상적으로 동작하지 않을 수 있다는 것이다.

또한 해제자는 객체가 더이상 필요하지 않을 때 메모리에서 안전하게 해제가 되어 리소스 누수를 방지하는데 중요한 역할을 한다는 점에서 유용하다는 걸 알게됏다. 이렇게 리소스 누수를 방지하면 성능을 최적화 하는 것이 가능해질테니까..!

오늘 공부하면서 좀 어려웠던 부분은 해제자의 역할을 제대로 이해하는 것이었다. 생성자는 객체를 생성할 때 직관적으로 이해하기가 편했지만 해제자는 객체가 언제 메모리에서 해제되는지를 몰랐다보니 이해하는데 시간이 걸렸던 듯 하다.

swift에서는 객체가 더이상 참조되지 않을 경우 자동으로 해제가 되기 때문에 따로 해제자를 호출하는 것이 아닌 시스템이 알아서 처리해준다는 점도 알게되었고 이 부분이 아직까지도 좀 낯설다.

그리고 상속을 사용할 때 생성자에서 상위 클래스의 속성을 초기화하는 과정도 약간 어려웠는데 super.init 을 사용해서 상위 클래스의 초기화를 처리하는 방법을 이해하는데 시간이 좀 걸렸다. 그래도 예제를 쓰면서 코드를 실행하다보니 익숙해져가는지도..

그래도 오늘 공부한걸 통해서 객체의 생성과 해제 과정이 단순한 초기화가 아닌 그 이상의 의미를 가지고 있다는걸 알게됐다. 메모리관리나 리소스 해제와 관련된 부분은 실제로 내가 앱을 개발하게 된다면 이러한 부분으로 앱 퀄리티의 차이를 만들수 있는 중요한 요소가 될 것이라 생각한다.

profile
iOS 좋아. swift 좋아.

0개의 댓글