iOS/Swift

[Swift] 구조체, 클래스, 프로퍼티, 프로퍼티 감시자

유훈 | Yuhun 2022. 1. 22. 22:55
반응형

구조체라고 하니 C가 생각납니다.. 

 

구조체

// 구조체

struct a {
    // 구현!
    // 일반적 프로퍼티
    var b: Int = 10
    
    // 타입 프로퍼티
    // 타입 자체에서 접근 가능 전역 클래스 전역 변수 같은건가
    static var c: Int = 20
    
    // 마찬가지로 func와 static func를 선언할 수 있다.
    func d() {
        //
    }
    static func e() {
        //
    }
}

// 값 기반이기에 let으로 struct를 선언하면 프로퍼티 값이 var여도 바꿀수 없다.
let example: a = a()
a.b = 20 // 에러

 

클래스

// 다른 클래스와 다른 점은 다중 상속이 불가능하다는 것
 
class example {
    // 일단 위의 구조체와 다른 부분은 같다.
    var change: Int = 10
    // 타입 method가 static과 class로 나뉜다.
    static func a () {
        // 상속시 오버라이딩 불가능
    }
    class func b () {
        // 상속시 오버라이딩 가능
    }
}

// 클래스는 참조값이기 때문에 let으로 선언해도 프로퍼티 값 변경이 가능
let ex: example = example()
ex.change = 20 // 이런게 가능

 

 

프로퍼티

- 클래스에서 프로퍼티를 잘 활용합시다.

// 프로퍼티

import Foundation

struct Student {
    // 인스턴스 저장 프로퍼티 (일반적인 프로터피)
    var name: String = "누구누구"
    var `class`: String = "Swift"
    var koreanAge: Int = 0
    
    // 인스턴스 연산 프로퍼티
    // c++과 비슷하네
    var westernAge: Int{
        get {
            return koreanAge - 1
        }
        
        set(inputValue) {
            koreanAge = inputValue + 1
        }
    }
    
    // 타입 저장 프로퍼티
    static var typeDescription: String = "학생"
    
    
    // 인스턴스 메서드는 아래의 읽기 전용으로 쓸 수 있다.
    func selfIntroduce(){
        print("저는 \(self.class)반 \(self.name)입니다.")
    }
    
    // 읽기 전용 인스턴스 연산 프로퍼티
    var selfIntroduction: String {
        get {
            return "저는 \(self.class)반 \(self.name)입니다."
        }
    }
    
    // 타입 메서드는 아래의 읽기 전용 연산 프로퍼티로 쓸 수 있다.
    static func selfIntroduce(){
        print("학생 타입입니다.")
    }
    
    // 읽기 전용 타입 연산 프로퍼티
    static var selfIntroduction: String {
        return "학생 타입입니다."
    }
    
}

// 타입 연산 프로퍼티
print(Student.selfIntroduction)

// 인스턴스 생성
var example:Student = Student()
example.koreanAge = 20

// 인스턴스 저장 프로퍼티
example.name = "exampleName"
print(example.name)
print(example.koreanAge)

// 인스턴스 연산 프로퍼티 사용
print(example.selfIntroduction)

// 연산 프로퍼티 get 이용
print(example.westernAge)

// 연산 프로퍼티 set 이용
example.westernAge = 30
print(example.koreanAge)

프로퍼티 감시자

- 잘 사용하면 유용한 기능일 듯 하다. 

// 프로퍼티 감시자
// 단순하게는 react의 useEffect 같은 개념이라 이해하면 될 듯 하다.

// 연산 프로퍼티와 동시에 사용 할 수 없다.
struct Money{
    var currencyRate: Double = 1000 {
        // 암시적으로 newRate 를 매개변수를 주지 않고 그냥 사용 가능하다.
        // 값이 바뀌기 전 실행
        willSet(newRate){ // willSet{print(newRate)} 이렇게도 가능
            print("새로운 값 \(newRate)로 바뀔 예정입니다.")
        }
        // 값이 바뀌고 실행
        didSet(newRate){
            print("새로운 값 \(newRate)로 바뀌었다.")
        }
    }
}

// 구조체나 클래스 뿐 아니라 지역,전역 변수에도 사용 가능하다.

 

내용 출처: 야곰의 스위프트 기본 강좌

반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] 클로저  (0) 2022.01.23
[Swift] 열거형  (0) 2022.01.23
[Swift] 옵셔널에 대해  (0) 2022.01.22
[Swift] 조건문, 반복문  (0) 2022.01.22
[Swift] 함수  (0) 2022.01.22