05.28 (수) Convenience init과 프로퍼티

2025. 5. 28. 23:10·🖋️ TIL Journal
-->

TIL은 편한 말투로 작성됩니다~

 

오늘은 새로 알게된 편의 이니셜라이저와 평상시에 다른 분들의 코드를 볼때 get, set, lazy 키워드가 있는 것들을 보고, 저건 어떤 내용일까 싶었는데 이번에 프로퍼티 부분에 강의를 보는데 갑자기 그 내용들이 나오길래 공부하여 정리해봤다.

 

 

편의 이니셜라이저 (Convenience initializer)


convenience init은 class에서만 사용 가능한 키워드로 직접 초기화하는게 아닌, 다른 이니셜라이저를 호출해서 초기화하는 보조 이니셜라이저라고 보면 된다.

 

반드시 같은 클래스 내의 지정 이니셜라이저(init) 또는 상위 클래스의 지정 이니셜라이저를 호출해야한다.

 

간단히 지정 이니셜라이저에 비해 더 간단한 입력만으로 편하게 객체를 생성할 수 있게 도와주는 역할이라고 생각하면 좋을거같다.

class SomeClass {
    var name: String
    var age: Int

    // 지정 이니셜라이저
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    // 편의 이니셜라이저 (Convenience initializer)
    convenience init(name: String) {
        self.init(name: name, age: 0) // 기본 나이를 0으로 설정
    }

    // 또 다른 편의 이니셜라이저
    convenience init() {
        self.init(name: "Unknown", age: 0)
    }
}

 

 

🧱 프로퍼티(Property)란?


프로퍼티란 클래스(class), 구조체(struct), 열거형(Enum)이 가지고 있는 값(데이터)을 나타내는 속성이다.

즉, 어떤 객체의 상태나 특징을 저장하거나 계산할 수 있도록 해주는 구성요소이다.

 

라고는 쓰여있는데, 그냥 어떠한 객체가 가지고 있는 변수나 상수를 생각하면 쉬울거같다.

 

 

✅ 프로퍼티의 종류

  • 저장 프로퍼티 (Stored Property)
  • 연산 프로퍼티 (Computed Property)
  • 지연 저장 프로퍼티 (Lazy Stored Property)
  • 타입 프로퍼티 (Type Property)

 

 

📌 1. 저장 프로퍼티 (Stored Property)


  • 인스턴스의 값을 직접 저장하는 기본적인 프로퍼티
  • var 또는 let 으로 선언
  • 클래스, 구조체에서 사용 가능
struct Person {
  var name: String
  let birthYear: Int
}

let user = Person(name: "Gwangyong", birthYear: 2000)
print(user.name) // Gwangyong

 

 

📌 2. 연산 프로퍼티 (Computed Property)


  • 실제 값을 저장하지 않고, 계산된 값을 반환
  • get으로 값을 반환, set으로 값을 설정한다.
  • 클래스, 구조체, 열거형 등에서 연산 프로퍼티를 사용 가능하다.

 

예시

struct Circle {
  var radius: Double

  var diameter: Double {
    get {
      // 읽을 때 실행됨
      // radius를 기반으로 값을 계산해서 돌려줌
      return radius * 2
    }
    set {
      // 쓸 때 실행됨
      // 외부에서 받은 값을 기반으로 radius를 재계산해 저장함
      radius = newValue / 2
    }
  }
}

var circle = Circle(radius: 5)
print(circle.diameter)  // 10.0
circle.diameter = 20
print(circle.radius)    // 10.0

 

🧐 newValue란?
- set 블록에서 프로퍼티에 새로 설정된 값을 의미하는 기본 매개변수 이름
- 따로 이름을 저장하지 않으면, Swift가 자동으로 newValue 라는 이름을 사용함

 

 

 

📌 3. 타입 프로퍼티 (Type Property)


  • 타입 프로퍼티는 인스턴스가 아닌, 모든 인스턴스가 값을 공유하는 타입 자체에 속하는 프로퍼티이다.
  • 구조체/열거형 → static만 사용
  • 클래스 → static, class 모두 사용 가능 (단, class는 오버라이드 가능한 연산 프로퍼티 전용)

 

static 사용
struct Counter {
  static var count = 0

  static var info: String {
    return "총 \(count)회 호출됨"
  }
}

Counter.count += 1
print(Counter.info) // 총 1회 호출됨

 

class 사용
class Message {
  class var greeting: String {
    return "Hello!"
  }
}

class CustomMessage: Message {
  override class var greeting: String {
    return "Hi!"
  }
}

print(Message.greeting)       // Hello!
print(CustomMessage.greeting) // Hi!

 

 

