'Objective C/데이터형과 표현식'에 해당되는 글 5건

  1. 2010.05.05 동적타이핑과 id 데이터 타입
  2. 2010.03.15 형변환
  3. 2010.03.15 대입연산자
  4. 2010.03.07 데이터의 정밀도
  5. 2010.03.07 기본 데이터 타입과 서식문자
 Objc에서 역시 동적 객체를 제공하고 하고 있다. 일전에 데이터형에 대해 잠시 나왔지만 바로 id 객체이다.
이 id객체는 모든 객체를 담을 수 있다. 그러나 역시 다소 위험한 부분이 존재한다. 동적 타이핑의 가장 큰 문제 점은 컴파일시에는 모르다가 런타임시에 에러가 발생할 수 있다는 것이다. 또한 정적 타이핑보다 프로세스 면에서 떨어진다. 이는 컴파일 당시 일관성 있게 변수를 활용할 수 있도록 하지 못함이다. 즉 무엇이 그 값으로 존재하고 어떻게 변하는가를 컴파일러가 알수가 없으므로 성능면에서 정적 타이핑 보다 떨어지게 되지만 가끔 잘 사용하면 골치 아픈 문제를 해결 할 수 있다.

가령 A.m이라는 클래스에 runA라는 메서드가 있다.
A를 인스턴스 myA로 생성 후 id객체 dA라는 값으로 넣었을 경우
아래와 같은 명령문 처리가 가능하다.
[ dA runA ];
이는 myA의 인스턴스 주소지를 id객체인 dA라는 변수에 담고 있으므로 실행이 가능하며 직접 아래처럼 A의 인스턴스에 접근하여 실행하는 것과 같다.
[ myA runA ];

Posted by 버터백통
형변환을 하기위해서는 어떠한 변수나 상수앞에 (int), (float), (double), (char)등을 사용하여 변환하며  AS3에서 처럼 소괄호로 범위를 묶어주는 것이 없다. 따라서 바로뒤의 값이 형변화의 범위가 된다. 가령 a = (float) num / 100; 에서처럼 빨강색 부분이 float형의 볌위가 된다.
객체의 형변환 같은 경우 포인터의 변경을 의미하는 것이므로 *를 사용하여 사용하고자 하는 객체로 변환시킨다. 내부적으로는 지정되 있던곳의 RC가 감소하고 참조하고자 하는 객체의 RC가 증가한다.
가령 a = ( A * ) b; 에서 a는  A라는 객체로 b라는 객체를 형변환 시키는 것이다.
Posted by 버터백통
대입연산자 = 를 이용하여 우변의 값,객체를 좌변으로 대입하는데 몇가지 연사자와 같이 사용된다.
+= : 우항의 값만큼 증가
-= : 우항의 값만큼 감소
/= : 우항의 값으로 나누어 대입
*= : 우항의 값으로 곱하여 대입
위의 대입연산자를 사용할 때 대입연산자의 연산우선순위는 제일 하순위이다
따라서 a /= b+c의 경우 우항의 (b+c)가 먼저 연산하고 그 값으로 a값을 나누게 된다.

이러한 대입연산자를 사용할 경우 실행되는 프로세스를 조금 더 가볍게 하기 위함이다.
Posted by 버터백통
얼마전 비교적 정확한 산술식을 요하는 컨텐츠를 개발하던 중 AS3에서 지원하는 부동소수점 연산이 부정확하여 곤욕을 치른적이 있다... 물론 모든 언어가 완벽하게 정확하게 표현하는 것을 있을 수 없지만 생각보다 작은 정밀도에 double이나 long...등의 부재에 아쉬움이 남았다. 그래서 Objc에서는 얼마나 정밀도를 보장할까 궁금하여 테스트해보았다.

당연히 int 연산 결과 값보다 float 값이 정확하다

하지만 크기를 생각하여 int와 float, double을 생각하여야 한다.

산술결과는 정수 (*,/) 정수는 int를 반환하고 정수 (*,/) 소수는 double형(배정밀도)으로 반환한다.

int a=25;

int b=2;

float        c=25.0;

float        d=2.0;

NSLog(@"6+a/5*b=%i",6+a/5*b); //16

NSLog(@"a/b*b=%i",a/b*b);     //24

NSLog(@"c/d*d=%f",c/d*d);     //25.000000

NSLog(@"-a=%i",-a);           //-25



* Decimal 산출식 정밀도 테스트

AS3  Number밖에 지원되지않는다. 크기는 어정쩡한 53bit 그래도 큰 값인데...

AS3에서 부동소수점 연산 시 어느 순간에 개의 값이 사라진다..문제가 심각

float 경우 어느 순간에 1.19999999 같이 뒤에 9 연속이 붙는다. 플래시보다야 심각하지만 그래도 심각하다.

double 경우 현재까진 계산이 비교적 정확하다. 하지만 8byte를 차지한다.


double l=0;

int i=0;

for(i=1; i<=100; i++){

l += 0.1;

NSLog(@"l+=0.1 : %f",l);

}

*참고
단정밀도 : 흔히 float의 범위의 정밀도, 32bit(4byte)
배정밀도 : double의 정밀도, 64bit(8byte)
Posted by 버터백통
Objc에서 지원되는 기본 데이터형 역시 C와 같다. 

[제공하는 기본 데이터 타입]
타입                     서식문자
char                      %c
int                         %i(10진수표현), %x, %#x(16진수표현),  %o,%#o(8진수 표현)
unsigned int       %u(10진수표현), %x, %#x(16진수표현),  %o,%#o(8진수 표현)
float                      %f(float형표현), %e(지수로그표현), %g(지수가 -4~5사이 값이 아니면 %e로 표기 그 외 값은 %f로 표기 )
double                 %f(float형표현), %e(지수로그표현), %g(지수가 -4~5사이 값이 아니면 %e로 표기 그 외 값은 %f로 표기 )
id                          %p

이외에 long과 long long, short, unsigned등의 수식어를 붙여 표현 데이터 범위를 확장 또는 축소한다.
shot int                                   %hi, %hx, %ho
unsigned short int                %hu, %hx, %ho
long int                                   %li, %lx, %lo
unsigned long int                 %lu, %lx, %lo
long long int                          %lli, %llx, %llo
unsigned long long int        %llu, %llx, %llo

long double                           %lf, %le, %lg

* Objc에서는 모든 부동 소수점 상수를 최소 64비트(8byte)를 사용하는 double형으로 설정한다. 
만약 별도의 float형으로 선언하고 싶다면 숫자 뒤에 f나 F를 붙인다.
12.567f


Posted by 버터백통