Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Swift] NSObject란? #1

Closed
L-j-h-c opened this issue May 11, 2022 · 2 comments
Closed

[Swift] NSObject란? #1

L-j-h-c opened this issue May 11, 2022 · 2 comments
Assignees

Comments

@L-j-h-c
Copy link
Owner

L-j-h-c commented May 11, 2022

NSObject

개발자 문서

정의 : NSObject란?

root class of most Objective-C class hierarchies, from which subclasses inherit a basic interface to the runtime system and the ability to behave as Objective-C objects.

NSObject는 거의 모든 Objective-C class의 root class인데, 각 클래스들은 NSObject라는 root class로부터 런타임 시스템의 기본 인터페이스와 Objective-c 객체처럼 행동하는 능력을 상속받는다.
(여담으로, NS는 Next Step의 약자로 스티브 잡스가 만들었던 NextStep OS에서 이어져 온 단어라고 한다)
(여기서 Objective-C runtime의 인터페이스를 제공한다는 말의 의미가 궁금해졌다)

Objective-C Runtime?

Objective-C는 C언어 위에 스몰토크 스타일의 메시지 구문을 추가한 객체지향 언어라고 한다. 또한 Runtime 계층을 실현하여 프로그램을 동작시킨다.
C와 C++가 컴파일러에 의존하는 정적인 언어라면, Objective-C는 런타임에 의존하는 동적인 언어이다.

동적 언어는 어떤 특징을 가질까?

  1. Dynamic typing : 오브젝트의 타입이 컴파일-링크 타임이 아니라 런타임(실행 도중)에 결정된다
  2. Dynamic binding : 코드 상의 구문이 어떤 메서드를 동작시킬 것인지 실행 도중에 결정된다.
  3. Dynamic loading : 어떤 모듈이 언제 메모리에 로드될지 실행 도중에 결정된다.

Root Class

root class는 부모 클래스를 가지지 않는 최상위 클래스를 말한다.

Cocoa (Touch) Framework는 NSObject를 상속한다

Cocoa Touch와 Cocoa 프레임워크는 비슷하지만 다른 용도의 프레임워크이다.

Cocoa Touch Framework는 UIKit, Foundation, CoreData, Mapkit, CoreAnimation 등을 포함하고 있는 Framework이며, iOS와 iPadOS 등 애플 기기에서 구동되는 application을 개발하기 위해 사용하는 통합 프레임워크이다.

Cocoa Framework는 UIKit 대신 Appkit을 포함하고 있다는 점이 다르며, MacOS에서 구동되는 Application을 개발하기 위해 사용하는 프레임워크라는 점이 다르다.

두 프레임워크의 공통점은 Objective-C 런타임을 기반으로 한다는 것이며, Objective-C의 최상위 클래스인 NSObject를 상속한다.
iOS application이 Objective-C 런타임에서 동작하지만 Swift만 알아도 프로그래밍이 충분히 가능한 것은, 이처럼 Cocoa Touch Framework가 NSObject를 상속하며 중개자 역할을 해주기 때문이다.

UIKit & Foundation

UIKit

UIKit은 Cocoa FrameWork에 속해있기 때문에, NSObject를 항상 상속한다. Xcode에서 새로운 Source를 만들 때, Cocoa Touch Class를 선택하여 생성하는 경우가 있는데, 이렇게 하면 자동으로 UIKit이 import되어 있는 모습을 확인할 수 있다. 또한 UIKit을 살펴보면 내부적으로 Foundation을 import하고 있는 것을 볼 수 있기에, 개발 시에 UIKit만 import하여도 Foundation의 기능을 사용할 수 있다.

Foundation

Foundation Framework는 Cocoa와 Cocoa Touch Framework 둘 모두에 속해 있다. 처음 swift 파일을 생성하면 import Foundation 이 되어 있는 것을 볼 수 있다. UI 외의 기능들을 담당하는 Framework이다.

NSString, NSArray와 같은 Objective-C 자료형들은 모두 Foundation Framework에 속한다.
그런데 아무런 Framework도 import하지 않아도 컴파일 오류가 뜨지 않는 경우가 있는데, 이는 Swift 자체에 속한 자료형들도 있기 때문이다. String의 경우 Objective-C 에서는 클래스지만, Swift에서는 구조체로 정의되어 있다.

NSObject의 상속

Objective-C의 경우 NSObject와 NSProxy라는 2개의 root class 이용한다. 그에 반해 swift는 전역적인 기반 클래스가 정해져 있지 않기 때문에 아무런 클래스도 상속하지 않으면 그 클래스가 바로 root class가 된다. 만약 커스텀 클래스에서 Foundation Framework의 기능을 이용하고 싶다면 NSObject를 상속해주면 된다.

image

NSObject Class Diagram

image

@L-j-h-c L-j-h-c added the Swift label May 11, 2022
@L-j-h-c L-j-h-c self-assigned this May 11, 2022
@L-j-h-c L-j-h-c added the UIKit label May 12, 2022
@L-j-h-c
Copy link
Owner Author

L-j-h-c commented May 12, 2022

@L-j-h-c
Copy link
Owner Author

L-j-h-c commented May 12, 2022

느낀점

NSObject의 개발자 문서를 보면 엄청나게 많은 레퍼런스가 존재한다. 이름도 들어보지 못한 Instance Methods들이 수없이 많고 카테고리별로 메서드의 역할을 정의해 놓았다. 특정 프로퍼티와 메서드가 왜 NSObject라는 root class에 정의되어야 했는지 생각해보자. 알면 알수록 공부할 내용이 많으니 차근차근 알아보자!
Objective-C에 대해서도 조금씩은 알아볼 필요가 있겠다고 느껴졌다. iOS라는 플랫폼의 특성을 이해하는데에 도움이 될 것 같다.

더 공부할 부분

다른 프레임워크나 언어에서 Root Class는 어떻게 사용되고 있을까?

@L-j-h-c L-j-h-c closed this as completed May 12, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant