반응형

참고 사이트: iOS 프로그래밍을 위한 스위프트 기초(edwith)
참고 문서: The Swift Language Guide (한국어)
실행 환경: Xcode 12 실행 → Create a new Xcode project → macOS → Command Line Tool 선택 → Product Name, Organization Identifier 입력 후 프로젝트 생성

 

목차

  1. 스위프트(Swift) 5 배워보기 - 1. 다양한 타입
  2. 스위프트(Swift) 5 배워보기 - 2. 함수, 제어문, 옵셔널
  3. 스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형
  4. 스위프트(Swift) 5 배워보기 - 4. 클로저
  5. 스위프트(Swift) 5 배워보기 - 5. 프로퍼티
  6. 스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸
  7. (계속)

 


프로퍼티

  • 프로퍼티(Properties)는 구조체, 클래스, 열거형 내부에 구현하는 값이다.

 

프로퍼티 종류

  • 저장 프로퍼티(Stored Properties)
    • 값을 저장하고 있는 프로퍼티
    • 클래스, 구조체에서만 사용 가능
    • let 혹은 var로 선언 가능
      • 단, 구조체상수로 선언(let)하면 그 구조체 인스턴스의 프로퍼티를 변경할 수 없다.
      • 그러나 클래스상수로 선언(let)해도 프로퍼티 변경이 가능하다. -> 클래스 인스턴스는 참조 타입이기 때문
    • 인스턴스 저장 프로퍼티 타입 저장 프로퍼티, 지연 저장 프로퍼티로 구분할 수 있다.
      • 지연 저장 프로퍼티는 값이 처음으로 사용 되지 전에는 계산되지 않는 프로퍼티이다. 
      • lazy 키워드 사용
      • var로만 선언 가능
struct Student {

    // 인스턴스 저장 프로퍼티
    var name: String = ""
    var `class`: String = "Swift"
    var koreanAge: Int = 0

    // 타입 저장 프로퍼티
    static var typeDescription: String = "학생"
}

// 인스턴스 생성
var nyebo: Student = Student()
nyebo.koreanAge = 10


// 인스턴스 저장 프로퍼티 사용
nyebo.name = "nyebo1"

// 구조체 내의 프로퍼티가 let이 아닌 var로 선언되었기 때문에
// 값 변경 가능
nyebo.name = "nyebo2"

print(nyebo.name) // nyebo2 출력


// 지연 저장 프로퍼티
// 아래 DataImporter 클래스는 외부에서 data.txt 파일을 가져온다.
// 클래스 초기화를 하는데 많은 시간이 소요된다고 가정
class DataImporter {
	var filename = "data.txt"
    // 이하 데이터 가져오는 코드
}

class DataManager {
    // lazy를 붙여 지연 저장 프로퍼티로 선언
    // DataImporter() 초기화 시 많은 시간이 소요된다.
	lazy var importer = DataImporter()
    var data = [String]()
    // 이하 데이터 관리하는 코드
}

// DataManger 인스턴스 manager를 생성하고
// data늘 append로 추가하여도,
// 아직 DataImporter 인스턴스는 생성되어 있지 않다.
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")

// 실제로 importer 프로퍼티에 처음 접근할 때,
// importer 인스턴스가 생성된다.
print(manager.importer.filename)
// the DataImporter 인스턴스가 생성되었습니다.
// "data.txt" 파일을 출력합니다.

 

  • 연산 프로퍼티(Computed Properties)
    • 값을 저장하고 있지 않고 특정하게 계산한 값을 반환해 주는 프로퍼티
      • getteroptional한 setter를 제공해 값을 탐색하고, 간적접으로 다른 프로퍼티 값을 설정할 수 있다.
    • 클래스, 구조체, 열거형 모두 사용 가능
    • var 로만 선언 가능
    • 읽기 전용으로 구현 가능하나, 쓰기 전용으로는 구현할 수 없음
struct Student {
    var name: String = ""
    var `class`: String = "Swift"
    var koreanAge: Int = 0

    // 인스턴스 연산 프로퍼티
    var westernAge: Int {
        get {
            return koreanAge - 1
        }
        
        set(inputValue) {
            koreanAge = inputValue + 1
        }
    }
    
    // get만 사용하여 읽기 전용 인스턴스 연산 프로퍼티 선언
    var selfIntroduction: String {
        get {
            return "저는 \(self.class)반 \(name)입니다"
        }
    }
    
    // 읽기 전용 타입 연산 프로퍼티
    // 읽기 전용에서는 get을 생략할 수 있다.
    static var selfIntroduction: String {
        return "학생타입입니다"
    }
}

// 타입 연산 프로퍼티 사용
print(Student.selfIntroduction) // 학생타입입니다

// 인스턴스 생성
var nyebo: Student = Student()
nyebo.name = "nyebo"

// 인스턴스 연산 프로퍼티 사용
print(nyebo.selfIntroduction) // 저는 Swift반 nyebo입니다

 

프로퍼티 옵저버(Property Observers)

  • 프로퍼티의 값이 변경(set) 될 때마다 이를 감지할 수 있다.
  • 지연 저장 프로퍼티와 연산 프로피터에는 사용할 수 없다.
  • 두 가지 옵저버가 제공된다.
    • willSet: 값이 저장되기 바로 직전에 호출 됨
      • 새 값의 파라미터명을 지정할 수 있는데, 지정하지 않으면 기본 값으로 newValue를 사용한다.
    • didSet: 새 값이 저장되고 난 직후에 호출 됨
      • 바뀌기 전의 값의 파라미터명을 지정할 수 있는데, 지정하지 않으면 기본 값으로 oldValue를 사용한다.
struct Money {
    // 프로퍼티 옵저버 사용
    var currencyRate: Double = 1100 {
        willSet(newRate) {
            print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다")
        }
        
        didSet(oldRate) {
            print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다")
        }
    }

    // 프로퍼티 옵저버 사용 -- 기본 파라미터명 사용 시
    var dollar: Double = 0 {
        // willSet의 암시적 매개변수 이름 newValue
        willSet {
            print("\(dollar)달러에서 \(newValue)달러로 변경될 예정입니다")
        }
        
        // didSet의 암시적 매개변수 이름 oldValue
        didSet {
            print("\(oldValue)달러에서 \(dollar)달러로 변경되었습니다")
        }
    }  
}

var moneyInMyPocket: Money = Money()

// 환율이 1100.0에서 1150.0으로 변경될 예정입니다
moneyInMyPocket.currencyRate = 1150
// 환율이 1100.0에서 1150.0으로 변경되었습니다

// 0.0달러에서 10.0달러로 변경될 예정입니다
moneyInMyPocket.dollar = 10
// 0.0달러에서 10.0달러로 변경되었습니다
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기