현제의 현재이야기

[swift] 기초 문법 5일차 본문

IOS/swift

[swift] 기초 문법 5일차

현재의 현제 2022. 9. 12. 23:20

구조체

struct Student {
    // 가변 프로퍼티
    var name: String = "unknown"

    // 키워드도 `로 묶어주면 이름으로 사용할 수 있습니다
    var `class`: String = "Swift"

    // 타입 메서드
    static func selfIntroduce() {
        print("학생타입입니다")
    }

    // 인스턴스 메서드
    // self는 인스턴스 자신을 지칭하며, 몇몇 경우를 제외하고 사용은 선택사항입니다
    func selfIntroduce() {
        print("저는 \(self.class)반 \(name)입니다")
    }
}
// 타입 메서드 사용
Student.selfIntroduce() // 학생타입입니다

// 가변 인스턴스 생성
var yagom: Student = Student()
yagom.name = "yagom"
yagom.class = "스위프트"
yagom.selfIntroduce()   // 저는 스위프트반 yagom입니다

클래스

다중상속이 되지 않는다. 타입 메서드에는 두가지 메서드가 있다. 그러나 Let으로 지정했어도 값이 변경이 가능하다.

class Student {
    // 가변 프로퍼티
    var name: String = "unknown"

    // 키워드도 `로 묶어주면 이름으로 사용할 수 있습니다
    var `class`: String = "Swift"

    // 타입 메서드
    class func selfIntroduce() {
        print("학생타입입니다")
    }

    // 인스턴스 메서드
    // self는 인스턴스 자신을 지칭하며, 몇몇 경우를 제외하고 사용은 선택사항입니다
    func selfIntroduce() {
        print("저는 \(self.class)반 \(name)입니다")
    }
}

// 타입 메서드 사용
Student.selfIntroduce() // 학생타입입니다

// 인스턴스 생성
var yagom: Student = Student()
yagom.name = "yagom"
yagom.class = "스위프트"
yagom.selfIntroduce()   // 저는 스위프트반 yagom입니다

// 인스턴스 생성
let jina: Student = Student()
jina.name = "jina"
jina.selfIntroduce() // 저는 Swift반 jina입니다

인스턴스와 타입의 차이점:

struct Test {
    var mutable: Int = 200
    let immutable: Int = 200
    static var type: Int = 200
    func instanceMethod() -> Int{
        return 100
    }
    static func typeMethod() -> Int{
        return 100
    }
}

var hello: Test = Test()
print(Test.typeMethod())

//100

 

인스턴스는 저렇게 새로 정의된 인스턴스에서 불러올 수 있고, 타입은 본래의 클래스나 구조체에서 불러올 수 있다. 

열거형

강력한 기능을 가지고 있다. case의 초기화 값은 인스턴스로 사용할 수가 없다.

 

enum TurkNum: Int {
    case bir = 1
    case iki = 2
    case uc = 3
    case dort
}
var turkBir: TurkNum = TurkNum.bir
print(turkBir.rawValue)

print(TurkNum.dort.rawValue)

//1
//4
enum TurkNum: Int {
    case bir = 1
    case iki = 2
    case uc = 3
    case dort
}
let bes: TurkNum? = TurkNum(rawValue: 5)

if let target: TurkNum = TurkNum(rawValue: 5){
    print("터키어로 5는 \(target) 입니다.")
} else {
    print("지정이 안되어있는데요?")
}
//지정이 안되어있는데요?

rawValue를 통해 초기화 한 열거형 값은 옵셔널 타입이므로 if let으로 사용하거나 !로 벗기기를 해야한다.

enum TurkNum: Int {
    case bir
    case iki
    case uc
    case dort
    
    func showTurkNum(){
        switch self{
        case .bir:
            print(1)
        case .iki:
            print(2)
        default:
            print("귀찮다")
        }
    }
}
TurkNum.iki.showTurkNum()

이렇게 열거형에다가 메서드도 추가할 수 있다.

값 - 데이터를 전달할 때 값을 복사하여 전달한다.

참조 - 데이터를 전달할 때 값의 메모리 위치를 전달한다.

.

구조체는 저렇게 함수에 전달이 될 때 복사가 되어 들어가기 때문에 새롭게 정의된 것이나 마찬가지임으로, 처음 구조체의 someProperty를 불러와도 처음의 property가 오지만 클래스에서는 주소가 참조되기 때문에 ABC가 나온다.

 

+) 문제에서 깨달은 것

struct MyStruct {
  var propertyA: Int = 10
  let propertyB: Int = 10
}

class MyClass {
  var propertyA: Int = 10
  let propertyB: Int = 10
}

let instance = MyStruct()
let object = MyClass()

여기서 이 예시 중, class는 주소 값이 바뀌는 것이기 때문에 let으로 인스턴스를 만들고 propertyA와 propertB의 값을 바꾸면 모두 바뀔 것 같지만, class 인스턴스가 let으로 만들어졌어도 property가 let으로 지정되어있으면 바뀌지 않는다!! 

 

내가 아는 클래스가 이렇게 복잡한 것이었나? 싶었던 강의들.. 열거형은 처음보는거라 많이 혼란스러웠고 구조체와 클래스의 차이점은 직접 해봐야 알겠을 만큼 헷갈렸다. 파이썬이랑 달라도 너무 달랐지만 구조체와 클래스 구조가 mod의 Lua script와 유사한 점이 많았어서 그나마 이해가 빨랐던 것 같다. 내일도 화이팅!! 

'IOS > swift' 카테고리의 다른 글

[swift] 기초 문법 7일차(프로퍼티)  (0) 2022.09.14
[swift] 기초 문법 6일차(클로저)  (0) 2022.09.13
[swift] 기초 문법 4일차  (0) 2022.09.11
[swift] 기초 문법 3일차  (0) 2022.09.10
[swift] 기초 문법 2일차  (0) 2022.09.08
Comments