값 타임 -> 메모리에 할당된 값을 복사하여 독립된 인스턴스 생성
상속 불가, 데이터 저장 및 간단한 로직 수행 시 사용
Stack영역 - 프로그램이 자동으로 사용하는 임시 메모리 영역
LIFO 구조
함수 호출 시 함수의 지역변수, 매개변수, 반환 값 등이 저장되고 함수가 종료되면 저장된 메모리도 해제.
컴파일 시점에 결정되기 때문에 무한히 할당 X
Swift에서 제공되는 데이터 타입들은 Struct 구조체
struct User {
var name: String
var age: Int
}
var a = User(name: "만두", age: 3)
var b = User(name: "계란", age: 5)
print(a)
print(b)
[a.name](http://a.name/) = "계란"
a.age = 5
[b.name](http://b.name/) = "닭"
b.age = 10
print(a)
print(b)
인스턴스에 초기값을 설정해주지 않은 경우에는 initializer를 통해 인스턴스 초기화를 시켜주어야 합니다.
참조타입 - 값 타입에서 메모리의 해당 값을 복사해오는 것이 아닌 메모리 주소를 참조
→ 메모리 내의 값이 변하게 되면 참조하고 있는 클래스의 값도 바뀌게 됩니다
UIKit에서 제공되는 대부분의 UI요소는 Class (일부 예외 케이스 존재)
class User {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let a = User(name: "만두", age: 3)
let b = a
print("a : \(a.name), \(a.age)")
print("b : \(b.name), \(b.age)")
a.name = "계란"
a.age = 5
print("a : \(a.name), \(a.age)")
print("b : \(b.name), \(b.age)")
Struct && Class
Struct는 초기화 구문을 정의하지 않는 경우 자동으로 Memberwise Initializer를 받게 됩니다.Class는 반드시 초기값이 할당 되어야 합니다.저장 프로퍼티에 초기값 직접 설정init키워드로 정의convenience 키워드로 정의Struct || Class
구조체와 클래스 선택해서 사용하기
프로젝트의 성격, 데이터의 활용도, 특정 타입 구현 시 Struct, Class 중 선택.
Apple Guide
Struct
Class
Protocol을 직역하면 규약
protocol 내에 선언된 메서드는 해당 protocol이 채택되었다면 반드시 사용되어야 합니다.
extension을 통해 protocol을 확장해서 사용 가능
protocol Greetable {
func greet() -> String
}
extension Greetable {
func greet() -> String {
return "Hello!"
}
}
struct Person: Greetable {
var name: String
func greet() -> String {
return "Hello, \(name)!"
}
}
let person = Person(name: "Alice")
print(person.greet()) // "Hello, Alice!"
class Robot: Greetable {
var id: String
init(id: String) {
self.id = id
}
func greet() -> String {
return "Hello, \(id)!"
}
}
let robot = Robot(id: "Robot")
print(robot.greet())
struct Alien: Greetable {
var name: String
func greet() -> String {
return "Hello, \(name)!"
}
}
let alien = Alien(name: "외계인")
print(alien.greet())
struct sample: Greetable {}
let sampleProtocol = sample()
print(sampleProtocol.greet())