결론부터 말하면 class에 final 혹은 private 키워드를 붙여서 성능을 향상할 수 있습니다.
접근 제어
위에서 말한 키워드는 Access Control 즉, 접근 제어를 하기 위해 쓰이는 키워드인데요,
다른 소스파일이나 코드에서 어떠한 코드의 전체나 일부에 대한 접근을 제한합니다.
접근을 제한한다는 말은 A 클래스에 선언되어 있는 함수나 변수들 B 클래스에서 사용하게 하거나 못 하게 제어하는 것입니다.
클래스나 구조체, 열거형 자체를 접근 제어하거나 이 안에 선언되어 있는 함수, 변수 등등에 대해서 모두 접근 제어가 가능합니다. 선언 시 앞에 키워드를 붙여서 사용하면 됩니다.
public class TestClass {
final let testStr: String = "test"
private var testInt: Int = 0
private func testFunc() { print("TEST") }
}
이러한 접근 제어는 객체 지향의 특징 중 하나인 은닉화를 가능하게 합니다.
은닉화란 객체 내부의 데이터, 자료들의 접근을 제한하여 은닉(hiding) 시키는 것입니다.
외부에서는 이 데이터에 어떤 값이 있는지 모른 채 수정, 조작하는 동작을 내부의 메서드(getter, setter)만을 통해 결과만 전달받을 수 있게 됩니다.
Dispatch
먼저 Dispatch의 사전적 의미는 '보내다', '전송하다' 이런 뜻을 가지고 있습니다.
Dispatch는 어떤 상황에서 어떤 메서드를 호출(전송)할 것인지를 결정하고 실행하는 매커니즘으로 Dynamic Dispatch(동적), Static Dispatch(정적) 두 가지의 방식이 있습니다.
- Static Dispatch
컴파일 시점에 호출 할 함수를 결정합니다.
컴파일 시점이란 앱을 동작시키기 전에 개발자가 작성한 코드들이 컴퓨터가 읽을 수 있게 만들어서 앱 실행을 준비하는 과정입니다.
앱 실행 전, 어떤 상황에서 이 함수가 호출될 것이라는 결정이 나기 때문에 성능이 좋습니다. - Dynamic Dispatch
런타임 시점에 호출 할 함수를 결정합니다.
컴파일이 끝난 후 앱을 실행하는 동안 일어나는 과정(런타임) 속에서 호출할 함수를 결정하게 되는데,
이 경우는 하위 클래스가 상위 클래스의 메서드를 호출할 때 해당 메모리 배열을 참조하여 호출하는 함수를 결정하는 과정을 런타임에 결정하고 성능은 떨어지게 됩니다.
이러한 특성으로 참조 타입(상속 기능이 있는 class)은 Dynamic Dispatch,
값 타입(구조체)은 Static Dispatch를 사용합니다.
따라서 Dynamic Dispatch 메커니즘으로 작동하는 Class를 Static Dispatch 방식으로 작동하게 한다면 성능이 좋아진다고 할 수 있겠죠!
결론
Class의 성능을 향상시키기 위해서는,
- 상속이나 오버라이딩이 필요없는 클래스나 메서드, 프로퍼티에 final 선언.
final이 붙은 메서드나 프로퍼티는 하위 클래스에서 이들을 오버라이딩 할 수 없게 되고,
class에 final이 붙으면 상속 자체가 불가능해져서 Static Dispatch 방식으로 동작하게 됩니다. - 파일 내에서만 접근해도 되는 경우에는 private 선언
private로 선언하게 되면 참조 가능한 범위가 private로 선언된 파일 혹은 블록 내에서만 가능하게 됩니다.
컴파일러는 private가 붙은 프로퍼티에 대해서 오버라이드가 될 수 있는지 없는지를 판단해 오버라이드하는 곳이 없다면 final 키워드로 추론하게 됩니다.
class 앞에 private 키워드를 붙이면 클래스 내부의 모든 프로퍼티, 메서드에 private가 붙은 것으로 동작하게 됩니다.
'DEV - iOS > Background' 카테고리의 다른 글
[iOS Interview Questions] 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체를 무엇이라고 하는가? (0) | 2023.05.09 |
---|---|
[iOS Interview Questions] Result 타입에 대해 설명하시오. (0) | 2023.03.31 |
[iOS Interview Questions] KVO 동작 방식에 대해 설명하시오. (1) | 2023.03.24 |
[iOS Interview Questions] Codable에 대하여 설명하시오. (0) | 2023.03.23 |
[iOS Interview Questions] Singleton 패턴을 활용하는 경우를 예를 들어 설명하시오. (0) | 2023.03.22 |