[Swift] Struct, Class

Lena·2021년 8월 27일
0

Comparing Structures and Classes

Class

  • 클래스는 단일 상속만 가능하다.
  • instance / type method, instance / type property를 갖는다.
  • reference 타입이다.
    • 클래스의 인스턴스는 전달될 때 포인터를 전달한다 = 전달되는 곳 어디서든 원본에 접근이 가능함
class Point {
    var x = 0.0
    var y = 0.0
}

let point = Point()
var comparePoint = point // 인스턴스를 복사
comparePoint.x = 5
print(comparePoint.x, point.x) // 5.0, 5.0

Struct

  • 구조체는 상속이 불가능하다.
  • instance / type method, instance / type property를 갖는다.
  • value 타입이다.
    • 구조체의 인스턴스는 복사된다.(쓰기 시 복사 방식, 값이 실제로 변경(set)될 때 실제 복사가 이뤄짐, 원본이 변경되지 않음)
    • 상속은 불가능하지만, 프로토콜 채택은 가능하다.
struct Point {
    var x = 0.0
    var y = 0.0
}

let point = Point()
var comparePoint = point // 인스턴스를 복사
comparePoint.x = 5
print(comparePoint.x, point.x) // 5.0, 0.0

Class and Struct

  • 서로 다른 자료형을 하나로 묶는다.
  • 이렇게 묶은 자료형들을 새로운 type으로 사용할 수 있다.
  • 클래스와 구조체 안에서 함수와 프로퍼티를 정의할 수 있다.
  • extension이 가능하다.

Example code

/* struct */
struct Sample {
    // 가변 프로퍼티(값 변경 가능)
    var mutableProperty: Int = 100
    
    // 불변 프로퍼티(값 변경 불가능)
    let immutableProperty: Int = 100

    // 타입 프로퍼티(static 키워드 사용: 타입 자체가 사용하는 프로퍼티)
    static var typeProperty: Int = 100

    // 인스턴스 메서드(인스턴스가 사용하는 메서드)
    func instanceMethod(){
        print("instance method")
    }
    
    // 타입 메서드(static 키워드 사용: 타입 자체가 사용하는 메서드)
    static func typeMethod(){
        print("type method")
    }
}

var mutable: Sample = Sample() // 가변 인스턴스 생성
//인스턴스에서는 타입 프로퍼티나 타입 메서드를 사용할 수 없음
//mutable.typeProperty = 400 // 컴파일 오류
//mutable.typeMethod() // 컴파일 오류

Sample.typeProperty = 300 //구조체의 타입 프로퍼티 사용(새로운 value 할당)
Sample.typeMethod // type method //구조체의 타입 메서드 호출

let immutable: Sample = Sample() // 불변 인스턴스 생성
//immutable.mutableProperty = 200 // 불변 인스턴스는 가변 프로퍼티라도 인스턴스 생성 후 수정 불가 // 컴파일 오류

/* note */
// 타입(static) or 인스턴스 분류할 수 있고, 
// 타입은 그 자체로, 인스턴스는 생성 후 사용 가능함을 의미한다.

/* class */
// class의 type method는 상속 시 override 할 수 없다.

class SuperClass {
    // 인스턴스 메서드
    func instanceMethod(){
        print("instance method")
    }
    
    // 타입 메서드(상속 시 override 불가능)
    static func typeMethod(){
        print("type method")
    }
}

class SubClass: SuperClass {
    override func instanceMethod() {
        print("override instance method")
    }  
}

var superClass: SuperClass = SuperClass()
superClass.instanceMethod() // prints "instance method"

var subClass: SubClass = SubClass()
subClass.instanceMethod() // prints "override instance method"

Conclusion

  • 구조체는 클래스에 비해 시스템 리소스를 적게 사용한다.
  • 자료형을 캡슐화하는 것이 주목적이라면 구조체를 사용하는 것을 권장
  • 상속이 필요없고, 인스턴스 전달 시 참조보다는 복사가 예상될 경우 구조체 사용을 권장
  • 그 외의 경우 클래스를 사용 - 대부분의 사용자 데이터는 클래스로 정의되어야 한다.

References

https://zeddios.tistory.com/12
https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes

0개의 댓글