[다양한 표현 및 확장] 2. 클래스

Seoyoung Lee·2022년 2월 24일
0


2021년 11월 17일에 공부한 내용입니다.

1. 클래스란?

  • 클래스는 구조체와 매우 유사하다.
    • 그러나 구조체는 값 타입인 반면,
    • 클래스는 참조(reference) 타입이다.
  • Swift의 클래스는 다중 상속이 되지 않는다.

2. 클래스 문법

  • 정의: class 키워드를 사용한다.
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")
    }

    // 클래스는 let, var을 사용한 인스턴스 모두 안의 프로퍼티 내용을 변경할 수 있다.
    // 클래스의 인스턴스는 참조 타입이기 때문에 값 변경이 가능하다.

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

    let immutableReference: Sample = Sample() // 인스턴스 생성 - 참조정보 숮어 불가
    immutableReference.mutableProperty = 200

    // 그러나 처음부터 불변 인스턴스로 선언되어 있다면 값을 바꿀 수 없다.
    mutableReference.immutableProperty = 200
    immutableReference.immutableProperty = 200

    // 참조 정보를 변경할 수는 없다
    // 컴파일 오류 발생
    immutableReference = mutableReference

    // 타입 프로퍼티 및 메서드
    Sample.typeProperty = 300
    Sample.typeMethod() // type method

    // 인스턴스에서는 타입 프로퍼티, 메서드를 사용할 수 없다.
    // 컴파일 오류 발생
    mutableReference.typeProperty = 400
    mutableReference.typeMethod()
}

3. 학생 클래스 만들어보기

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

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

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

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

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

var seoyoung: Student = Student()
seoyoung.name = "seoyoung"
seoyoung.class = "스위프트"
seoyoung.selfIntroduce() // 저는 스위프트반 seoyoung입니다

// let으로 선언했음에도 불구하고 프로퍼티 값 변경이 가능하다
let beomgyu: Student = Student()
beomgyu.name = "beomgyu"
beomgyu.selfIntroduce() // 저는 Swift반 beomgyu입니다

💡 생각해보기

  • '사람'을 나타내는 클래스를 만들어 봅시다.
    • Hint 1 : 사람이 가질 수 있는 속성을 프로퍼티로, 사람이 할 수 있는 행동을 메서드로 구현할 수 있습니다.
    • Hint 2 : 이름짓기 규칙을 다시 한 번 살펴보세요. 중요한 포인트입니다.
class Person {
    var name: String = "unknown"
    var age: Int = 1
    var sex: String = "unknown"

    func selfIntroduce() {
        print("제 이름은 \(name)이고 나이는 \(age)살입니다.")
    }
}
profile
나의 내일은 파래 🐳

0개의 댓글