Objective-C

Obj-C | Bool, 조건, SEL, id

ziziDev 2024. 10. 24. 15:35
반응형

BOOL

Objective-C에서는 BOOL 타입을 사용해 논리값을 다루는데, 이는 YES와 NO 두 가지 값을 가집니다.

C 언어의 bool과 비슷하지만, 실제로는 signed char로 정의됩니다. 그래서 엄밀히 말하면 BOOL은 C의 true/false보다 조금 더 유연한 타입입니다.

 

Conditionals (조건문)

Objective-C에서 조건문은 C 언어와 거의 동일합니다. if, else, switch 문을 사용할 수 있고, BOOL을 조건으로 평가합니다.

//YES - true, NO - false
    BOOL isDark = YES;
    BOOL isLight = NO;
    
    NSLog(@"라이트 모드입니다: %@", !isDark ? @"TRUE" : @"FALSE");
    
    if (isLight != YES) {
        NSLog(@"다크모드입니다: %@", isLight ? @"TRUE" : @"FALSE");
    } else  if (isDark){
        NSLog(@"라이트 모드입니다: %@", isLight ? @"TRUE" : @"FALSE");
    }

 

 

Swift로 변형해 본다면?

 

let isDark = true
let isLight = false

print("라이트 모드입니다: \(!isDark ? "TRUE" : "FALSE")")

if isLight != true {
    print("다크모드입니다: \(isLight ? "TRUE" : "FALSE")")
} else if isDark {
    print("라이트 모드입니다: \(isLight ? "TRUE" : "FALSE")")
}

 

  • YES는 1, NO는 0에 해당됩니다.
  • 주의할 점: BOOL 변수에 0이 아닌 다른 값을 대입하면 YES로 적용됩니다.

 


SEL (Selectors)

SEL은 Objective-C에서 메서드 이름을 가리키는 타입으로, 셀렉터(selector)는 클래스나 인스턴스가 메서드를 호출할 때 사용됩니다.

셀렉터 정의

셀렉터는 @selector 키워드로 정의할 수 있습니다.

//UIViewController를 상속하고 있음
//UIViewController -> UIResponder -> NSObject(뿌리)
@interface ViewController : UIViewController

//외부에서 접근하기 위한 함수 / 클래스 메서드
//여기안에 작성함
@property (weak, nonatomic) IBOutlet UIButton *selectorTestButton;

@end
 - (void)viewDidLoad {
 SEL btnSelector = @selector(onTestBtnClicked:);
    
    //✏️왜 []가 필요할까?
    //메서드를 호출할 때 반드시 필요함
    [_selectorTestButton addTarget:self action:btnSelector forControlEvents:UIControlEventTouchUpInside];

}

///sender가 UIButton이다
- (void)onTestBtnClicked:(UIButton *) sender {
    //_cmd : 이 자체가 셀렉터
    //_cmd(셀렉터) 이름을 가지고 오려면? NSStringFromSelector 사용
    NSLog(@"%@, btnTitle: %@",
          NSStringFromSelector(_cmd),
          sender.titleLabel.text);
}

 

Swift로 변형해 본다면?

 

func viewDidLoad() {
    let btnSelector = #selector(onTestBtnClicked(_:))

    //✏️왜 []가 필요할까?
    //메서드를 호출할 때 반드시 필요함
    selectorTestButton.addTarget(self, action: btnSelector, for: .touchUpInside)

}

///sender가 UIButton이다
@objc func onTestBtnClicked(_ sender: UIButton?) {
    //_cmd : 이 자체가 셀렉터
    //_cmd(셀렉터) 이름을 가지고 오려면? NSStringFromSelector 사용
    print(
        "\(NSStringFromSelector(#function)), btnTitle: \(sender?.titleLabel?.text ?? "")")
}

 

id (Dynamic Object Type)

id 객체 포인터라고 보면 돼. Objective-C에서 모든 객체는 포인터로 다루어지기 때문에, id도 사실 객체의 포인터를 나타내는 타입입니다.

