이번 시간에는 제일 헷갈릴수 있는 세가지를 알아봅시다.
간단요약
static과 class는 메서드나 프로퍼티를 인스턴스화 하지 않고 하나만 존재하도록 하기 위해 사용한다.
이 말인 즉슨 타입 프로퍼티, 타입 메서드로 만들어 버린다는 뜻.
또한 static은 상속을 막을때도 쓴다.
final
final은 딱봐도 느낌이 오죠? 끝! 이라는 느낌이 오실텐데요,
final은 오버라이딩을 막기위해 사용됩니다.
오버라이딩이란?
인스턴스 메서드, 인스턴스 프로퍼티, 타입 메서드, 타입 프로퍼티, 서브스크립트의 재정의를 막는것입니다.
잘 모르겠으면 아래 보시면 바로 아실거에요
override func viewDidLoad() {
super.viewDidLoad()
}
이거 보시면 아시겠죠? 느낌 빡오시죠? 다른 언어 쓰시는 분들도 대충 뭔소린진 이해하셨을거에요.
기존에 정의된 친구를 내가 재정의해서 쓰는게 override
인데요,
이걸 못하게 막아서 당시에 쓴 내용이 최종본이 되도록, 다른이의 침범을 막는 느낌이죠
결론
재정의 하면 안되는 친구들 앞에 final 키워드를 써준다.
static
static은 좀 특이하게도 위의 final의 특징인 오버라이딩을 금지한다! 를 포함하는 친구입니다.
그럼 final대신에 static을 써도 될까요?
그건 아닙니다. final과 static을 굳이 분리해둔 이유는
final : 오버라이딩 금지.
static : 오버라이딩 금지 + 인스턴스 메서드, 인스턴스 프로퍼티를 "타입"메서드/프로퍼티로 바꿔줌.
그렇습니다. 뒤에 있는 저 내용이 매.우.중.요.한 내용이죠.
Swift에서 싱글톤 객체 생성해보신 분들은 다음과 같은 코드를 작성하죠?
class ExampleClass {
static let shared = ExampleClass()
}
여기 보시면 싱글톤 객체 맨 앞에 static이 붙죠?
바로 그겁니다. 싱글톤 객체는 오버라이딩이 되어서도 안되고, 인스턴스화 없이 단일 객체로 모든곳에서 하나만 존재해야 하기때문에 static을 쓰는거였습니다...
기능은 비슷했지만 다른점이 하나 존재하는데 그 다른점이 static을 쓰는 이유이기 때문에 절대로 혼용해서 쓰시면 안됩니당.
class
거의다 왔어요! 힘을 내요!
자 마지막으로 class는 또 static, final과 비슷합니다. 셋이 서로 다 비슷한 느낌이에요.
class : 오버라이딩 허용 + 인스턴스 메서드/프로퍼티를 "타입"메서드/프로퍼티로 바꿔줌.
static이랑 비슷한데 또다르죠?
class를 붙이면 오버라이딩도 되고 인스턴스 메서드/프로퍼티를 타입 메서드/프로퍼티로 바꿔주어 여기저기서 다 선언할 수 있게 됩니다.
어떻게 쓰는지 예시를 볼까요?
class ExampleClass {
class func exampleMethod() {}
}
그냥 맨앞에 class를 붙여주면 됩니다.
번외
타입 메서드와 인스턴스 메서드의 멤버 접근범위
타입 메서드에서는 타입 멤버만 사용할 수 있다.
인스턴스 메서드에서는 다 쓸 수 있다.
이게 무슨 말일까요? 아래 코드를 보시죠.
import UIKit
class MyClass: UIViewController {
static let typeProperty: String = "Hello, World!"
static func doSomething() {
print(typeProperty)
}
let instanceProperty: String = "Hello, World!"
func doSomethingInstance() {
print(instanceProperty)
}
override func viewDidLoad() {
super.viewDidLoad()
print(MyClass.typeProperty)
print(instanceProperty)
}
}
위에서부터 순서대로
타입 프로퍼티
타입 메서드
인스턴스 프로퍼티
인스턴스 메서드
viewDidLoad입니다. 이때 viewDidLoad도 분류를 나눠보자면
일단은 static이나 class가 없으니까 인스턴스 메서드겠죠?
타입 프로퍼티는 같은 타입 시리즈인 타입 메서드안에서 그냥 쓸 수 있습니다.
하지만 인스턴스 프로퍼티는 에러가 나서 쓸 수 없죠.
물론 같은 맥락으로 인스턴스 메서드에서도 인스턴스 프로퍼티를 그냥 쓸 수 있지만,
맨밑에 인스턴스 메서드에서 타입 프로퍼티의 타입 이름을 통해서
MyClass.typeProperty로 접근하고 있죠? 에러 안나고 잘 됩니다.
암튼 여기까지 final, static, class 였습니다.
이 순서대로 설명드린 이유는 쭉 읽어보셨으면 아셨겠지만
순서대로 점점 이전 친구들을 다 포함하고 있어서 였습니다~
끝!
'공부 > CS' 카테고리의 다른 글
[CS] 인스턴스화란 무엇일까?(클래스, 객체, 인스턴스) (1) | 2024.01.02 |
---|---|
[CS] 강타입 언어와 약타입 언어 (0) | 2023.12.14 |
[CS] git 명령어들 (2) | 2023.11.28 |
[CS] Git과 GitHub (1) | 2023.11.28 |
[CS] ADS(App Define Statement)란? (1) | 2023.11.22 |