Swift) 구조체와 클래스

Danna 다나·2021년 8월 6일
0
post-thumbnail

*** 계속 수정 중입니다

1. 구조체

2. 클래스

  • 다중 상속이 되지 않음

2-1 클래스의 정의

// 클래스 정의
class ClassName {

}
  • 앞에 class를 적고, 뒤에 클래스의 이름을 적는다.
  • 클래스 이름은 대문자 카멜케이스를 이용해 적는다.

2-2 프로퍼티 & 메서드

class ClassName {
    
    // 가변 프로퍼티
    var mutableProperty: Int = 100 

    // 불변 프로퍼티
    let immutableProperty: Int = 100 
    
    // 타입 프로퍼티
    static var typeProperty: Int = 100 
    
    // 인스턴스 메서드
    func instanceMethod() {
        print("instance method")
    }
}

2-3 타입 메서드 재정의

class ClassName {

    // 재정의 불가 타입 메서드 - static
    static func typeMethod() {
        print("type method - static")
    }
    
    // 재정의 가능 타입 메서드 - class
    class func classMethod() {
        print("type method - class")
    }
}
  • 둘 다 타입 메서드라고 부르지만, 앞에 static/class 키워드에 따라 타입 메서드의 재정의 성질이 달라짐

2-4 클래스 사용

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

// 인스턴스 생성 - 참조정보 수정 불가
let immutableReference: ClassName = ClassName()
immutableReference.mutableProperty = 200
  • 클래스는 구조체와 다르게, mutable(var), immutable(let) 모두 mutableProperty를 사용해줄 수 있음
  • 하지만, mutableReference.immutableProperty = 200, immutableReference.immutableProperty = 200은 둘 다 에러가 남

-> var, let 키워드와 상관없이 내부 mutable property 변경이 가능하다는 특징

// 타입 프로퍼티 및 메서드
Sample.typeProperty = 300
Sample.typeMethod() // type method
  • 타입 프로퍼티를 사용하는 모습도 구조체와 크게 다르지 않음

2-5 클래스 실습

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

    // 키워드도 `로 묶어주면 이름으로 사용할 수 있습니다
    var `class`: String = "Swift"
    
    // 타입 메서드
    class func selfIntroduce() {
        print("학생타입입니다")
    }
    
    // 인스턴스 메서드
    // self는 인스턴스 자신을 지칭하며, 몇몇 경우를 제외하고 사용은 선택사항입니다
    func selfIntroduce() {
        print("저는 \(self.class)\(name)입니다")
    }
}

// 타입 메서드 사용
Student.selfIntroduce() // 학생타입입니다

// 인스턴스 생성
var yagom: Student = Student()
yagom.name = "yagom"
yagom.class = "스위프트"
yagom.selfIntroduce()   // 저는 스위프트반 yagom입니다

// 인스턴스 생성
let jina: Student = Student()
jina.name = "jina"
jina.selfIntroduce() // 저는 Swift반 jina입니다
  • 마지막 jinalet jina: Student로, immutable로 선언했지만, jina.name = "jina"처럼 값을 변경해줄 수 있는 모습을 볼 수 있음

3. 구조체와 클래스의 차이

  • 구조체는 값 타입, 클래스는 참조 타입

4. 구조체와 클래스 선택해서 사용하기

profile
요즘은 https://welcometodannas.tistory.com/에 더 많은 글을 씁니다.

0개의 댓글