Struct 구조체
- 구조체는 값(value) 타입이다.
- 타입 이름은 대문자 카멜케이스를 사용하여 정의한다.
- 스위프트 대부분 타입은 구조체로 이루어져 있다.
구조체 정의
struct 이름 {
/* 구현부 */
}
구조체 프로퍼티 및 메서드
struct Sample {
// 가변 프로퍼티(값 변경 가능)
var mutableProperty: Int = 100
// 불변 프로퍼티(값 변경 불가능)
let immutableProperty: Int = 100
// 타입 프로퍼티(static 키워드 사용 : (sample이라는) 타입 자체가 사용하는 프로퍼티)
static var typeProperty: Int = 100
// 인스턴스 메서드(인스턴스가 사용하는 메서드)
func instanceMethod() {
print("instance method")
}
// 타입 메서드(static 키워드 사용 : 타입 자체가 사용하는 메서드)
static func typeMethod() {
print("type method")
}
}
프로퍼티의 종류
가변 프로퍼티 - var / 값 변경 가능
불변 프로퍼티 - let / 값 변경 불가능
타입 프로퍼티 - static 키워드 사용 / 타입 자체가 사용하는 프로퍼티
메서드의 종류
인스턴스 메서드 - 그냥 func / 인스턴스가 사용하는 메서드
타입 메서드 - static func / 타입 자체가 사용하는 메서드
구조체 사용
// 가변 인스턴스 생성
var mutable: Sample = Sample()
mutable.mutableProperty = 200
// 불변 프로퍼티는 인스턴스 생성 후 수정할 수 없습니다
// 컴파일 오류 발생
//mutable.immutableProperty = 200
가변 인스턴스
// 불변 인스턴스
let immutable: Sample = Sample()
// 불변 인스턴스는 아무리 가변 프로퍼티라도 인스턴스 생성 후에 수정할 수 없습니다 ! !
//immutable.mutableProperty = 200 // 컴파일 오류 발생
//immutable.immutableProperty = 200
불변 인스턴스
// static 붙였던 타입 자체의 프로퍼티 및 메서드로는 사용 가능 ! !
Sample.typeProperty = 300
Sample.typeMethod() // type method
// 인스턴스에서는 타입 프로퍼티나 타입 메서드를 사용할 수 없습니다 ( static 사용한 것들 )
// 컴파일 오류 발생
//mutable.typeProperty = 400
//mutable.typeMethod()
구조체와 인스턴스
예제 - 학생 구조체
struct Student {
// 가변 프로퍼티
var name: String = "unknown"
// 키워드도 `로 묶어주면 이름으로 사용할 수 있습니다
var `class`: String = "Swift"
// 타입 메서드
static func selfIntroduce() {
print("학생타입입니다")
}
// 인스턴스 메서드
// self는 인스턴스 자신을 지칭하며, 몇몇 경우를 제외하고 사용은 선택사항입니다
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다")
}
}
// 타입 메서드 사용 ( Student struct자체의 메서드로 사용
Student.selfIntroduce() // 학생타입입니다
// 가변 인스턴스 생성
var ony: Student = Student()
ony.name = "ony"
ony.class = "스위프트"
ony.selfIntroduce() // 저는 스위프트반 ony입니다
// 불변 인스턴스 생성
let jina: Student = Student()
// 불변 인스턴스이므로 프로퍼티 값 변경 불가
// 컴파일 오류 발생
//jina.name = "jina"
jina.selfIntroduce() // 저는 Swift반 unknown입니다
Class 클래스
- 클래스는 참조(reference) 타입이다. (struct는 값타입인 반면에
- 타입이름은 대문자 카멜케이스를 사용하여 정의한다.
- Swift의 클래스는 다중 상속이 되지 않는다.
클래스 정의
class 이름 {
/* 구현부 */
}
프로퍼티 및 메서드
class Sample {
var mutableProperty: Int = 100 //가변 프로퍼티
let immutableProperty: Int = 100 //불변 프로퍼티
static var typeProperty: Int = 100 //타입 프로퍼티
//인스턴스 메서드
func instanceMethod() {
print("instance method")
}
// ---- 이까지 struct와 비슷함 !
//타입 메서드
//재정의 불가 타입 메서드 - static
static func typeMethod() {
print("type method - static")
}
//재정의 가능 타입 메서드 - class
class func classMethod() {
print("type method - class")
}
}
프로퍼티의 종류
가변 프로퍼티 - var / 값 변경 가능
불변 프로퍼티 - let / 값 변경 불가능
타입 프로퍼티 - static 키워드 사용 / 타입 자체가 사용하는 프로퍼티
메서드의 종류
인스턴스 메서드 - 그냥 func / 인스턴스가 사용하는 메서드
재정의 불가 타입 메서드 - static func
재정의 가능 타입 메서드 - class func
클래스 사용
var mutableReference: Sample = Sample()
mutableReference.mutableProperty = 200
//mutableReference.immutableProperty = 200 - 오류발생 / 불변 프로퍼티는 변경 불가
let immutbleReference: Sample = Sample()
immutbleReference.mutableProperty = 200 // struct와 다륵게 클래스는 불변 인스턴스의 가변프로퍼티는 변경 가능 ! !
//immutableReference.immutableProperty = 200 - 오류발생 / 불변 프로퍼티는 변경 불가
//immutbleReference = mutableReference
//타입 프로퍼티 및 메서드
Sample.typeProperty = 300
Sample.typeMethod() //type method
//인스턴스에서는 타입 프로퍼티와 메서드 사용 불가
// mutableReference.typeProperty = 300
// mutableReference.typeMethod()
가변 인스턴스
불변 인스턴스
구조체와 인스턴스
예제 - 학생 클래스
class Student {
// 가변 프로퍼티
var name: String = "unknown"
// 키워드도 `로 묶어주면 이름으로 사용할 수 있습니다
var `class`: String = "Swift"
// 타입 메서드
class func selfIntroduce() {
print("학생타입입니다")
}
// 인스턴스 메서드
// self는 인스턴스 자신을 지칭하며, 몇몇 경우를 제외하고 사용은 선택사항입니다
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다")
}
}
// 타입 메서드 사용
Student.selfIntroduce() // 학생타입입니다
// 인스턴스 생성
var ony: Student = Student()
ony.name = "ony"
ony.class = "스위프트"
ony.selfIntroduce() // 저는 스위프트반 ony입니다
// 인스턴스 생성
let jina: Student = Student()
jina.name = "jina" //구조체와 다르게 불변 인스턴스에서도 가변 프로퍼티 변경가능 !
jina.selfIntroduce() // 저는 Swift반 jina입니다