반응형
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]);
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 |