[Swift] Struct

·2024년 6월 25일
0

Swift 문법

목록 보기
6/16

구조체

여러 프로퍼티와 메서드를 담아 이를 묶어 하나의 사용자 정의 데이터 타입으로 만든 것

구조체와 클래스는 비슷하면서도 차이가 있음.
클래스는 구조체에 여러가지 필요한 기능을 플러스 알파한 것.


구조체 정의

구조체의 정의는 struct 키워드로

struct Student {
}
  • 앞서 말했던 것처럼 하나의 구조체는 결국 사용자가 정의한 데이터 타입이므로 대문자로 선언해야한다.

구조체 인스턴스

struct Student {
    var name = "Min"
    var age = "25"
}

let min = Student()

Student 구조체는 그냥 타입임. 쉽게 이야기하면 틀.
우리가 직접 사용하려면 틀을 이용해 찍어낸 인스턴스를 호출해야 함.

빈 괄호를 작성하면 기본값으로 초기화된다.
나머지 경우는 뒤의 memberwise 초기화 구문을 참고하면 된다.


struct Student {
    var name = "Min"
    let age = 25
}

var min = Student()
print(min) // Student(name: "Min", age: 25)
min.name = "Mini"
print(min) // Student(name: "Mini", age: 25)

인스턴스를 변수에 할당해 보자.


  • 구조체 내부에 var 로 선언된 프로퍼티들은 변경이 가능하다.
  • 물론 let 으로 선언된 멤버 프로퍼티들은 변경할 수 없다.
min.age = 30 // 🚨 Cannot assign to property: 'age' is a 'let' constant

  • 인스턴스 자체를 상수로 선언해도 마찬가지이다.
    min 은 상수로 선언되었으니 수정 불가하다.
let min = Student()
min.name = "Mini" // Cannot assign to property: 'min' is a 'let' constant

프로퍼티에 접근하기

struct Student {
    var name = "Min"
    var age = "25"
}

let min = Student()
print(min.name) // Min

dot syntax(점 찍기)로 인스턴스의 프로퍼티에 접근 가능


struct Student {
    var name = "Min"
    var age = "25"
}

var min = Student()
print(min.name) // Min

min.name = "Min2"
print(min.name) // Min2

minvar로 선언해주면 프로퍼티에 새로운 값 할당 가능


membewise initializer

  • 새로운 구조체 인스턴스에 멤버 프로퍼티를 초기화할 수 있는 간결한 구문
  • 원래는 기본값이 없으면 이런식으로 초기화 구문을 만들어 줘야 함
    init(name: String, age: String) {
    		self.name = name
    		self.age = age
    }

  • 기본값을 가지는 모든 프로퍼티는 memberwise 초기화 구문에서 생략 가능하기도 함
  • 하지만 기본값을 가지지 않는 프로퍼티는 membewise initializer로 무조건 초기화해 줘야 함!
struct Student {
    var name: String
    var age: Int
}

//let min = Student() // error
let min = Student(name: "Min", age: 25) // good 👍🏻
struct Student {
    var name = "Min"
    var age: Int
}

//let min = Student() // error
//let min = Student(name: "Mini") // error
let min = Student(age: 27) // 👍🏻 Student(name: "Min", age: 27)
let mini = Student(name: "mini", age: 26) // 👍🏻 Stuent(name: "mini", age: 26)
  • 참고로 memberwise initializer은 구조체에만 있는 구문임. class에는 존재하지 않음.

구조체는 value type이다

value type: 변수 또는 상수에 할당될 때나 함수에 전달될 때 복사되는 것

배열, 딕셔너리, 문자열 같은 Swift의 collection은 최적화를 하여 복사 성능 비용을 줄임

즉시 복사본을 만드는 대신, 원본 인스턴스 - 복사본 간 요소가 저장된 메모리 공유

복사본 중 하나가 수정되면, 요소는 수정되기 직전 복사됨

→ 우리 눈에는 항상 바로 복사가 일어나는 것처럼 보임

let people = ["Kim", "Lee", "Park", "Choi"]
var newPeople = people // 이때는 저장된 메모리를 공유

// 수정되기 직전 복사되는 것
newPeople[1] = "Nam" 
print(newPeople) // ["Kim", "Nam", "Park", "Choi"]

쉽게 이해할 수 있도록 예시를 들어보자면 요런 느낌?!
swift 공식 document에서 인용해 왔는데 요론식으로 최적화를 하는구나 하고 넘 신기했음


struct Student {
    var name: String
    var age: Int
}

let min = Student(name: "Min", age: 25)
var anotherMin = min

anotherMin.age = 6
print("anotherMin의 나이:", anotherMin.age) // anotherMin의 나이: 6
print("min의 나이:", min.age) // min의 나이: 25a
  • anotherMin은 기존 min의 복사본이 할당
  • min, anotherMin은 아예 다른 인스턴스, 서로 영향을 주지 않음 → value type


Reference

https://bbiguduk.gitbook.io/swift/language-guide-1/structures-and-classes

0개의 댓글

관련 채용 정보