본문 바로가기
🍎 Swift/iOS 학습 노트

[Swift🍎] 타입 메서드와 타입 프로퍼티(Type Method, Type Property) 그리고 객체지향프로그래밍

by 솔비님 2025. 2. 20.
또 복습하다가 나온 그동안 헷갈렸던 타입 메서드&프로퍼티 개념을 정리해봤다
그냥 이렇게 쓰는구나 ❌ → 왜? 이렇게 쓰는지에 중점적으로 정리했음

 

 

 

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: 앱 시작됨"