본문 바로가기
etc/Swift

클래스

by IT learning 2021. 5. 21.
728x90

오늘은 클래스에 대해 공부하였다.

클래스는 구조체와 거의 비슷하지만, 약간 다른점이 존재한다.

 

구조체는 값 타입이지만 클래스는 참조 타입이라는 것이 차이점 중 하나이다.

 

그리고 중요한 것 하나는 Swift의 클래스는 다중상속이 되지 않는다. (충격)

 

정의

class 이름 {
    /* 구현부 */
}

클래스의 정의는 위와 같다.

 

프로퍼티와 메서드

class Sample {
    var mutableProperty: Int = 100 // 가변 프로퍼티
    let immutableProperty: Int = 100 // 불변 프로퍼티
    
    static var typeProperty: Int = 100 // 타입 프로퍼티
    
    // 인스턴스 메서드
    func instanceMethod() {
        print("instance method")
    }
    
    // 타입 메서드 - 나중에 상속을 받았을 때 재정의가 가능하냐, 할 수 없냐에 따라 나눠진다.
    // 재정의 불가 타입 메서드 - static
    static func typeMethod() {
        print("type method - static")
    }
    
    // 재정의 가능 타입 메서드 - class
    class func classMethod() {
        print("type method - class")
    }
}

클래스 구현은 구조체와 같다. 하지만 다른게 몇가지 존재한다.

인스턴스 메서드 까지는 같지만, 타입 메서드에서 2가지로 나뉜다.

나누는 기준은 나중에 상속을 받았을 때 재정의가 가능하냐, 할 수 없냐에 따라 나눠진다.

하나는 재정의 불가 타입 메서드인 static , 다른 하나는 재정의 가능 타입 메서드인 class 이다.

 

클래스 사용

// 클래스는 구조체와 다르게 var 로 선언이 됐든 let으로 선언이 됐든간에, mutableProperty(가변 프로퍼티) 가 변경이 가능하다.
var mutableReference: Sample = Sample()

mutableReference.mutableProperty = 200
//mutableReference.immutableProperty = 200

let immutableReference: Sample = Sample()

immutableReference.mutableProperty = 200
//immutableReference.immutableProperty = 200

//immutableReference = mutableReference


// 타입 프로퍼티 및 메서드
// 구조체와 크게 다른 모습을 보여주지 않는다.
Sample.typeProperty = 300
Sample.typeMethod() // type method

//mutableReference.typeProperty = 400
//mutableReference.typeMethod()

클래스 사용도 구조체와 비슷하지만 다른점이 존재한다.

먼저 클래스는 구조체와 다르게 var로 선언을 하든 let으로 선언을 하든간에 class내에서 가변 프로퍼티로 선언된 값을 변경할 수 있다.

 

주석 처리 된 것들은 애초에 불변 프로퍼티이다.

// MARK: - 학생 클래스

class Student {
    var name: String = "known"
    var `class`: String = "Swift"
    
    class func selfIntroduce() {
        print("학생입니다")
    }
    
    func selfIntroduce() {
        print("저는 \(self.class)반 \(name)입니다.")
    }
}

Student.selfIntroduce() // 학생입니다.

var ITlearning: Student = Student()

ITlearning.name = "Itlearning"
ITlearning.class = "스위프트"
ITlearning.selfIntroduce()

// 가변 프로퍼티를 let으로 인스턴스를 선언했음에도 불구하고 변경이 가능하다.
let enji: Student = Student()
enji.name = "enji"
enji.class = "스위프트"
enji.selfIntroduce()

학생 클래스에도 약간 다른점이 존재하는데,

마지막 문단의 코드를 보면 가변 프로퍼티를 let으로 인스턴스를 선언 했음에도 불구하고 변경이 가능하다.

기존의 구조체에서는 let으로 선언했기에 불변하기 마련이었는데, class에서는 그딴거 신경 안쓰나보다. 안에 있는 것이 더 우선이라고 판단하는 듯 하다. 따라서 은지로도 변경이 가능하다 ㅎ

728x90

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

클래스 vs 구조체 / 열거형  (0) 2021.05.24
열거형(enum)  (0) 2021.05.24
구조체  (0) 2021.05.21
옵셔널(Optional)  (0) 2021.05.17
반복문  (0) 2021.05.16

댓글

IT_learning's Commit