📌 3.5 프로퍼티 옵저버 (Property Observer)


  • 저장 프로퍼티의 값이 변경되는 것을 감시하고 있다가 코드블록을 실행할 수 있는 기능
  • 저장 프로퍼티가 사용 가능한 struct와 class에서만 사용 가능
  • willSet
    • 값이 변경되기 직전에 호출됨
    • 변경될 값은 기본 매개변수 newValue로 접근 가능
    • 별도 이름 지정 가능: willSet(이름) 형태로 작성
  • didSet
    • 값이 변경된 직후에 호출됨
    • 이전 값은 기본 매개변수 oldValue로 접근 가능
    • 별도 이름 지정 가능: didSet(이름) 형태로 작성

 

기본 사용 예시

struct Person {
    var name: String {
        willSet {
            print("Person의 name이 변경될 예정입니다. 변경될 이름은 \"\(newValue)\"입니다. (willSet 호출)")
        }

        didSet {
            print("Person의 name이 \"\(oldValue)\"에서 \"\(name)\"으로 변경되었습니다. (didSet 호출)")
        }
    }
}

var person = Person(name: "Mori")

person.name = "Apple"

/* 출력
 Person의 name이 변경될 예정입니다. 변경될 이름은 "Apple"입니다. (willSet 호출)
 Person의 name이 "Mori"에서 "Apple"으로 변경되었습니다. (didSet 호출)
 */

 

newValue, oldValue 다른 이름으로 변경한 사용 예시

struct Person {
    var name: String {
        willSet(changeNewName) { // newValue -> changeNewName
            print("Person의 name이 변경될 예정입니다. 변경될 이름은 \"\(changeNewName)\"입니다. (willSet 호출)")
        }

        didSet(beforName) { // oldValue -> beforName
            print("Person의 name이 \"\(beforName)\"에서 \"\(name)\"으로 변경되었습니다. (didSet 호출)")
        }
    }
}

var person = Person(name: "Mori")

person.name = "Apple"

 

 

 

📌 4. 지연 저장 프로퍼티 (Lazy Stored Property)


  • 인스턴스 생성 시 초기화되지 않고, 해당 프로퍼티에 처음 접근할 때 초기화되는 저장 프로퍼티이다.
  • lazy 키워드를 사용하여, 초기화를 "지연"시켜, 사용 시점까지 메모리를 아낄 수 있다.
  • 항상 var로만 선언해야하며, 클래스나 구조체에서 사용이 가능하다.
// 예시 : 지하 주차장 조명
class ParkingLot {
    lazy var light: String = {
        print("💡 주차장 조명이 켜졌습니다")
        return "불 켜짐"
    }()
}

let lot = ParkingLot()
print("사람이 아직 없음")

// 누군가 들어올 때 조명이 켜짐
print(lot.light)

 

'🖋️ TIL Journal' 카테고리의 다른 글

05.30 (금) 실수로 날린 커밋, reflog로 되살리기  (0) 2025.05.30
05.29 (목) 꽤나 자주 보이던 키워드들 간단 정리  (0) 2025.05.29
05.27 (화) guard문과 Closure  (0) 2025.05.27
05.26 (월) 중복 없는 난수 생성. 근데 이제 Shuffled()를 곁들인..  (0) 2025.05.26
05.23 (금) 미니 프로젝트 발표 & 피드백  (0) 2025.05.23
'🖋️ TIL Journal' 카테고리의 다른 글
  • 05.30 (금) 실수로 날린 커밋, reflog로 되살리기
  • 05.29 (목) 꽤나 자주 보이던 키워드들 간단 정리
  • 05.27 (화) guard문과 Closure
  • 05.26 (월) 중복 없는 난수 생성. 근데 이제 Shuffled()를 곁들인..
MoriOS
MoriOS
기억하기 위해 기록하는 공간 🖋️
  • MoriOS
    MoriOS
    MoriOS
  • 전체
    오늘
    어제
    • 분류 전체보기 (53) N
      • 📌 Swift (10)
      • 📱 iOS (4)
      • 💡 Algorithm (1)
      • ❕Data structure (4)
      • 🪙 Python (0)
      • ⚙️ Git (2)
      • 🖋️ TIL Journal (29) N
      • 📝 Etc (3)
  • 블로그 메뉴

    • GitHub
  • 인기 글

  • 태그

    innerloop
    swift
    swift 열거형
    코코아 프레임워크
    후행클로저
    swift 원시값
    한 줄 주석
    네비게이션 주석
    구문 레이블
    주석 활용
    cocoa 프레임워크
    Optional
    ios
    문서화 주석
    코코아 프레임워크 이름
    중첩 주석
    GitHub
    swift 연관값
    Components
    mark:
    TiL
    깃허브 로컬 복구
    버튼 액션
    static
    버튼 동작
    Split
    addaction
    swift optional
    weak
    enumerated()
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
MoriOS
05.28 (수) Convenience init과 프로퍼티
상단으로

티스토리툴바