id는 컴파일 타임에 타입 체크를 하지 않기 때문에 런타임에서 더 많은 유연성을 제공합니다.

 

  • 객체 타입을 알 수 없을 때 또는 여러 타입의 객체를 처리할 때 유용합니다.
  • id 타입은 기본적으로 모든 객체의 메서드를 호출할 수 있으나, 안전하지 않을 수 있어서 신중하게 사용해야 합니다.

 

#ifndef Friend_h
#define Friend_h
#import <UIKit/UIKit.h>
//인터페이스는 클래스를 정의함
//외부에서 접근 가능하게함
@interface Friend : NSObject

//id: 클래스 인스턴스에 대한 주소
//Friend 생성해서 Static method처럼 사용하기 위해 +로 작성함
+(id)getAFriend;

//+(id)getAFriend;와 동일함
+(Friend *)getAMyFriend;
@end

#endif /* Friend_h */

 

#import <Foundation/Foundation.h>
#import "Friend.h"


//@interface-extension 클래스 확장 - 클래스 안에서 사용(private Property)
@interface Friend ()
{
    //내부에서 사용하는건 언더 스코어를 많이 사용함(_)
    NSString * _name;
}


@end


//구현부
//어떤 메서드를 가지고 있으면 상세하기 구현하는 부
@implementation Friend



- (void)sayHello {
    
    
    self -> _name = @"zizi";
    self -> _nickname = @"nickname 변경";
    NSLog(@"안녕하세요! %@", self->_name);
}

+ (void)sayGoodbye {
    NSLog(@"GoodBye");
}

//클래스 객체 인스턴스 메모리 주소를 반환(포인터)
+(id)getAFriend {
    //return [[Friend alloc]init];
    //        ↓↓↓↓↓
    //setter를 통해 이름을 바꿔줌
    Friend *aFriend = [[Friend alloc]init];
    
    [aFriend setNickname: @"setNickname으로 해서 변경할 수 있음"];
    
    return aFriend;
}

//      ↓↓↓↓↓ 동일하다
// Pointer = id(== 클래스 객체 인스턴스 메모리 주소를 반환(포인터)) 동일함
+(Friend *)getAMyFriend {
    //return [[Friend alloc]init];
    //        ↓↓↓↓↓
    //setter를 통해 이름을 바꿔줌
    Friend *aFriend = [[Friend alloc]init];
    
    [aFriend setNickname: @"Pointer = id(== 클래스 객체 인스턴스 메모리 주소를 반환(포인터)) 동일함"];
    
    return aFriend;
}

@end

 

Friend *createdFriend = [Friend getAFriend];
    
    NSLog(@"createdFriend: %@", [createdFriend nickname]);
    
    Friend *createdMyFriend = [Friend getAMyFriend];
    NSLog(@"createdFriend: %@", [createdMyFriend nickname]);

 

Swift변환

import Foundation

//@interface-extension 클래스 확장 - 클래스 안에서 사용(private Property)

//구현부
//어떤 메서드를 가지고 있으면 상세하기 구현하는 부
class Friend {
    //내부에서 사용하는건 언더 스코어를 많이 사용함(_)
    private var name: String?

    func sayHello() {


        name = "zizi"
        nickname = "nickname 변경"
        print("안녕하세요! \(name ?? "")")
    }

    class func sayGoodbye() {
        print("GoodBye")
    }

    //클래스 객체 인스턴스 메모리 주소를 반환(포인터)
    class func getAFriend() -> Any? {
        //return [[Friend alloc]init];
        //        ↓↓↓↓↓
        //setter를 통해 이름을 바꿔줌
        let aFriend = Friend()

        aFriend.setNickname("setNickname으로 해서 변경할 수 있음")

        return aFriend
    }

    class func getAMy() -> Friend? {
        let aFriend = Friend()

        aFriend.setNickname("Pointer = id(== 클래스 객체 인스턴스 메모리 주소를 반환(포인터)) 동일함")

        return aFriend
    }
}

 

반응형

'Objective-C' 카테고리의 다른 글

Obj-C | h, m, file 파일 구조: Swift와의 차이점  (0) 2024.10.24
Objective-C | 참고 사이트 추천  (0) 2024.10.24