클래스와 구조체에서 인스턴스 프로퍼티나 타입 프로퍼티, 인스턴스 메서드나 타입 메서드를 정의할 수 있다.
사실 메서드나 프로퍼티나 메서드와 프로퍼티라는 점이 다를뿐 인스턴스냐 타입이냐에서 나오는 차이는 같기 때문에 이 글에서는 인스턴스 프로퍼티와 타입 프로퍼티를 위주로 이야기할 것이다.
인스턴스 프로퍼티
먼저, 인스턴스 프로퍼티는 우리가 지금껏 보아왔던 일반적인 프로퍼티들을 말한다. class, static keyword가 붙지 않은 프로퍼티들이 이곳에 속하며, 클래스나 구조체 안에 존재하는 인스턴스 프로퍼티의 경우에는 해당 클래스나 구조체의 인스턴스를 선언해 주어야 인스턴스 프로퍼티를 사용할 수 있다.
타입 프로퍼티
타입 프로퍼티는 class와 static으로 나누어 진다.
type 프로퍼티는 일반적으로 지연저장 프로퍼티처럼 동작하며, 사용하는 순간 메모리에 올라가서 앱 종료 시까지 메모리에 유지되기 때문에 전역변수와 유사하게 동작한다.
일반적인 인스턴스 프로퍼티의 경우에는 선언하는 순간 메모리를 차지하는데, 타입 프로퍼티의 경우에는 앞서 말했듯 지연 저장 프로퍼티(lazy)처럼 동작한다.
사용하는 순간 메모리에 올라가기 때문에, 클래스나 구조체 안에 선언 후 클래스나 구조체의 인스턴스를 만들지 않아도 타입 프로퍼티에는 접근 가능하다.
인스턴스가 아무리 많이 만들어져도 타입 프로퍼티에는 영향을 주지 않으며, 한 공간에만 저장되어 있기 때문에 인스턴스가 아무리 많아도 타입 프로퍼티는 기존에 타입에 선언한 프로퍼티 오직 하나이다.
예시를 들어 보자.
class Hamster {
static let species: String = "Hamster"
var name: String
var weight: Double
init(name: String, weight: Double) {
self.name = name
self.weight = weight
}
}
여기 햄스터라는 구조체가 있다.
햄스터는 모두 종이 햄스터로 같으므로, 여러 개의 인스턴스에 각각 존재할 필요가 없어 static으로 선언해 주었다.
반면, 매번 달라질 수 있는 햄스터의 이름이나 몸무게는 일반 인스턴스 프로퍼티로 선언해 주었다.
Hamster.species
Hamster.name // error!!
이후, 인스턴스를 선언하지 않고 타입 프로퍼티와 인스턴스 프로퍼티를 불러보았다.
위의 species 프로퍼티의 경우에는 Hamster라고 출력되나, 아래 Hamster.name에 접근하게 되면 그대로 에러가 난다.
왜냐하면 인스턴스를 선언하지 않고 인스턴스 프로퍼티에 접근하려고 했기 때문이다.
let myHamster = Hamster(name: "Jerard", weight: 62.0)
myHamster.name // Jerard
myHamster.weight // 62.0
자, 이번에는 제라드라는 햄스터를 선언해 보았다.
이렇게 인스턴스를 선언하고 인스턴스 프로퍼티에 접근하면 ... ...
오, 잘 나온다.
어라? 근데 이상한 점이 있다.

인스턴스에 점문법을 썼을 때 타입 프로퍼티가 보이지 않는다.
왜일까?
그건 인스턴스 프로퍼티의 경우에는 인스턴스에서만 사용 가능하고, 타입 프로퍼티의 경우에는 타입에서 사용할 수 있기 때문이다.
그럼에도 친해져 보라고 일단 코드를 써 보면...

