Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
iOS Developer/Objective-C

15. Objective-C typedef, type casting

by Toughie 2024. 5. 17.

KAKAO-Choonsik

typedef

Objective-C의 typedef는 Swift의 typealias와 동일한 기능을 수행한다.

둘 다 기존 타입에 새로운 이름을 부여하여 가독성을 높이고 코드의 간결성을 유지하는 데 사용된다.

 //Swift
 typealias MyUnsignedInt = UInt
 let value: MyUnsignedInt = 10

 

Objective-C typedef

// 이제 BYTE는 unsigned char 대신 쓰이게 된다.
// 구별을 위해 주로 대문자로 작성한다.
typedef unsigned char BYTE;
BYTE b1;

 

구조체의 typedef 사용

typedef struct Musics {
    NSString *title;
    NSString *artist;
    int playTimeSec;
} MUSIC;

int main(void) {
    MUSIC music1;
    music1.title = @"Event Horizon";
    music1.artist = @"YOUNHA";
    music1.playTimeSec = 301;
}

 

typedef와 #define의 차이

typedef는 '타입'에만 제한적으로 다른 이름을 부여하는 것이라면,

#define은 '값'에도 별칭을 부여할 수 있다.

 

typedef는 컴파일러에 의해 해석되는 반면

#define은 전처리기에 의해 처리된다는 차이가 있다.

 


 

type casting

타입 캐스팅은 변수의 타입을 다른 타입으로 변경하는 것을 말한다.

(type_name) expression 와 같은 방식을 명시적 타입 캐스팅이라고 한다.


implicit upcasting

타입이 다를 경우 작은 타입에서 큰 타입으로 암묵적 형변환이 일어나는 케이스

int main(int argc, const char * argv[]) {
    int sum = 70, count = 5;
    CGFloat mean;
    
    //형변환 연산이 나누기 연산보다 우선순위에 있다.
    //count는 CGFloat으로 암묵적 업케스팅이 된다.
    mean = (CGFloat) sum / count;
    NSLog(@"mean: %f\n",mean);
    
    return 0;
}

 

Integer Promotion(정수 승격)

C계열에서 특정 연산에서 작은 정수 타입이 더 큰 정수타입으로 암묵적으로 변환되는 것을 말한다.

이는 데이터 손실을 방지하고 일관적인 연산을 위해서 이루어진다.

char와 short는 모두 int로 승격된다.

unsigned char와 unsigned short는 모두 int로 승격되나,

int가 표현하지 못하는 경우 unsigned int로 승격된다.

int main(int argc, const char * argv[]) {
    int i = 99;
    char c = 'a'; //97
    //연산 시 char가 int로 암묵적으로 승격된다
    int sum2 = i + c;
    NSLog(@"Integer Promotion Sum: %d",sum2); //196
 	
    return 0;
}

 

Usual Arithmetic Conversion

C계열에서 두 피연산자 간의 연산을 수행할 때 발생하는 형 변환 규칙

먼저 정수 승격 이후, 여전히 피연산자의 타입이 다르면 작은 타입이 더 큰 타입으로 변함

 

int -> unsigned int -> long -> unsigned long -> long long -

> unsigned long long -> float -> double -> long double

 

int main(int argc, const char * argv[]) {
    short a = 5;
    double b = 2.0;
    double result = a + b;
    //a가 정수 승격 이후에도 b와 타입이 다르기 때문에 double까지 자동 변환됨
    NSLog(@"%f",result);
    
    return 0;
}