본문 바로가기
iOS

변수앞에 static이랑 class가 붙었는데요?(static 변수, class 변수)

by 지금갑시다 2022. 8. 27.
class Person {
    static let name: String = "Park"
    var age: Int
    class func job() {
    	print("My job is ...")
    }
}

(Person 클래스의 변수들이 모두 초기화값을 가지고 있지 않으므로, init()이 반드시 필요한 코드지만, 설명을 위한 간략한 코드로 넘어가자!)

위와같은 코드는 아~~~주 흔하게 class를 만들거나 struct를 만들때와는 아주 조금 모양이 다르게 생겼다.

 

보통이라면, (여기서 말하는 보통이란, static, class가 변수 앞에 안붙은 아주 plain 한 상태의 class혹은 struct를 말한다.)

Person의 age변수처럼 var age: Int 로 표현되지만, 위의 경우에는 staticclassvar 혹은 let의 앞에 쓰여있다.

 

 

그럼 도대체 static, class 가 있는 프로퍼티 or 메서드와 없는 프로퍼티or 메서드의 차이는 무엇이고, static과 class의 차이는 무엇일까?

우선, static, class가 있는 것과 없는 것의 차이 먼저 보자.

static과 class가 붙어있지 않은 var age: Int 인 age는 Person 객체를 만들어야 접근이 가능하다.

var person1 = Person()
person1.age // 정상적으로 접근 가능

그러면 static, class 붙은 변수들은요?

var person2 = Person()
person2.name // 접근 불가
person2.job() // 접근 불가

...?!

 

static과 class 타입의 변수들은 정적인 프로퍼티와 메서드이기에, person1 혹은 person2 처럼 인스턴스를 만들지 않고 Person 타입 그 자체에서 값을 접근해 주어야 한다.

 

값을 접근하는 걸 보자면,

Person.name // 접근 가능
Person.job() // 접근 가능

static let name 과, class func job 은 타입 프로퍼티와 메서드이기 때문에, 위와 같이 접근을 해주면 Person에 선언된 값으로 접근 및 사용이 가능해진다.

 

아니 선생님..! 객체를 만들지도 않았는데, 어떻게 class안의 프로퍼티와 메서드에 접근을 할 수 있는겁니까?

아주 흔한 설명과 정리를 위한 클리셰죠..

 

 위에서 설명을 하며, 은근슬쩍 정적인 프로퍼티와 메서드라고 설명을 했는데, '정적인 ***'들이 의미하는건 프로그램이 실행되었을때, 정적인 프로퍼티, 정적인 무언가들이 메모리 영역의 Data 영역으로 들어가게 되고, 이 Data 영역은 프로그램이 실행될때, 정적인 코드들을 저장하게 되고, 프로그램이 종료될때 그 자원들을 반납하게 되므로, 그말은 곧 프로그램이 실행되었다면, 이미 그 데이터들이 저장되어 있는 상태라는거다!!

그.래.서~ 객체를 만들지 않고도 위에처럼 타입만으로 접근이 가능했다는 사실이다..!

 

아~~ 오케이 오케이 그래서 정적인 프로퍼티, 메서드를 타입만으로 접근 가능한건 알겠어요, 그러면 class랑 static의 차이는 뭔가요?

 

class 는 오버라이드가 되는데 반해, static이 붙었다면, 오버라이드가 안된다는 것이다.

간단한 예시를 보기 위해 Person 클래스를 조금 바꿨다.

class Person {
    static func name() {
    	print("My name is..")
    }
    
    class func job() {
    	print("My job is..")
    }
}

Person 클래스를 상속받는 Minsu라는 클래스가 있을때,

class Minsu: Person {
    override static func name() { // override 불가능
    	print("Minsu is my name")
    }
    
    override class func job() { // override 가능!
    	print("Student is my job")
    }
}

override란, 자식 클래스에서, 부모 클래스가 하는 메서드를 재작성해서 기존 부모의 메서드가 아닌 자식 자신이 만든 메서드를 동작하게 해주는데,

 

Minsu 클래스를 보게 된다면, 부모 클래스에서 static func은 자식 클래스인 Minsu에서 오버라이드가 되지 못하는데 반해 class func 는 override가 가능함을 알 수 있다.

 

끘!!!!!

 

REF1: https://babbab2.tistory.com/122

REF2: https://iamnotokay.tistory.com/57