Swift 문법 - 클래스(Class)

eelijus·2023년 2월 6일
0

Swift Syntax

목록 보기
10/11

💡클래스

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html

클래스 (Class)

클래스는 참조 타입이다.

  • 클래스 생성 - 프로퍼티 및 메서드 구현
class Sample {
    
    //가변 프로퍼티
    var mutableProperty: Int = 100
    //불변 프로퍼티
    let immutableProperty: Int = 100
    //타입 프로퍼티
    static var typeProperty: Int = 100
    
    //인스턴스 메서드
    func instanceMethod() {
        print("instance method")
    }
    
    //타입 메서드 - 재정의 불가
    static func typeMethod() {
        print("type method - static")
    }
    
    //타입메서드 - 재정의 가능
    class func classMethod() {
        print("type method - class")
    }
}
  • 클래스 사용 - 인스턴스 생성 및 프로퍼티 값 변경
class Sample {
    
    //가변 프로퍼티
    var mutableProperty: Int = 100
    //불변 프로퍼티
    let immutableProperty: Int = 100
    //타입 프로퍼티
    static var typeProperty: Int = 100
    
    //인스턴스 메서드
    func instanceMethod() {
        print("instance method")
    }
    
    //타입 메서드 - 재정의 불가
    static func typeMethod() {
        print("type method - static")
    }
    
    //타입메서드 - 재정의 가능
    class func classMethod() {
        print("type method - class")
    }
}

//인스턴스 생성 - 참조정보 수정 가능
var mutableReference: Sample = Sample()

var copyReference: Sample = Sample()
copyReference.mutableProperty = 1206

//참조정보 수정
mutableReference = copyReference
print(mutableReference.mutableProperty)

//인스턴스 생성 - 참조정보 수정 불가
let immutableInstance: Sample = Sample()

//클래스의 인스턴스는 참조타입이라 let으로 선언되어도 인스턴스 프로퍼티 값 변경이 가능
immutableInstance.mutableProperty = 1206

//참조정보 수정 불가능
//컴파일 오류 발생
//immutableInstance = copyReference

//참조 타입이라도 불변 프로퍼티는 변경할 수 없다
//컴파일 오류 발생
//immutableInstance.immutableProperty = 1206


Sample.typeProperty = 1206
Sample.typeMethod()

//인스턴스에서는 타입 프로퍼터나 타입 메서드 사용 불가
//컴파일 오류 발생
//mutableReference.typeProperty
//mutableReference.typeMethod()
  • 클래스 사용 예시 - 학생 클래스를 만들어보자!
class Student {
    
    //가변 프로퍼티
    var name: String = "studentName"
    var `class`: String = "className"
    
    //타입 메서드
    class func selfIntroduce() {
        print("학생 타입 클래스지롱")
    }
    
    //인스턴스 메서드
    //self는 인스턴스 자신을 지칭하며, 몇몇 경우를 제외하고 사용은 선택사항임
    func selfIntroduce() {
        print("\(self.class)\(self.name)이다!")
    }
}

//타입 메서드 사용
Student.selfIntroduce()

//인스천스 생성
var sujilee: Student = Student()
sujilee.name = "sujilee"
sujilee.class = "S"
sujilee.selfIntroduce()

//인스턴스 생성
let jji: Student = Student()
jji.name = "jji"
jji.class = "S"
jji.selfIntroduce()

타입 메서드

타입 메서드는 왜 필요한걸까? 에 대한 의문을 시작으로 공부한 내용이다.

타입 메서드는 class, static 키워드를 func앞에 붙여줌으로써 선언할 수 있다.

classstatic
서브(하위)클래스에서 오버라이드 가능서브(하위)클래스에서 오버라이드 불가능
class someClass {
    
    //인스턴스 멤버. 타입 someClass에서는 사용 불가능하다
    //타입 메서드 내에서 사용 불가
    var mutableProperty: Int = 0
  	//타입 멤버. 타입 someClass에서는 사용 가능하다.
    //타입 메서드 내에서 사용 가능
    static var typeProperty: Int = 0
    
    //타입 메서드
    class func typeMethod() {
        //컴파일 에러
//        mutableProperty = 1206
        //컴파일 에러
//        self.mutableProperty = 1206
        
        //타입 메서드 내에서의 self는 인스턴스가 아닌 자신(타입 자체)를 지칭한다.
        self.typeProperty = 1206
    }
}

someClass.typeMethod()
print(someClass.typeProperty)
//OUTPUT : 1206

타입 프로퍼티, 타입 메서드는 언제 사용하면 좋을까?

: 해당 프로퍼티나 메서드가 타입 자체와 연관될 때 사용하면 좋다. 유일한 값을 값을 가져야하는 경우 띠용?

EX) 볼륨을 담당하는 클래스, 영화 재생과 음악 재생을 담당하는 클래스가 있다.

볼륨은 시스템에서 유일한 값이어야하며, 영화 재생과 음악 재생을 오고 가더라도 값이 변하지 않아야 한다. 이 경우 볼륨을 타입 프로퍼티로 선언하고, 볼륨을 조절하는 기능을 타입 메서드로 선언해 사용한다. 메서드를 class 혹은 static 키워드로 선언할지는 상속 여부로 결정하겠지?

profile
sujileelea

0개의 댓글