[iOS 4주차] 문제해결: 초기화 규칙 문제 lazy 프로퍼티

황석범·2024년 11월 22일
2

내일배움캠프_iOS_5기

목록 보기
29/76

계산기 과제 코드를 피드백을 받은 내용을 적용하기 위해 여러 방법으로 리팩토링하는 과정에서 이미 있는 코드를 최대한 활용하려다 보니 다음과 같은 에러가 발생했다....


Swift에서는 모든 프로퍼티가 초기화되기 전에 self를 사용할 수 없다. 이 규칙 때문에 createButtonStack()이 호출될 때 self가 이미 초기화되어야 하지만, super.init(frame:)이 호출되기 전에 self를 사용하려고 해서 에러가 발생했다.

  • createButtonStack()은 인스턴스 메서드로 선언되어 있고, 인스턴스 메서드에서 self를 사용합니다.
  • 그러나 super.init(frame:)을 호출하여 부모 클래스의 초기화가 완료되기 전까지 self를 완전한 상태로 간주하지 않습니다.
  • 따라서 createButtonStack() 호출시 self를 사용할 수 없어서 에러가 발생합니다.
  • lazy 프로퍼티를 사용해 간단하게 해결할 수 있습니다.

lazy 프로퍼티를 사용할 때 주의해야 할 점

1. 초기화 시점 제어의 어려움

  • lazy 프로퍼티는 처음 접근될 때 초기화되므로, 초기화 시점을 명확히 예측하기 어려울 수 있습니다.
  • 의도적으로 초기화 시점을 통제해야 하는 경우(예: 성능 테스트나 리소스관리)에는 적합하지 않습니다.

2. 멀티스레드 환경에서의 안전성

  • 여러 스레드가 동시에 lazy 프로퍼티에 접근하면 초기화 코드가 여러 번 실행될 위험이 있습니다.
    • 이 경우, 명시적으로 동기화 처리를 해야 할 수도 있습니다.

3. 불필요한 지연 초기화

  • 만약 프로퍼티가 초기화 이후 계속 사용된다면, lazy로 선언하는 이점이 사라집니다.

  • 오히려 초기화 지연이 코드의 가독성을 해치거나, 성능 면에서 무의미한 오버헤드가 될 수 있습니다.

4. 메모리 관련 이슈

  • lazy 프로퍼티가 초기화된 이후 메모리를 해제하려면, 해당 객체가 참조를 끊어야 합니다.

  • 이를 제대로 관리하지 않으면 예상치 못한 메모리 사용 증가가 발생할 수 있습니다.

5. 유닛 테스트의 어려움

  • 테스트 환경에서 lazy 프로퍼티가 의존하는 외부 요소가 제대로 설정되지 않았다면, 접근 시 오류가 발생할 수 있습니다.
  • 초기화 시점에 대한 명확한 제어가 어렵기 때문에 테스트를 복잡하게 만들 수 있습니다.

6. 클로저 캡쳐 주의

  • lazy 프로퍼티를 초기화하는 클로저에서 self를 캡처하면, 강한 순환 참조가 발생할 위험이 있습니다.
  • 이 경우 weak self를 사용해야 하지만, 초기화 코드가 더 복잡해질 수 있습니다.

언제 lazy를 사용해야 할까?

적합한 경우:

  • 리소시가 무거운 객체 초기화: 큰 데이터를 로드하거나 복잡한 연산이 필요한 경우
  • 프로퍼티가 특정 조건에서만 사용: 초기화 비용을 줄이고, 사용하지 않는 경우 초기화하지 않도록 설계
  • 외부 의존성이 있는 초기화: 외부 데이터나 구성 요소가 준비된 이후에만 초기화해야 하는 경우

부적합한 경우:

  • 초기화 순서가 명확히 정의되어야 하거나, 초기화가 반드시 필요한 경우
  • 프로퍼티가 항상 사용되고, 초기화 비용이 크지 않은 경우
  • 멀티스레드 환경에서 동기화 처리가 필요한 경우

결론

laay는 유용한 도구이지만, 초기화 시점, 성능 요구사항, 멀티스레드 환경 등을 고려하여 사용해야 합니다. 코드가 간단하고 예측 가능하도록 유지하려면, 필요하지 않은 경우 lazy를 피하고 일반 초기화를 사용하는 것이 좋습니다.

profile
iOS 공부중...

0개의 댓글

관련 채용 정보