swift 기본문법 - 구조체와 클래스
15 Jan 2020 | swift개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.
구조체(struct)
대부분의 타입이 구조체로 이루어져있음 > 타입을 정의 > 값 타입
struct 이름 {
구현부
}
예시는 아래와 같다.
struct Sample {
// 인스턴스 프로퍼티
var mutableProperty: Int = 100 // 가변 프로퍼티
let immutableProperty: Int = 100 // 불변 프로퍼티
// 타입 프로퍼티
static var typeProperty: Int = 100
// 인스턴스 메서드
func instanceMethod() {
print("instance method")
}
// 타입 메서드
static func typeMethod() {
print("type method")
}
}
프로퍼티: 구조체 안에 들어가는 인스턴스 변수
메서드: 구조체 안에 들어가는 함수
구조체 사용
// 가변 인스턴스 > 인스턴스에서 사용하는 프로퍼티
// Sample이라는 구조체가 타입이 된다.
var mutable: Sample = Sample()
mutable.mutableProperty = 200
mutable.immutableProperty = 200 // 프로퍼티 선언 자체에서 불변으로 선언한 프로퍼티의 값은 변경 불가능하다.
// 불변 인스턴스 > 인스턴스에서 사용하는 프로퍼티
let immutable: Sample = Sample()
immutable.mutableProperty = 100 // 가변 프로퍼티로 설정했다고 하더라도 불변 인스턴스의 갑은 변경 불가능하다.
// 타입 프로퍼티 및 메서드 > Sample이라는 구조체 타입 자체가 사용할 수 있는 프로퍼티, 메서드
Sample.typeProperty = 300
Sample.typeMethod() // type method
// 인스턴스에서 타입 프로퍼티를 사용하는 것은 불가능하다.
mutable.typeProperty = 400
mutable.typeMethod()
예시는 아래와 같다.
struct Student {
var name: String = "unknown"
var `class`: String = "Swift"
// 타입메서드
static func selfIntroduce() {
print("학생 타입입니다...")
}
// 인스턴스 메서드
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다...")
}
}
Student.selfIntroduce() // 학생 타입입니다...
var zehye: Student = Student()
zehye.name = "zehye"
zehye.class = "스위프트"
zehye.selfIntroduce() // 저는 스위프트반 zehye입니다...
let kina: Student = Student() // 불변 인스턴스로 프로퍼티값 변경 불가능
kina.name = kina
kina.selfIntroduce() // 저는 스위프트반 unknown입니다...
클래스(class)
구조체와 거의 비슷하지만 값타입인 구조체와는 다르게 클래스는 참조타입 이다.
더 나아가, 다중상속이 불가능하다.
class 이름 {
구현부
}
예시는 아래와 같다.
class Sample {
var mutableProperty: Int = 100
let immutableProperty: Int = 100
static var typeProperty: Int = 100
func instanceMethod() {
print("instance method")
}
// 타입 메서드
// 상속을 받았을 때, 재정의 불가 타입 메서드 - static
static func instanceMethod() {
print("type method - static")
}
// 상속을 받았을 때, 재정의 가능 타입 메서드 - class
class func classMethod() {
print("type method - class")
}
}
클래스
클래스는 구조체와 다르게 let, var로 인스턴스 설정하였다고 하더라도 가변 프로퍼티를 통해 값 변경이 가능하다.
var mutableReference: Sample = Sample()
let immutableReference: Sample = Sample()
mutableReference.mutableProperty = 300
immutableReference.mutableProperty = 300
// 불변 프로퍼티를 통한 값변경은 당연히 불가능하다.
mutableReference.immutableProperty = 200
immutableReference.immutableProperty = 200
// 타입 프로퍼티 및 메서드
Sample.typeProperty = 300
Sample.typeMethod()
예시는 아래와 같다.
class Student {
var name: String = "unknown"
var `class`: String = "Swift"
class func selfIntroduce() {
print("학생 타입입니다...")
}
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다...")
}
}
Student.selfIntroduce() // 학생 타입입니다...
var zehye: Student = Student()
zehye.name = "지혜"
zehye.class = "스위프트"
zehye.selfIntroduce() // 저는 스위프트반 지혜입니다...
// 구조체와 다르게 가변프로퍼티를 let으로 선언한 인스턴스의 값도 변경이 가능하다.
let kina: Student = Student()
kina.name = "키나"
kina.class = "스위프트"
kina.selfIntroduce() // 저는 스위프트반 키나입니다...