Day 12. Classes

클래스

프로퍼티가 있는 경우 초기화 구문을 직접 작성해야 한다.

상속

콜론 :을 사용하여 상속하는 클래스명을 지정한다.

//Developer 클래스는 Employee 클래스를 상속받음
class Developer: Employee {
...
}

상속받는 경우 부모 클래스의 프로퍼티 목록들을 가져오게 됨. 상속받는 클래스에서 다시 작성하지 않아도 가능

메소드 오버라이드

override 키워드를 사용하여 부모 클래스의 메소드를 재정의 가능.

다음과 같은 경우는 swift가 코드 빌드를 거부한다.

  • override를 사용하지 않고 메소드를 변경하려고 하는 경우
  • override를 사용했지만 메소드에 변경 내용이 없는 경우

override는 같은 이름, 같은 리턴타입의 메소드를 재정의할 때 사용한다.
메소드가 받는 매개변수의 수나 타입이 달라지는 경우에는 사용하지 않는다. (메소드 오버로딩)

final

클래스가 다른 클래스를 상속하지 않게 하기 위해 final키워드를 사용한다.

다른 클래스를 상속하는 것을 허용하지 않는다.

init()과 deinit

프로퍼티가 있는 클래스는 구조체와는 다르게,
프로퍼티에 기본값이 없는 경우에는 초기화 구문을 직접 작성해야 한다.

struct Book {
    var bookName: String
    var author: String
    var price: Int
}
//구조체의 경우 기본값이 없어도 init()을 작성하지 않아도 된다. 
//그러나

class Book {
    var bookName: String
    var author: String
    var price: Int
}
//위 코드는 오류가 난다.
//클래스의 경우 기본값이 없는 경우 init()을 반드시 작성해야 한다. 
//작성하지 않은 경우 프로그램 실행이 되지 않는다. 

클래스의 인스턴스는 생성되었을 때, 프로퍼티에 모든 값이 있어야 한다. (nil 가능성이 있는 프로퍼티는 제외)

init()이라는 특별한 함수를 사용하며, func 키워드는 붙이지 않는다.

class Student {
    let name: String

    init(name:String) {
        self.name = name
    }
}

상속받은 경우, 부모 클래스의 init()을 호출해야 한다. 상위 클래스의 프로퍼티들을 초기화 해야 하기 때문.

클래스의 마지막 참조가 사라질 때, 클래스의 객체가 소멸되면서 초기화 해제 구문을 호출할 수 있다.

deinit이라는 특별한 함수를 사용하며, func 키워드와 괄호()는 사용하지 않는다.

class Student {
    let name: String

    init(name: String) {
        self.name = name
    }

    deinit {
        print("삭제됨")
    }
}

swift는 클래스의 참조를 추적하기 위해 자동 참조 카운팅(ARC;Automatic Reference Counting)이라는 기능을 수행한다.

참조가 늘어날 때마다 카운터를 1 늘리고, 참조가 제거될 때마다 카운터를 1 줄인다.

카운터가 0이 되면 최종 참조가 사라지는 것으로 판단하고 객체 인스턴스를 소멸시키면서 초기화 해제 구문을 실행하게 된다.

클래스의 복사

구조체는 값 타입(value type),
클래스는 참조 타입(reference type)

구조체는 인스턴스 복사 시 구조체가 그대로 복사되지만,
클래스는 인스턴스 복사 시 인스턴스에 대한 참조가 복사된다.

struct는 깊은 복사,
class는 얕은 복사

클래스는 메소드에 mutating 키워드를 사용하지 않는다.

구조체의 프로퍼티 값을 변경하는 경우, 내부에서는 구조체 자체를 새로 생성한다

카테고리:

업데이트: