본문 바로가기
공부/CS

[CS] final, static, class(feat.Swift)

by 초코팅촉 2024. 10. 19.
728x90
반응형

이번 시간에는 제일 헷갈릴수 있는 세가지를 알아봅시다.

간단요약

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 였습니다.
이 순서대로 설명드린 이유는 쭉 읽어보셨으면 아셨겠지만

순서대로 점점 이전 친구들을 다 포함하고 있어서 였습니다~

 

끝!

728x90
반응형

'공부 > 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