[Objective-C] 상속과 클래스
출처 : OS X 구조를 이해하면서 배우는 Objective-C Chap 3.
Notice : 정리자(돼지왕 왕돼지)가 remind 하고 싶은 내용이나 모르는 내용 기반으로 정리하는 것이기 때문에 구체적인 내용은 책을 사서 보시기를 권장드립니다.
3.1. 상속 개념
* 3.1.1. 슈퍼 클래스와 서브 클래스
* 3.1.2. 클래스 계층
-
Cocoa 환경에는 루트 클래스로 NSObject 클래스가 있어서 다른 모든 클래스가 직접 또는 간접적으로 NSObject 클래스를 상속한다.
(NSProxy 라는 또 다른 루트 클래스가 있다.)
-
객체지향 언어는 이렇게 루트 클래스가 오직 하나인 언어와 여러 개인 언어가 있다.
C++ 는 루트 클래스가 여러 개이다.
루트 클래스가 오직 하나인 언어는 자바와 스몰톡이 있다.
3.2. 상속을 사용한 클래스 정의
* 3.2.1. 상속 관계 선언
-
상속을 할 때, 인터페이스의 ‘메서드 선언’은 서브 클래스에 추가하는 것만 적는다.
다만, 슈퍼 클래스에서 정의한 메서드를 서브 클래스에서 재정의(override)하고 싶을 땐 인터페이스에도 서술하고 변경 사항을 주석에 남기는 것이 좋다. ( 의무는 아니다. )
* 3.2.2. 클래스 정의와 헤더 파일
-
슈퍼 클래스 명으로 지정한 클래스에 대한 정보가 없다면 서브 클래스를 정의하지 못한다.
슈퍼 클래스 인터페이스를 포함한 헤더 파일이 필요하다.
* 3.2.3. 상속과 메서드 호출
* 3.2.4. 슈퍼 클래스의 메서드 호출
* 3.2.5. 초기자 정의
-
슈퍼 클래스가 NSObject 라면 항상 인스턴스가 초기화되므로 반환값에 신경 쓰지 않아도 된다.
하지만 인수를 사용하거나 파일에서 값을 읽어 초기화하는 초기자라면 값이 잘못되었거나 파일 읽기가 안 되어 초기화에 실패하기도 한다.
이런 상황에 대응하기 위해 초기자에서 슈퍼 클래스가 돌려준 값을 확인하는 습관을 길러야 한다.
-
인스턴스 객체를 생성하는 메서드 alloc은 인스턴스 객체가 가진 인스턴스 변숫값을 모두 0으로 초기화한다.
(isa 제외)
따라서 새롭게 추가된 인스턴스 변수 초깃값이 0으로, 문제가 없다면 명시적인 초기화는 생략해도 됩니다.
하지만 생략인지 빠뜨린 것인지 알기 어려우므로 초깃값이 0이라고 주석을 다는 것도 좋다.
3.3 상속을 사용한 프로그램 예제
* 3.3.1. 메서드 추가 예제
-
상속을 사용해 클래스를 정의했다면 슈퍼 클래스의 클래스 정의도 모두 함께 컴파일하고 링크해야 한다.
그렇지 않으면 슈퍼 클래스 메서드를 사용하지 못한다.
* 3.3.2. 메서드 재정의 예제
3.4. 상속과 메서드 호출
* 3.4.1. self 를 사용한 메서드 호출
* 3.4.2. super 를 사용한 메서드 호출
* 3.4.3. 실험 프로그램
3.5. 메서드 정의 시 주의사항
* 3.5.1. 지역적인 메서드
-
인터페이스에 선언되지 않은 지역적인 메서드는 프로토타입 선언을 하지 않은 C 함수와 마찬가지로 정의보다 앞에 있는 코드에서 사용하면 안 된다.
-
지역적인 메서드를 사용하면 구현이 상당히 편리하지만 상속에 따라 문제가 발생할 위험성이 있다.
서브 클래스에서 추가한 메서드가 슈퍼 클래스에 지역적 메서드가 있다는 걸 모르고 재정의 할 수도 있기 때문이다.
이런 문제를 피하기 위해 애플 사 가이드 라인에 따라 지역적 메서드명에 고유의 접두사를 붙이는 것이 추천된다.
* 3.5.2. 지정 초기자
-
초기화 방법 중에서도 인스턴스 초기화에 필수적인 초기화 메서드를 지정 초기자(designated initializer)라고 부른다.
-
지정 초기자는 슈퍼 클래스의 지정 초기자를 super 로 호출하고 자신의 클래스에서 필요한 초기화를 가장 세밀하게 설정하는 초기화 메서드이다.
-
지정 초기자가 클래스마다 보통 하나씩 있지만, 실제로는 여러 개 있을 수 있다.
-
서브 클래스의 지정 초기자는 슈퍼 클래스의 지정 초기자를 호출해야 한다.
NSObject 지정 초기자는 init 이다.
-
서브 클래스에서 슈퍼 클래스 지정 초기자를 재정의한다면 반드시 슈퍼 클래스의 지정 초기자를 호출해서 정의해야 한다.
부차적 초기자는 내부에서 지정 초기자를 호출해서 사용하기 때문에 부차적 초기자를 호출하면 안 된다.
-
지정 초기자는 정해진 구문이 있는 것도 아니고 인터페이스를 봐서 바로 알 수 있는 것도 아니므로,
문서나 주석으로 확실히 밝혀둬야 한다.
대부분의 Cocoa API 클래스는 어떤 메서드가 지정 초기자인지 레퍼런스에 적혀 있다.
다음 글 : [Objective-C] 객체 형식과 동적 결합
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Objective-C] 참조 카운터를 사용한 메모리 관리 방법 (0) | 2017.12.27 |
---|---|
[Objective-C] 객체 형식과 동적 결합 (0) | 2017.12.26 |
[Objective-C] Objective-C 프로그램 (0) | 2017.12.24 |
[Objective-C] 객체 기반 소프트웨어 작성 (0) | 2017.12.23 |
[xcode] suppressing warning - incompatible pointer types sending … (0) | 2017.12.22 |
댓글