오브젝티브-C에서 BOOL은 실제로
8비트의 저장 공간을 갖는 부호 있는 문자(signed char) 타입을 단지 형 정의(typedef)한 것이다.
YES는 1로 정의되어 있고 NO는 0으로 정의되어 있다.(#define 사용). 오브젝티브-C는 BOOL을 YES나 NO의 값만을 담을 수 있는 진정한 Boolean 타입으로 여기지 않는다. 만일 1바이트보다 큰 값의 정수(예를들면 short나 int 값 등)를 BOOL 변수에 넣는다면, BOOL 변수의 값에서 하위 바이트만 사용한다. 하위 바이트가 0인 경우(예를들어 8960, 16진수로 0x2300등) BOOL 값은 0, 즉 NO값이 된다.
연구해보자..
아래 함수는 2개의 int값을 받아서 값이 같다면 NO를 값이 다르다면 YES를 리턴시킨다.
경험많은 C프로그래머라면 이 함수를
BOOL areIntsDifferent(int thing1, int thing2)
{
if(thing1 == thing2){
return NO;
}
else {
return YES;
}
}
아래와 같이 줄여쓸수도 있다.
BOOL areIntsDifferent(int thing1, int thing2)
{
return (thing1 - thing2);
}
별 문제없다.
헌데 이 함수를 사용할때 주의해야 하는데..
if (areIntsDifferent(23, 5) == YES)
{
// ... 참값??
}
만약 이런식으로 사용한다면 areIntsDifferent 함수가 리턴하는 값은 23 - 5 인 18이 될테지만.. YES(1) 값과 틀려 거짓으로 판단한다. 그럴땐 아래와 같이 사용하면 된다.
if (areIntsDifferent(23, 5))
{
// ... 참값
}
// 또는
if (areIntsDifferent(23, 5) != NO)
{
// ... 참값
}
NSLog의 %@형식지정자?
NSLog 함수를 사용하다보면 %d, %s같은 형식지정자를 볼수 있다.
%@ 이런 형식지정자가 있는데 무슨 의미일까? NSLog()를 만든 사람들은 문자열에서 문자를 사용하고 콘솔에 출력하도록 보내는 NSString처럼 적절한 인수를 받아들이는 NSLog()명령에 %@형식 지정자를 추가했다.
NSLog()를 사용해서
어떤 객체의 값을 출력할 때, %@ 형식지정자를 사용한다. 이 식별자를 사용할 때, 객체는
decription이라는 이름의 메소드를 통해 자신의 NSLog() 형식을 제공한다. NSString의 description 메소드는 단순히 문자열의 문자들을 출력한다.