Swift & iOS

[Swift] 구조체와 클래스 (struct & class)

hammii 2022. 6. 14. 17:13
728x90
반응형

1. 구조체

struct 구조체 이름 {
	프로퍼티와 메서드
}
  • 프로퍼티와 메서드를 합해서 구조체, 클래스의 멤버라고 한다.
    • 멤버 변수 -> 프로퍼티
    • 멤버 함수 -> 메서드

구조체 예시

struct User {
    var nickname: String
    var age: Int
    
    func information() {
        print("\(nickname) \(age)")
    }
}

var user = User(nickname: "hammii", age: 25)	// 구조체 안에 따로 생성자를 선언해두지 않아도, 기본적으로 값을 초기화 할 수 있는 생성자가 만들어진다.
print(user.nickname) // hammii

user.nickname = "하미"
print(user.nickname) // 하미

user.information() // 하미 25

 

2. 클래스

class 클래스 이름 {
	프로퍼티와 메서드
}

클래스 예시

class Dog {
    var name: String = ""
    var age: Int = 0
    
    init(){
    }
    
    func introduce() {
        print("name \(name) age \(age)")
    }
}

var dog = Dog()
dog.name = "iku"
dog.age = 9
dog.introduce() // name iku age 9

 

3. 구조체와 클래스의 공통점

  • 값을 저장할 프로퍼티를 선언할 수 있다.
  • 함수적 기능을 하는 메서드를 선언할 수 있다.
  • 내부 값에 .을 사용하여 접근할 수 있다. (subscript)
  • 생성자를 사용해 초기 상태를 설정할 수 있다.
  • extension을 사용하여 기능을 확장할 수 있다.
  • Protocol을 채택하여 기능을 설정할 수 있다.

 

4. 구조체와 클래스의 차이점

  • 구조체
    • 값 타입
    • 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체가 할당된다.
    • 즉 같은 구조체를 여러 개의 변수에 할당한 뒤 값을 변경시키더라도 다른 변수에 영향을 주지 않는다. (값 자체를 복사)
    • 상속이 불가능
  • 클래스
    • 참조 타입
    • ARC로 메모리를 관리한다. (메모리 stack 영역에는 주소만 할당, heap 영역에 실제 데이터 할당)
    • 상속이 가능
    • 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인할 수 있다.
    • deinit을 사용하여 클래스 인스턴스의 메모리 할당을 해제할 수 있다.
    • 같은 클래스 인스턴스를 여러 개의 변수에 할당한 뒤 값을 변경시키면 모든 변수에 영향을 준다.
class SomeClass {
    var count: Int = 0
}

struct SomeStruct {
    var count: Int = 0
}

var class1 = SomeClass()
var class2 = class1
var class3 = class1

class3.count = 2

class1.count    // 2
class2.count    // 2

var struct1 = SomeStruct()
var struct2 = struct1
var struct3 = struct1

struct2.count = 3
struct3.count = 4

struct1.count   // 0
struct2.count   // 3
struct3.count   // 4

 

 

출처: [패스트캠퍼스] 30개 프로젝트로 배우는 iOS 앱 개발 with Swift 초격차 패키지 Online.

 

728x90
반응형