Swift/기술 면접

Struct가 무엇이고 어떻게 사용하는지 설명하시오.

수줌이 2022. 5. 8. 13:05

Struct란?

  • Swift 대부분 타입은 구조체로 이루어져 있다.
  • 구조체는 값(value)타입이다.
  • 타입 이름은 대문자 카멜케이스를 사용하여 정의한다.

 

Struct 문법

  • 'struct' 키워드로 구조체를 정의한다.
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.mutableProperty = 200
print("변경된 가변 프로퍼티 값은? ",mutable.mutableProperty)
// ----- 출력값
// 변경된 가변 프로퍼티 값은? 200

// 불변 프로퍼티는 인스턴스 생성 후 수정할 수 없다.
// 컴파일 오류 발생
// mutable.immutableProperty = 200

// 불변 인스턴스 생성
let immutable: Sample = Sample()

// 불변 인스턴스는 아무리 가변 프로퍼티라도
// 인스턴스 생성 후에 수정할 수 없다.
// 컴파일 오류 발생
// immutable.mutableProperty = 200
// immutable.immutableProperty = 200

// 타입 프로퍼티 및 메서드
// 타입 프로퍼티는 인스턴스를 생성하지 않고 바로 사용할 수 있다.
Sample.typeProperty = 300
print("타입 프로퍼티의 변경된 값은 ",Sample.typeProperty)
// ----- 출력값
// 타입 프로퍼티의 변경된 값은 300

Sample.typeMethod()
// ----- 출력값
// type method

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

// 인스턴스 메서드 
mutable.instanceMethod()
// ----- 출력값
// instance method

 

예제) 학생 구조체 만들어보기

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

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

    // 타입 메서드
    static func selfintroduce() {
        print("학생 타입 입니다.")
    }

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

    // 타입 메서드 사용
    Student.selfintroduce()
    // ----- 출력값
    // 학생 타입 입니다.

    // 가변 인스턴스 생성
    var flora : Student = Student()

    // 프로퍼티 사용
    flora.name = "플로라"
    flora.class = "스위프트"

    // 인스턴스 메서드 사용
    flora.selfintroduce()
    // ----- 출력값
    // 저는 스위프트반 플로라입니다.

    // 불변 인스턴스 생성
    let sujeong : Student = Student()
    // 불변 인스턴스이므로 프로퍼티 값 변경 불가
    // 컴파일 오류 발생
    // sujeong.name = "수정"
    sujeong.selfintrodeuce()
    // ----- 출력값
    // 저는 Swift반 unknown입니다.
}

정리

  • 구조체에서 정의한 프로퍼티를 사용하고 싶다면 인스턴스 생성 후 프로퍼티를 사용할 수 있다.
  • 그 중 타입 프로퍼티타입 메서드인스턴스 생성 없이 구조체 이름에 대입하여 바로 사용할 수 있다.
  • 인스턴스 메서드는 생성한 인스턴스와 함께 사용할 수 있다. (타입 메서드와는 다름)
  • 가변 인스턴스 생성 시 가변 프로퍼티는 수정이 가능하지만, 불변 프로퍼티는 인스턴스 생성 후 수정할 수 없다.
  • 불변 인스턴스 생성 시 가변 프로퍼티, 불변 프로퍼티 둘 다 인스턴스 생성 후에 수정할 수 없다.

참고