'하면서'에 해당되는 글 1건

  1. 2010.06.22 [Objective-C] 1주일 하면서 알아낸 것들
오브젝트C2010. 6. 22. 09:53
[Objective-C] 1주일 하면서 알아낸 것들
Objective-C 할때 맥시스템이 무조건 필요한 것은 아니다.
Objective-C 의 기본요소들은 dev-c++ 이라는 프로그램을 설치하면 확인하며 배울수 있기 때문에 기본 요소들은 Windows 환경에서 해볼 수 있고 iphone sdk 를 작업 해야 할때 그제서야 맥 시스템이 필요하게 된다. 윈도우에서 기본적인 스킬을 익히고 내길이다 싶다면 맥을 지르도록 하자.

메소드 호출은 []로 감싸게 된다.
[object method];
object 란 객체의 method 란 메소드를 호출하게 된다. 기본적인 메소드 호출의 형태이다. 이것은 매개변수가 없는 형태의 호출이고 매개변수가 있는 형태는 다음과 같다.

[object methodWithInput:input];
object 객체에 methodWithInput 이라는 메소드를 input 이라는 값으로 호출하는 것이다. ActionScript 관점으로 본다면
object.methodWithInput(input); 이러한 형태가 될 것이다.

매개변수가 2개 이상인 메소드는 2번째부터 매개변수 명이 붙게 된다.
약간 변태같은 소리같은데 첫번째 매개변수는 이름이 붙지 않게 된다. 
[object initWithMin:0 max:10 step1:];
이러한 상황에서는 object 라는 객체의 initWithMin메소드를 첫번째 인자 0, max라는 인자 10, step이라는 인자를 1이라는 값으로 호출했다. 2번째 부터 인자명이 따로 들어가지만 그렇다고 순서를 섞어쓰면 에러가 나게 된다.
잘 기억할 문제이며 initWithMin이 메소드 명이고 그 이후에는 구분자 없이 단순히 띄워쓰기로 구분한다는 것이다. 그리고 순서도 꼭 지켜야 한다.

할당은 id + alloc
내가 액션스크립트를 주로해서 그런지 id 라는 것에 액션스크립트 키워드 var의 느낌을 느끼게 되었다. id 는 모든 객체의 포인터 정도가 된다. C에서 따지면 void* 정도라는데 어떤느낌인지는 잘 모르겠다.
alloc의 경우 메모리 할당의 과정이다. 간단한 예를 들어 보게 된다면 아래와 같다.
id obj = [[A alloc] init];
id 타입의 obj를 생성했다. id는 모든것이 들어갈 수 있는 포인터같은 개념이기 때문에 obj는 어떠한 객체가 와도 에러를 내지 않는다.
[A alloc] 의 의미는 A 라는 클래스의 인스턴스를 쓰기 위해서 그만한 메모리를 할당 한 것이다. 이는 사용할 만한 공간을 만들고 다음에 추가로 오는 메소드인 init 이 초기화를 해 주는 것이다.
이렇게 되면 obj 라는 변수에 A라는 클래스가 init이라는 메소드를 통해 초기화 하여 들어가게 된다.
여기서 [] 괄호가 2번 중첩되어 사용되었는데 이것은 id 때문에 가능하다. alloc 이라는 메소드는 NSObject의 클래스 메소드로 id 를 리턴한다.
리턴형을 선언하지 않는다면 기본으로 id를 리턴한다고 한다. id를 리턴하게 되면 [A alloc] 이 수행 한 이후 메모리 할당 받은 객체가 리턴되어 바로 [obj init]; 과 같은 형태가 되게 된다. 그래서 []괄호 중첩으로 다수의 메소드를 연속으로 수행 할 수 있게 된다.

클래스 선언은 .h 에서 구현은 .m에서 한다.
ActionScript 에서는 선언과 구현이 동시에 이루어 지지만(interface 제외) Objective-C에서는 선언과 구현이 따로 이루어 지게 된다.
여기서도 Interface라고 명하지만 상당히 다른 의미이다.
@interface A:NSObject 라고 쓰게되면A 라는 클래스를 NSObject를 상속받아 선언하겠다고 하는 것이다. NSObject 는 최상위 클래스로 무조건 1개 이상은 상속 받아야 한다고 한다.
선언이 끝나게 되면 @end라고 써주게 되며 ;는 붙이지 않는다.
이제 구현한다면 @implementation A 라고 써주고 선언한 메소드들을 구현해 준다.
기본 형태는 .h 에서 선언 .m 에서 구현 어디선가 있을 main 클래스역시 .m 으로 구현된다. 확장자가 틀리니 에러가 나버려 확장자에 주의 하여야 한다.
하지만 저렇게 안해버려도 크게 상관 없었다. ActionScript 에서는 클래스명과 파일명이 일치해야 했지만(.as에서 최소 1개는 일치) Objective-C에서는 main.m 하나 만들어두고 거기다가 @interface 로 다수의 클래스를 선언해 버리고 @implementation 으로 다수의 클래스를 구현해 버리고 main 메소드로 시작점 잡아버리면 모든것이 1개의 파일에서 끝나버리는 경우도 있었다. 물론 관리는 개판으로 될듯 하다.



출처 : http://blog.naver.com/PostView.nhn?blogId=khagaa&logNo=30082930880
Posted by 오늘마감

댓글을 달아 주세요