티스토리 뷰
부제 : 어제 읽었는데 오늘 아침되니 까먹어서 결국 정리하는 글
"스위프트에서 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
비록 자바에 대한 글이지만 오버라이딩 / 상속 자체는 스위프트에서도 동일하게 쓰이니까 한 번 읽어보시는 것도 좋을 것 같다!
4. static let 과 static var 의 차이
이것도 보다보니까 궁금해진건데
static을 쓰면 그 변수 값을 바꾸지 못하나?? 라는 어디서 온건지 모르는 이상한 생각이 들었다.
당연히 잘만 바뀐다.
사실 이게 궁금했던 이유는
실제로 일할 때 값이 바뀔 일이 없는 프로퍼티에 static 선언을 주로 하는데 (예를 들면, 테이블 뷰 셀 아이디 같은거)
그래서 'static let'을 세트처럼 쓴다.
여기서 내 질문은
"그럼 static var는 언제 써?" 였는데
그냥 ... 값이 바뀔 수도 있을 것 같을 때 .. 쓴다고 한다
예를 들면 이런 상황!!
정말 너무 좋은 예시다.....
5. static 에 대한 좋은 예시 좀 보여줘
이것 또한 너무 좋은 예시다...
이쯤보면 이 글 보시는 분들 이해가 1/100 정도는 되지 않았을까... 싶어 이번 글은 마무리......
이 글의 요지인 static in swift 에 대해서 약간은 이해가 된 듯 싶으니!!!
전 이제 이 글을 보러 가볼게요
(이건 아직 저도 제대로 안 읽어서 정리 못 했음........)
'iOS' 카테고리의 다른 글
struct의 subscript (feat. 설정자의 접근수준) (0) | 2023.02.01 |
---|---|
reduce, map의 조합 그리고 CaseIterable의 allCases in Swift (0) | 2023.01.12 |
prepareForReuse() 의 사용법 / 쓰는 이유 (0) | 2022.02.22 |
Delegate Pattern 서로 다른 클래스에 접근하기 / 동작하기 / 데이터 전달하기 (2) | 2021.07.13 |
iOS에 한해 내가 지금까지 이해한 MVVM 패턴 (2) | 2021.03.22 |
- Total
- Today
- Yesterday
- objc
- 전화걸기연결
- 카카오톡열기
- 알림대화상자
- subscript
- 인플레이터
- 프래그먼트매니저
- 전화연결하기
- allcases
- swift
- 부가데이터
- 제스처디텍터
- 안드로이드
- 다이얼연결
- 프래그먼트
- 상태드로어블
- ios
- 페이저타이틀스트립
- prepareforreuse
- 액션바
- Objective-C
- 비트맵버튼
- 어댑터
- 터치리스너
- 스낵바설정
- 표현패턴
- 쉐이프드로어블
- 뷰페이저
- CaseIterable
- 데이터
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |