Struct, Class + Protocol

o2k_iOS·2025년 2월 14일

Struct : 구조체

값 타임 -> 메모리에 할당된 값을 복사하여 독립된 인스턴스 생성
상속 불가, 데이터 저장 및 간단한 로직 수행 시 사용

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)

Class

인스턴스에 초기값을 설정해주지 않은 경우에는 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 vs Class

Struct && Class

Struct || Class

구조체와 클래스 선택해서 사용하기

프로젝트의 성격, 데이터의 활용도, 특정 타입 구현 시 Struct, Class 중 선택.

Apple Guide

Struct

  • 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
  • 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
  • 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
  • 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
  • 스레드 안정성이 중요할 때

Class

  • 객체의 고유한 정체성이 필요한 경우
    • 동일 인스턴스를 여러 곳에서 참조하여 사용하고, 변경 사항이 모든 참조에 반영되야하는 경우
  • 상속이 필요한 경우
  • Objc와의 상호 운용성
  • 데이터 수명 주기 관리가 필요한 경우

Protocol

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())
profile
느려도 조금씩 성장

0개의 댓글