iOS 개발 기록

[ObjC] 클래스와 메서드 본문

ObjC

[ObjC] 클래스와 메서드

택꽁이 2023. 10. 11. 14:11
728x90

📄

Objective-C는 객체지향 프로그래밍을 목적으로 C언어의 확장 형태로 개발되었다. C나 C++과 호환됨녀서 다른 문법을 추가로 지원한다.

파일 구조

Header파일(.h)과 Implementaion파일(.m)

.swift파일 하나만 있는 Swift와는 달리 Objective-C는 선언파일(.h)과 구현파일(.m)로 나뉘어진다.

/// NSString+Size.h
#import <Foundation/Foundation.h>

@interface NSString (Size)

- (CGSize)stringSize:(NSInteger)fontSize;

@end
/// NSString+Size.m
#import "NSString+Size.h"

@implementation NSString (Size)

- (CGSize)stringSize:(NSInteger)fontSize {
    return [self sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:fontSize]}];
}

@end

위의 코드는 Swift로 치면 String에 Extension으로 메소드를 추가하는 코드이다. 파일 하나에 구현하면 되는 Swift와 달리 헤더파일에 추가할 메서드를 선언하고 해당 메서드를 .m파일에서 한다.

import

/// NSString+Size.h
#import <Foundation/Foundation.h>

/// NSString+Size.m
#import "NSString+Size.h"

import 할 때에도 차이점이 있는데 다음과 같다.

  • “”를 사용한 import는 개발자가 프로젝트 내부에서 구현한 헤더파일을 가져올 때 사용한다.
  • <>를 사용한 import는 시스템에서 구현한 헤더파일이나 외부 프레임워크에서 헤더파일을 가져올 때에 사용한다.

클래스 구조

Class와 Category

/// NSString.h
@interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
/// NSSTring+Size.h
@interface NSString (Size)

ObjC는 객체지향의 클래스와 기존의 정의된 클래스를 확장시켜주는 카테고리 기능을 지원한다.

  • class
    • @interface, @implementation / @end 으로 정의한다.
    • Swift와 같이 상속(NSObject)과 프로토콜(<NSCopying, NSMutableCopying, NSSecureCoding>)을 지원한다. 동일하게 단일 상속만 지원된다.
  • category
    • 기존 클래스를 확장한다.
    • Swift의 Extension과 비슷하지만 카테고리명을 추가적으로 달아 사용한다. 위의 코드에서는 (Size)

category에 대해서는 추후에 자세히 정리해봐야겠다.

@interface,@implementation / @end

/// NSString+Size.h
@interface NSString (Size)
...
@end

/// NSString+Size.m
@implementation NSString (Size)
...
@end

각각 선언과 구현을 맡는다.

  • @interface / @end:
    • classcategory의 메서드와 프로퍼티를 정의하는데 사용된다.
    • 다른 클래스가 해당 클래스를 사용할 때에 접근할 수 있는 메서드와 프로퍼티를 결정한다.
    • @interface@end 사이에 해당 메서드와 프로퍼티를 정의하는 것으로 사용한다.
    • 보통은 .h파일에서 사용하며, .m파일에서 쓰면 해당 프로퍼티나 메서드는 외부에 공개되지 않고 클래스 내부에서만 private으로 사용 가능하다.

  • @implementation / @end:
    • @interface에서 정의된 메서드와 프로퍼티를 구체적으로 구현한다.

메서드의 선언

/// NSString+Size.h
- (CGSize)stringSize:(NSInteger)fontSize;

/// NSString+Size.m
- (CGSize)stringSize:(NSInteger)fontSize {
    return [self sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:fontSize]}];
}
  • 인스턴스 메서드는 -, 클래스 메서드는 +로 선언한다.
/// 파라미터가 없는 경우
- (리턴타입)메서드 이름;
/// 파라미터가 1개인 경우
- (리턴타입)메서드 이름: (파라미터 타입) 파라미터이름;
/// 파라미터가 여러개인 경우
- (리턴타입)메서드 이름: (파라미터1 타입) 파라미터1 이름 
	 파라미터2 외부변수명: (파라미터2 타입) 파라미터2 이름
	 파라미터3 외부변수명: (파라미터3 타입) 파라미터3 이름 
	 ... 
  • 메서드가 1개인 경우에는 외부 변수명을 생략할 수 있다. 하지만 관행적으로 메서드 이름을 (메서드이름 with 파라미터1 외부변수명) 으로 작성하는 것 같다.
  • 메서드가 여러개인 경우에는 외부변수명을 꼭 써줘야한다. 메소드를 이름을 정할 때에 외부변수명까지 포함된다는데, 아마 오버로딩을 염두해두고 이렇게 메소드를 정의하게 만든게 아닐까 싶다.

함수의 호출

/// NSString+Size.m
[NSString @{NSFontAttributeName: [UIFont systemFontOfSize:fontSize]}];
  • 메소드의 호출은 .이 아니라 []를 통해 호출한다.

Reference

Objective-C
Objective-C에 대한 짧은 소개
https://seorenn.github.io/note/objective-c.html
Objective-C에서 Swift로 - iOS Tech Talk
아직 Swift에 익숙하지 않은 분들이나, Swift로의 전환이 내키지 않아서 Objective-C 스타일로 사용하는 분들을 위한 Swift 베이직 강연입니다.
https://academy.realm.io/kr/posts/from-objective-c-to-swift-ios-tech-talk/


Uploaded by N2T