그냥 오류를 뱉는다.
그러니 타입에는 타입 메서드와 타입 프로퍼티를, 인스턴스에는 인스턴스 메서드와 인스턴스 프로퍼티를 써 주자. 아! 인스턴스 메서드와 프로퍼티를 쓰기 위해서는 인스턴스를 선언하고 초기화해주는 걸 잊지 말자!!
근데 여기서 궁금증이 생긴다.
왜 타입 프로퍼티는 굳이? let과 var로 나뉠까?
어차피 let으로밖에 안 쓰일 것 같은데.
열심히 짱구를 굴리다가 검색해 보니 적절한 예시를 찾고 이해했기에 같이 공유한다.
static let species: String = "Hamster"
static var count: Int = 0
var name: String
var weight: Double
init(name: String, weight: Double) {
self.name = name
self.weight = weight
Hamster.count += 1
}
}
아까 보았던 익숙한 햄스터 친구를 수정해 주었다.
하지만 뭔가 조금 달라졌다!
바로 count 변수가 추가되었다.
이 친구는 자동으로 생성자에서 호출되어 앞으로 햄스터 인스턴스가 생성되었을 때 몇 개나 생성되었는지 알려줄 것이다.
이런 식으로 뭔가 변화를 관찰해야 할 때 쓰이는 것 같다.
말 그대로 타입에 적용되는 단 하나의 속성이기 때문에 우리가 let / var 를 일반적으로 나누어 썼던 것처럼 변할 것 같은 사항이면 var를, 아니면 일단 let을 쓴 이후에 변할 것 같으면 var로 바꿔 줘도 괜찮다.
근데 타입 속성 두 개 있다고 하지 않았나?
맞다. class와 static 두 개 있다!
class의 경우에 알 수 있듯이 클래스, 상속에 관련된 곳에서 차이가 있다.
static의 경우에는 메서드 오버라이딩, 즉 상속이 불가능하다!
반면, class의 경우에는 메서드 오버라이딩이 가능하다.
간단한 예시를 들어 보자면...
class yeonee {
class func hello() {
print("hello?")
}
static func hi() {
print("hi?")
}
}
class neeenee: yeonee {
override class func hello() {
print("hello!")
}
override static func hi() {
print("hi!")
}
}
yeonee class는 class method hello()와 static method hi()가 있다.
그리고 yeonee class를 상속받는 neenee class가 있다고 하자.
여기서, 각 타입 프로퍼티를 상속받으려고 코드를 작성했다.
컴파일이 되는지 보자.

와~ 역시 터진다.
둘의 차이는 메서드 오버라이딩의 차이!
상속이 가능하냐 불가능하냐의 차이! 라고 보면 될 것 같다.
아무튼 끝~~~!!!
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties
Documentation
docs.swift.org
https://babbab2.tistory.com/122
Swift) static? class? 메서드 완벽 정복하기
안녕하세요 :))) 소들입니다!!!! 저번 포스팅에서 프로퍼티의 종류와 특징에 대해 다 공부 해봤어요! 프로퍼티 종류엔 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티에 대해 알아봤져!? 프로퍼티
babbab2.tistory.com
https://m.blog.naver.com/dd1587/221106199316
C언어 static변수(정적변수)
C언어 static변수(정적변수)C언어 static변수에 대해 알아보려고하는데요. static변수는 한글로는 ...
blog.naver.com
[Swift] static과 class method, property 효과적으로 사용하기
Effectively using static and class methods and properties 번역글
sujinnaljin.medium.com
스위프트에서 static 키워드란? 'static' in swift
부제 : 어제 읽었는데 오늘 아침되니 까먹어서 결국 정리하는 글 "스위프트에서 Static은 '타입' 프로퍼티 혹은 '타입' 함수를 의미한다. 'static'과 'class' 프로퍼티/함수와의 차이점은 'class' 프로퍼
varyeun.tistory.com
'iOS' 카테고리의 다른 글
[Swift] Singleton Pattern은 왜 class로만 만들까? (0) | 2023.08.13 |
---|---|
[SeSAC] August 9, 2023 (0) | 2023.08.09 |
[Swift] Enum (0) | 2023.07.30 |
[UIKit] UITableViewController (0) | 2023.07.27 |
[Swift] Date.formatted() (2) | 2023.07.27 |