본문 바로가기

프로그래밍/Swift

[swift] 클래스

반응형

클래스

 

클래스는 아래와 같이 선언할 수 있다. 클래스 내부에 함수나 변수를 선언할 수 있고 변수는 프로퍼티(Property), 함수는 메서드(Method)라고 부른다.

 

class MyClass {
    var property: String = "property"
    func method() -> String {
        return "method"
    }
}

 

 

클래스에 소괄호를 붙여 인스턴스(instance)를 생성할 수 있다. 즉, 클래스라는 객체를 만들고 그것의 인스턴스를 만들어서 객체를 활용할 수 있는 것이다.

let instanceOfHuman = MyClass()
print(instanceOfMyClass.property) // "property"
print(instanceOfMyClass.method()) // "method"

 

 

프로퍼티를 초기화해주지 않으면 에러가 발생한다. 따라서 프로퍼티 선언 시 혹은 init() 함수 안에서 초기값을 할당해야 한다. 프로퍼티 이름 앞 self를 통해 현재 인스턴스의 값을 가리킬 수 있다. self는 인자 이름과의 구분에 활용될 수 있다.

 

class Human {
    var name: String
    init() {
        self.name = "Kam"
    }
    
    func eat(food name: String) {
        print("\(self.name) eats the \(name)")
    }
}


let instanceOfHuman = Human()
print(instanceOfHuman.eat(food: "burger")) // "Kam eats the burger"

 

 

인스턴스 객체의 할당이 해제되는 경우 deinit이 실행된다. 할당 해제 전 필요한 작업을 처리할 수 있다.

 

class Human {

    ...
    
    deinit {
        print("deinit")
    }
}

 

 

클래스는 서브클래스에 상속될 수 있다. 아래에선 Animal이 상위 클래스가 되고 HumanAnimal 클래스를 상속받는 서브클래스가 된다. 상위 클래스를 상속받은 서브클래스는 상위 클래스의 프로퍼티나 메서드에 접근할 수 있다.

 

class Animal {
    func eat(food name: String) {
        print("Start to eat the \(name)")
    }
}


class Human: Animal {
    
}

let human = Human()
human.eat(food: "burger") // "Start to eat the burger"

 

 

서브클래스 Human은 상위 클래스 Animal의 메서드 eat()override할 수 있다. override는 쉽게 말해서, 기존의 메서드 대신 새롭게 수정된 메서드로 사용하겠다는 의미다. 따라서 기존 상위 클래스의 메서드는 무시되고 override 된 메서드가 사용된다.

 

class Human: Animal {
    override func eat(food name: String) {
        print("A Human starts to eat the \(name)")
    }
}

let human = Human()
human.eat(food: "burger") // A Human starts to eat the burger

 

 

서브클래스 Human에 선언된 language라는 프로퍼티는 Human 클래스의 init 스코프에서 값을 설정할 수 있다. 그리고 super.init 호출하여 상위 클래스 Animal의 프로퍼티 name의 값을 설정할 수 있고, numberOfLegs, numberOfArms와 같은 상위 클래스의 프로퍼티는 직접 값을 설정할 수 있다.

 

class Animal {
    var name: String
    var numberOfLegs: Int
    var numberOfArms: Int
    
    init(name: String) {
        self.name = name
    }

}


class Human: Animal {
    var language: String
    
    init(language: String, name: String) {
        self.language = "Korean"
        super.init(name: name)
        numberOfArms = 2
        numberOfLegs = 2
    }

}

 

 

 

 

 

참고: Apple Inc. “The Swift Programming Language (Swift 5.3)”. Apple Books. https://books.apple.com/hk/book/the-swift-programming-language-swift-5-4/id881256329?l=en

반응형