iOS Swift 문법 - Class / Struct
포스트
취소

iOS Swift 문법 - Class / Struct

안녕하세요. narvis2 입니다.
이번시간에는 Swift 문법에 중에서도 classstruct에 대하여 알아보는 시간을 가지도록 하겠습니다.

🍀 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
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(타입캐스팅)Classinstance 에만 허용
  • Deinitializerclassinstance에만 활용 가능
  • 참조 횟수 계산(Reference Counting)은 Classinstance에만 적용

☘️ 값 타입 / 참조 타입

  • 타입
    • 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_1str_2의 관계는 참조되지 않고 각각의 개별의 관계
  • Class(클래스)는 서로 참조하는 관계를 가지므로 cls_1cls_2참조 관계가 되어 서로에게 영향을 줌
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.