Day 7 - 2023.01.11
스위프트에서 대부분 타입은 구조체로 이루어져 있고 값(Value) 타입이다.
구조체는 타입을 정의하는 것이기 때문에 대문자 카멜케이스를 사용하여 정의한다.
구조체는 "struct" 키워드를 사용한다.
struct.swift
struct 이름 {
/* 구현부 */
}
예로 구조체 구현을 하자면
sample.swift
// MARK: 구조체 생성
struct Sample {
// 가변 프로퍼티 (값 변경 가능)
var mutableproperty: Int = 100
// 불변 프로퍼티 (값 변경 불가능)
let immutableProperty: Int = 100
// 타입 프로퍼티 (static 키워드 : 타입 자체가 사용하는 프로퍼티)
static var typerProperty: Int = 100
// 인스턴스 메서드 (인스턴스가 사용하는 메서드)
func instanceMethod() {
print("instance method")
}
// 타입 메서드 (static 키워드 : 타입 자체가 사용하는 메서드)
static func typeMethod() {
print("type method")
}
}
// MARK: 구조체 사용
// 가변 인스턴스
var mutable: Sample = Sample()
mutable.mutableProperty = 200 // 200
mutable.imuutableProperty = 200 // 불변 프로퍼티로 값 변경으로 인한 오류 발생
// 불변 인스턴스
let immutable: Sample = Sample()
immutable.mutableProperty = 200 // 불변 인스턴스는 가변 프로퍼티라도 수정 불가능
immutable.immutableProperty = 200 // 오류 발생
// 타입 프로퍼티 및 메서드
Sample.typeProperty = 300
Sample.typeMethod() // 출력 : type method
// 인스턴스에서는 타입 프로퍼티나 타입 메서드 사용 불가
mutable.typeProperty = 400 // 오류 발생
mutable.typeMethod() // 오류 발생
student.swift
// MARK: 구조체 생성
struct Student {
// 가변 프로퍼티
var name: String = "unknown"
// 키워드도 `로 묶어주면 이름으로 사용할 수 있다.
`class`: String = "Swift"
// 타입 메서드
static func selfIntroduce() {
print("학생타입 입니다.")
}
// 인스턴스 메서드 (self는 인스턴스 자신을 자칭하며, 몇몇 경우를 제외하고 사용은 선택사항 이다.)
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다.")
}
}
// MARK: 구조체 사용
Student.selfIntroduce() // 출력 : 학생타입 입니다.
// 가변 인스턴스 생성
var jamong: Student = Student()
jamong.name = "jamong"
jamong.class = "스위프트"
jamong.selfIntroudce() // 출력 : 저는 스위프트반 jamong입니다.