정적 변수의 활용 방법을 살펴보기에 앞서, 먼저 Swift에서 정적 변수가 무엇인지 이해해 보겠습니다.
정적 변수(Static Variable)란?
정적 변수는 클래스의 모든 인스턴스(객체)가 값을 공유하는 변수입니다. 어떤 변수를 static으로 선언하면 해당 변수는 특정 객체가 아닌 클래스 자체에 속하게 되며, 정적 변수의 메모리는 클래스가 로드되는 시점에 할당됩니다.
그림으로 살펴보겠습니다. Sample이라는 클래스가 있고, 이 클래스로 생성한 두 객체 s1과 s2가 있다고 가정합니다. s1과 s2는 각각 자신만의 변수 "a"를 별도로 가지고 있지만, 변수 "b"는 두 객체가 함께 공유합니다. 바로 이 공유되는 "b"가 정적 변수입니다.
정적 변수 선언 방법
정적 변수는 변수 선언 앞에 static 키워드를 붙여서 생성합니다.
static let/var 변수이름: 타입(선택) = 값 static let num1: Int = 1 static var name1 = "Akash"
이제 Xcode 플레이그라운드(Playground)를 통해 직접 실습해 보겠습니다.
Xcode → File → Playground를 열고 프로젝트 이름을 "staticvariables"로 지정합니다.
여기서 잠깐! 변수를 let으로 선언하면 값을 수정할 수 없는 상수가 되고, 반대로 var로 선언하면 값을 얼마든지 변경할 수 있는 변수가 됩니다. 이 차이를 기억한 상태로 아래 예제를 살펴보세요.
실습 예제 코드
class Student {
static let section: String = "A" // 정적 상수(static constant)
static var day: String = "Monday" // 정적 변수(static variable)
var name: String = "Akash" // 인스턴스 변수(instance variable)
var rollNum: Int = 1 // 인스턴스 변수(instance variable)
}
let student1 = Student() // 객체 1
print(student1.name) // Akash
print(student1.rollNum) // 1
student1.name = "Aman" // student1의 name 값을 Aman으로 변경
print(student1.name) // Aman
let student2 = Student() // 객체 2
print(student2.name) // Akash
print(Student.section) // A
print(Student.day) // Monday코드 해설
Student 클래스에는 정적 상수 section, 정적 변수 day, 그리고 인스턴스 변수인 name과 rollNum이 선언되어 있습니다.
주목할 점은 정적 멤버에 접근하는 방식입니다. 인스턴스 변수는 student1.name처럼 객체를 통해 접근하지만, 정적 변수는 Student.section, Student.day처럼 클래스 이름 자체로 직접 접근합니다. 이는 정적 변수가 특정 객체에 속하지 않고 클래스 전체에 속하기 때문입니다.
또한 student1의 name을 "Aman"으로 변경해도 새로 생성한 student2의 name은 여전히 초기값 "Akash"를 유지합니다. 인스턴스 변수는 각 객체마다 독립적인 값을 가지기 때문입니다. 만약 여러 객체가 하나의 값을 공유해야 한다면, 정적 변수가 적절한 선택이 됩니다.
정리
- 정적 변수는 클래스의 모든 인스턴스가 공유하는 단일 값을 가집니다.
static let은 변경 불가능한 정적 상수,static var는 변경 가능한 정적 변수를 의미합니다.- 정적 멤버는 객체 생성 없이 클래스 이름으로 바로 접근할 수 있습니다.
- 메모리는 클래스 로딩 시점에 한 번만 할당되므로 효율적입니다.