티스토리 뷰

부제 : 어제 읽었는데 오늘 아침되니 까먹어서 결국 정리하는 글

"스위프트에서 Static은 '타입' 프로퍼티 혹은 '타입' 함수를 의미한다. 'static'과 'class' 프로퍼티/함수와의 차이점은 'class' 프로퍼티/함수는 오버라이딩이 가능하지만, 'static'은 오버라이딩이 불가능하다는 점이다."

 

이게 구글에 쳤을 때 나오는 대표 답변이고,

이제 여기 나온 답변을 하나씩 뜯어보자!

 

 

1. '타입(Type) 프로퍼티/함수' 가 뭔데?

혹시 프로퍼티가 뭔지 몰라..

프로퍼티(property)가 뭔지 구글에 검색해보면 ..

이런 답변이 나오는데 사실 정확히 어떤 단어로 정의하기는 힘든 것 같다.

그냥 "thing" .. 정도가 좋겠다.

 

우선 이해를 돕기위해 이하는 모두 메서드로 설명해보겠다!

 

 

1-1. 인스턴스 메서드 (Instance Method)

우선 타입 메서드 보기 전에 인스턴스 메서드라는걸 먼저 보는게 좋은데,

이유는 우리가 가장 많이 사용하는거, 우리가 그냥 자연스럽게 사용하던게 인스턴스 메서드이기 때문임.

class A {
    func functionA() {
        print("function A in class A")
    }
}

let a: A = .init()
a.functionA()

우리 평소에 클래스 만들어서 이렇게 그 클래스의 함수를 썼잖아요?

 

이게 사실은 어떤 과정인거냐면,

 

1. A란 타입을 갖고 있는 a란 "인스턴스를 생성"하고

    1.1. 인스턴스를 생성될 때 메모리에 올라간다.

2. . 을 써서 a의 functionA에 접근해서 그걸 갖다 쓴거 

 

이런 과정인건데,

즉, 위의 예시에서 functionA는 인스턴스를 생성해야만!! 접근할 수 있는, 갖다 쓸 수 있는 함수인 거다.

= 인스턴스 메서드임.

 

만약 내가 그냥 갖다 쓰려고 하면?

이렇게 바로 에러가 난다.

에러의 내용은 "instance member 'functionA' cannot be used on type 'A';"

= 인스턴스 멤버인 'functionA'는 타입 'A'에 걸어서 쓸 수 없어

 

결론 : 인스턴스 프로퍼티는 우리가 평소에 쓰는 그런거!! 어렵게 생각하지 말고 그냥 우리가 평소에 하는 그거라고 생각하면 된다.

 

 

1-2. 타입 메서드 (Type Method)

인스턴스 메서드가 "인스턴스에 걸려있는" 메서드였다면

타입 메서드는 "타입"에!! 걸려있는 메서드라고 생각하면 된다.

 

그리고 타입 메서드로 선언하고 싶을 때!! 메서드 선언할 때 앞에 쓰는게 'static' 임!!!!!

(드디어 static의 쓰임새가 나왔다)

근데 'class' 써도 타입 메서드로 선언됨.

 

직접 해보면 ~~

위의 인스턴스 메서드와 다르게

 

클래스 인스턴스 (위의 예시에서 a에 해당) 만들지도 않고

무작정 A.(함수명) 이렇게 갖다 썼는데도 오류없이 아주 잘 나온다.

 

이렇게 인스턴스 만들던 말던 A라는 타입만 있으면 갖다 쓸 수 있는게 타입 메서드임 !!!

그리고 이걸 가능하게 해주는 키워드가 'static' 인거고 ~~

 

 

2. 인스턴스와 타입 프로퍼티 서로 갖다 쓸 수 있을까?

이건 하다보니 궁금해진건데..

 

2-1. 인스턴스 프로퍼티에서 타입 메서드 갖다 쓸 수 있을까?

응.. 안된다..

static 멤버는 인스턴스 위에선 쓸 수 없다고 한다!

 

2-2. 타입 메서드가 인스턴스 프로퍼티를 갖다 쓸 수 있을까?

당연히(?) 안된다.

 

생각해보면 당연한게,

인스턴스 멤버는 인스턴스를 생성해서 -> 그때 메모리에 올라가야 갖다 쓸 수 있게 되는건데

instance라는 인스턴스를 만들지 않았으니까.. 당근 메모리에도 없고..

그러니 갖다 쓸 수가 없음 ..

 

진짜 정 ~ 쓰고 싶으면

이렇게 써야겠죠?

aaa란 인스턴스 먼저 생성 !! 해서 메모리에 자리 하나 만들고 aaa의 instance 접근.. 이렇게 .....

 

 

3. class와 static 둘 다 타입 프로퍼티로 만드는 키워드인데 그 차이점은?

구글도 말해주다싶이

답은 "class는 오버라이딩이 가능한데, static은 오버라이딩이 불가능하다는 것"

 

오버라이딩이란 ~?

 

메소드 오버라이딩(method overriding)

: 슈퍼 클래스에 선언된 메소드와 같은 이름, 같은 리턴 타입, 같은 매개 변수 리스트를 갖는 메소드를 서브 클래스에서 재작성하는 것

 

라고.. 옛날 옛적 자바 공부할 때 한 줄로 정리를 해놨다..

우선 이 글은 오버라이딩에 대한 글은 아니기 때문에 .. pass~

 

https://blog.naver.com/varyeun/221495183015

 

[명품 JAVA Programming] 제5장 상속

1 | #상속 #extends 상속 : 부모 클래스(슈퍼 클래스)에 만들어진 필드와 메소드를 자식 클래스(서브 클래...

blog.naver.com

 

비록 자바에 대한 글이지만 오버라이딩 / 상속 자체는 스위프트에서도 동일하게 쓰이니까 한 번 읽어보시는 것도 좋을 것 같다!

 

 

4. static let 과 static var 의 차이

이것도 보다보니까 궁금해진건데

static을 쓰면 그 변수 값을 바꾸지 못하나?? 라는 어디서 온건지 모르는 이상한 생각이 들었다.

당연히 잘만 바뀐다.

 

사실 이게 궁금했던 이유는

실제로 일할 때 값이 바뀔 일이 없는 프로퍼티에 static 선언을 주로 하는데 (예를 들면, 테이블 뷰 셀 아이디 같은거)

그래서 'static let'을 세트처럼 쓴다.

 

여기서 내 질문은

"그럼 static var는 언제 써?" 였는데

 

그냥 ... 값이 바뀔 수도 있을 것 같을 때 .. 쓴다고 한다

 

예를 들면 이런 상황!!

https://stackoverflow.com/questions/37701187/when-to-use-static-constant-and-variable-in-swift

 

정말 너무 좋은 예시다.....

 

 

5. static 에 대한 좋은 예시 좀 보여줘

https://www.tutorialspoint.com/where-and-how-to-use-static-variable-in-swift

이것 또한 너무 좋은 예시다...

 

 

이쯤보면 이 글 보시는 분들 이해가 1/100 정도는 되지 않았을까... 싶어 이번 글은 마무리......

 

 

이 글의 요지인 static in swift 에 대해서 약간은 이해가 된 듯 싶으니!!!

 

전 이제 이 글을 보러 가볼게요

https://sujinnaljin.medium.com/swift-static%EA%B3%BC-class-method-property-%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-b336311a923c

 

[Swift] static과 class method, property 효과적으로 사용하기

Effectively using static and class methods and properties 번역글

sujinnaljin.medium.com

(이건 아직 저도 제대로 안 읽어서 정리 못 했음........)

댓글