안녕하세요. narvis2 입니다.
이번시간에는 Swift 문법에 중에서도 class와 struct에 대하여 알아보는 시간을 가지도록 하겠습니다.
🍀 Class
Swift에서는class를 정의하여객체(Object)를 만들고 사용할 수 있음class하나를 만든다면class에서 생성된 객체인 instance 를 만들어 실제 작업에 쓰일 수 있게 해야함instance👉 클래스 초기화, (타입 캐스팅 허용)
상속가능- ✅ 참조 타입
- 변수나 상수에 할당하거나 함수에 넘길 때 복사하지 않음
- 복사 대신에 기존에 같은
instance에 참조가 사용됨 - 즉, 값이 복사되는 것이 아닌 메모리를 참조하는 것
- ✅ 즉,
class는 레퍼런스 타입이기 때문에 아무리 여러 번 전달하더라도 단 하나의instance만 존재 하고, 따라서 그 하나의instnace를 참조하는 어느 한 군데에서instance에 변화를 주게 되면다른 모든 곳에서도 바뀌게 되는특성이 있음 속성(property)👉 클래스 안의변수메서드(method)👉 클래스 안의함수- ✅
init👉instance를 만들때 생성자에인수를 넣을 때 사용self👉 Kotlin 의this와 유사
예제 👇
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Name {
var name = "Choi"
var age: Int
init(name: String, age: Int) { // 초기화
self.name = name
self.age = age
}
func myName() {
print("my name is \(name) and \(age) year's old")
}
}
// instance 화
let name1: Name = Name(name: "choi", age: 29)
let name2: Name = Name(name: "kim", age: 31)
// 프로퍼티 호출
print(name1.name)
// 메서드 호출
name1.myName()
print(name2.name)
name2.myName()
🍀 Struct
instance의값(프로퍼티)를저장하거나기능(메서드)를 제공하고 이를캡슐화할 수 있는Swift가 제공하는Type임class처럼instance화를 하여 실제 작업에도 쓸 수 있음 (타입 캐스팅 허용 안함)
- 불변성(
Immutable) 구현에 유리 Multi Thread에 안전함속성(property)👉 구조체(Struct) 안의 변수메소드(method)👉 구조체(Stuct) 안의 함수- ✅ 값 타입
- 상수나 변수에 할당하거나 함수에 넘겨질 때 복사가 됨
- ✅
Stuct에는 상속할 수 없음 - ✅
class처럼init()메소드를 사용할 필요 없이 자동으로 초기화 코드를 만들어줌- 프로퍼티 속성값을 선언하지 않고 instance 선언시 매개변수로 넣어줌
- 구조체 멤버를 패러미터 네임으로하여
Swift가 자동으로 초기화 코드를 만들어 줌
- ✅ 사용 기준 하나라도 해당되면
Stuct사용- 1️⃣ 몇몇 단순 데이터 값을
캡슐화하는 경우 - 2️⃣
캡슐화한 값을참조하는 것보다복사하는 것이 합당할 때 - 3️⃣
Stuct에 저장된프로퍼티가값 타입이며,참조하는 것보다복사하는 것이 합당할 때 - 4️⃣ 다른
기존 타입으로부터상속받거나 자신을상속할 필요가 없을 때
- 1️⃣ 몇몇 단순 데이터 값을
예제 👇
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Name {
// 프로퍼티 속성값을 선언하지 않고 instance 선언시 매개변수로 넣어줌
var name: String
func myName() {
print("my name is \(name)")
}
}
// instance 생성
var choi: Name = Name(name: "choi")
print(choi.name) // 프로퍼티 호출
choi.myName() // 메서드 호출
🍀 Class / Struct 공통점 및 차이점
☘️ 공통점
- 여러 변수(
property)와 함수(method)를 담을 수 있는 하나의 집합 - 데이터를 용도에 맞게 묶어서 사용할때 편리하고 가독성을 높여줌
- 초기화(
init())를 정의하여 여러 매개변수에 대해 다양한instance를 생성 가능 - 기본적인 구현을 넘어선 기능을 확장시킬 수 있도록 확장 가능
.을 사용하여instance생성이 가능하고 생성 방법이 같음- 특정 종류의 표준 기능을 제공하는
protocal을 사용 가능 - 새로운 데이터 타입을 만들어 주는 것
☘️ 차이점
Struct에는init()method없이 자동으로 초기화 함수를 만들어 줌Class👉 상속 가능,Struct👉 상속 불가Class👉 값 타입 ,Struct👉 참조 타입TypeCasting(타입캐스팅)은Class의instance에만 허용Deinitializer는class의instance에만 활용 가능- 참조 횟수 계산(Reference Counting)은
Class의instance에만 적용
☘️ 값 타입 / 참조 타입
값타입Stuct,enum에 해당상수나변수에할당하거나함수에 넘겨질 때복사가 됨
참조타입Class에 해당변수나상수에할당하거나함수에 넘길 때복사하지 않음- 복사 대신에 기존에 같은
instance에 참조가 사용됨 - 즉, 값이 복사되는 것이 아닌 메모리를 참조하는 것
예제 👇
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct A { // 구조체 (상속이 안됨)
var a = 10
}
class B { // 클래스 (상속 가능)
var a = 10
}
// instance 선언
var str_1: A = A() // 값을 복사 - a 값을 바꿔도 struct 안의 a는 변화 없음
var cls_1: B = B() // 값을 참조 - a 값을 바꾸면 class 안의 a도 바뀜
var str_2 = str_1
var cls_2 = cls_1
str_1.a = 20
cls_1.a = 20
// 구조체에는 변화 없지만 클래스에는 변화가 있음
print("\(str_2.a) \(cls_2.a)") // 결과 : 10 20
설명
Struct(구조체)는 그저복사를 하여str_1과str_2의 관계는 참조되지 않고 각각의개별의 관계Class(클래스)는 서로참조하는 관계를 가지므로cls_1과cls_2는참조 관계가 되어 서로에게 영향을 줌