또 복습하다가 나온 그동안 헷갈렸던 타입 메서드&프로퍼티 개념을 정리해봤다
그냥 이렇게 쓰는구나 ❌ → 왜? 이렇게 쓰는지에 중점적으로 정리했음
01. 타입 메서드와 타입 프로퍼티(Type Method, Type Property)
타입 메서드와 타입 프로퍼티는 클래스, 구조체, 열거형의 타입 자체에 속한다
즉 인스턴스를 생성하지 않아도 직접 타입에서 호출할 수 있으며 static 키워드를 사용한다
*프로퍼티: class, struct, enum에서 사용되는 상수나 변수
02. 인스턴스 프로퍼티와 타입 프로퍼티
일반적인 경우인 인스턴스 프로퍼티는 객체(인스턴스)를 만들어서 사용한다
아래 코드에서 name과 age는 인스턴스 프로퍼티라서 p1와 같은 객체를 만들어야 접근이 가능하다
struct Person {
var name: String
var age: Int
}
let p1 = Person(name: "Alice", age: 25) // 인스턴스 생성
print(p1.name) // "Alice"
하지만 타입 프로퍼티는 개별 인스턴스가 아니라 타입 자체에 속하는 값이다
아래와 같이 static 사용으로 인스턴스 없이 바로 접근이 가능하다
struct Math {
static let pi = 3.141592
}
print(Math.pi) // 인스턴스를 만들지 않고 접근 가능
03. 인스턴스 메서드와 인스턴스 메서드
타입 메서드도 동일하다
보통의 인스턴스 메서드는 특정 객체에서만 호출할 수 있다(myCounter)
struct Counter {
var count = 0
mutating func increase() {
count += 1
}
}
var myCounter = Counter() // 인스턴스 생성
myCounter.increase() // count가 1 증가
print(myCounter.count) // 1
하지만 타입 메서드는 바로 호출이 가능하다
struct Math {
static func square(_ num: Int) -> Int {
return num * num
}
}
print(Math.square(5)) // 25
나는 롤에서 스태틱 단검 생각하면서 외웠다 ㅋㅋㅋ
약간 느낌은 비슷하니까...
그럼 타입 프로퍼티/메서드처럼 바로 접근하면 편한데 왜 굳이 인스턴스 프로퍼티/메서드를 일반적으로 사용할까?
04. 인스턴스가 필요한 이유
인스턴스를 생성해서 사용하는 이유는 객체 지향 프로그래밍에서 데이터의 안전한 관리와 독립적인 상태 유지때문이다
4-1. 개별 데이터 관리
아래와 같이 인스턴스를 사용하면 각 객체가 독립적인 상태를 가질 수 있고 각 인스턴스마다 다른 데이터를 저장할 수 있다
struct Person {
var name: String
var age: Int
}
let person1 = Person(name: "Alice", age: 25)
let person2 = Person(name: "Bob", age: 30)
print(person1.name) // Alice
print(person2.name) // Bob (독립적인 값 유지)
👉 person1과 person2는 서로 다른 값을 가지므로, 한 객체의 값이 변경되어도 다른 객체에 영향을 주지 않는다
4-2. 데이터 보호(Encapsulation, 캡슐화)
아래와 같이 private 접근 제어자를 사용하면 외부에서 직접 값을 변경할 수 없게 보호할 수 있다
class BankAccount {
private var balance: Int = 0
func deposit(amount: Int) {
balance += amount
}
func getBalance() -> Int {
return balance
}
}
let myAccount = BankAccount()
// myAccount.balance = 1000 // ❌ 오류 (직접 접근 불가)
myAccount.deposit(amount: 1000) // ✅ 정상적으로 입금
print(myAccount.getBalance()) // 1000
👉 balance를 private으로 선언하면 외부에서 직접 값을 변경할 수 없고, deposit() 같은 메서드를 통해서만 안전하게 수정할 수 있음
4-3. 메모리 관리와 최적화
또한 인스턴스 생성 후 사용 시 필요한 메모리만큼 할당해서 사용이 가능하므로
필요없을 경우 메모리 해제(Garbage Collection)를 통해 메모리를 최적화하여 관리할 수 있다(필요한 객체만 유지)
05. 타입 프로퍼티/메서드는 언제 사용하는가?
그렇다면 이러한 장점을 두고 타입 프로퍼티/메서드는 언제 사용하는가? 라는 생각이 드는데..
타입 프로퍼티/메서드는 바로 인스턴스 없이 공통적인 값과 기능이 필요할 때 사용된다
ex1. 앱 전체에서 사용되는 URL
struct Configuration {
static let apiBaseURL = "https://api.example.com"
}
print(Configuration.apiBaseURL) // "https://api.example.com"
ex2. 단순 연산이나 기능을 제공할 때(상태 유지가 필요없는 경우)
ex3. 싱글톤 패턴
앱 전체에서 하나의 객체만 공유해야할 때
class Logger {
static let shared = Logger() // 유일한 인스턴스
private init() {} // 외부에서 인스턴스 생성 방지
func log(_ message: String) {
print("LOG:", message)
}
}
Logger.shared.log("앱 시작됨") // "LOG: 앱 시작됨"
'🍎 Swift > iOS 학습 노트' 카테고리의 다른 글
[Swift🍎] Struct&Enum에서 mutating의 역할 (0) | 2025.02.19 |
---|---|
[Swift🍎] rawValue: 원시값 (0) | 2025.02.13 |
[Swift🍎] URLSession 뜯어보기 (0) | 2025.01.17 |
[Swift🍎] tableView, collectionView 식별자 간단하게 관리하기! (1) | 2024.10.31 |
[Swift🍎] RxSwift로 UITableView에 bind 하기 (0) | 2024.10.31 |