[IPhone 08.30]03. Objective - C의 특징

2010. 8. 30. 22:44IPhone/Basic

1.Objeect와 id
  객체란 기존에 C++이나 자바와 같이 객체 지향 언어에 사용되는 개념으로 "모든것이 객체다"라는 말이 있고 그 말은 세상에 존재하는 모든 사물과 그에따른 행위를 묶어둔 것을 객체라고 한다.
Objective C에서는 객체를 구분하는 데에 사용하는 구분자가 있다. 이건 좀 익숙하진 않지만 id라는 타입의 변수를 이용하는데 이는 씨언어에서 포인터와 비슷하게 사용됩니다. 실제로 사용해보면 거의 모든 값이 들어가는 타입일 수도 있기에 좀 알 수 없는 변수이기도 한거 같다. 여튼 이 id는 포인터와 같이 null값을 가질 수 있는데 이값은 C처럼 NULL이 아니고 nil로 사용하면 된다.

2. 함수호출보다는 메시지 전달!!
 [reciver message];
 
C언어의 경우에는 함수를 호출하고 사용하는것이였지만 이와 다르게 Objective-C의 경우는 호출하지 않고 메시지를 보내기만 한다고 생각하면 될 것이다. 예를 들어 myRect라는 객체에 display라는 메소드가 있고 이 메소드를 사용하기 위해서는
[myRect display]와 같이 사용하면 되는것이다.
 단 하지만 이것은 display와 같은 메소드가 없어도 컴파일시에 오류가 발생하지 않으며 실행중에도 특별히 오작동을 일으키거나 오류가 일어나지 않는다 단지 그 메세지를 무시하고 대기하거나 반복할 뿐이 될것입니다. 하지만 이로 인해서 원치 하는 문제가 발생 할 수 있다. 모두 오류가 나타나지 않기때문에 막 코딩을 다 해놓고 문제가 발생하지 않는데 자기가 원하는 값이 안나온다던지 프로그램이 진행되지 않는 경우에 난감할수 있다 일반적으로 이를 예상해서 로그를 남기는 방법이 있다.
이제 그 메소드에 인자값(parameter)전달 방법을 알아보는데 일반적으로 객체지향 언어에는 유연성이나 동적인 값전달을 위해 인자값을 가지고 있다. 이때 선언하는 방법은 [myRect display:20.0] 와 같이 하면 된다.

3.클래스
 객체지향 언어의 필수 요소중 하나인 클래스 클래스는 다들 알듯이 객체를 찍어내는 도구정도로 보면 되는 것이다.
클래스로 객체 생성은 myRect라는 클래스가 있는데 이 클래스를 생성하기 위해서는 두 가지방법이 있으며 첫번째로  myRect *newMyRect라고 정의하면 객체는 생성된 것이다. 또하나의 방법은 id를 사용하는 방법이다. id newMyRect; 라고 id의이름을 주고 newMyRect=[myRect alloc];라고 활당해주면 생성된것이다.
그리고 추가로 바로 초기화 하는 방법으로 newMyRect=[[myRect alloc] init];라고 해주는 방법도 있다. 당연 하지만 init도 정의 되어 있어야지 가능한 이야기가 된다.^^
 @interface 클래스이름:슈퍼클래스이름
{
      인스턴스 변수 선언
}
메소드 선언
@end

interface파일과 짝을 이루는 클래스의 실제 내용은 implementation파일이라고 부르며 형식또한 유사한 구조를 가진다.
 @implementation 클래스이름:슈퍼클래스이름
{
      인스턴스 변수 선언
}
메소드 선언
@end

4프로퍼티
  객체 내부의 인스턴스 변수를 직접 접근하는 것을 막고 변수에 값을 쓰는 메소드와 값을 반환하는 메소드를 별도로 두는 데이터를 의미하는데 객체지향 언어를 하는데 필수적이라고는 하는데 아직 제대로된 프로그래머가 아닌지 이게 필요한지는 잘 모르겠지만 일단 있는것 자체가 편해 보여서 좋은거 같다.

하지만 이기능은 Objective C 2.0부터 추가된 기능이다.

일반적으로 프로퍼티가 없을때 getter와 setter라고 부르는 메소드를 가지고 값을 읽거나 쓸수 있는데 이런 메소드를 accessor메소드라고 부르고 이를 사용하는데 예를 들어 다음과 같이 코드를 짜보았다.
 @interface myClass:NSObject
{
       int value;
}
-(int)value;
-(void)setValue:(int)newValue;
@end

@implementation Myclass
-(int)value{return value};
-(void)setValue:(int)newValue{value=newValue;}
@end
위의 경우는 방법은 [myClassInstance setValue:30];으로 쓰기 [myClassInstance value]하면 읽기가 된다.
다음은 같은 결과를 내기 위해서 사용하는 방법으로 프로퍼티를 사용하는것이다.
 @interface myClass:NSObject
{
    int value;
}
@property(copy,readwrite)int value;
@end

implementation myClass
@synthesize value;
@end;
위의 경우는 방법은 myClassInstance.value=30;로 쓸수 있고 myClassInstance.value 로 읽을 수 있다.
분명코드량으로 보거나 사용방법에서도 쉬운게 느껴지는것 같다. 한번도 사용해보지는 않았지만 한번쯤 써볼만 한거 같다!!

5. 프로토콜(Protocol)
  자바로 치면 인터페이스랑 같다고 하는데 자바를 주로 안해본 나로서는 전혀 쉽게 이해가 가질 않았다.. 걍 프로토콜이라고 하면 통신규약 정도로만 알았던 내용이지만 한번 들여다 보면 Ovjective C역시 클래스의 다중상속이 불가능하며 이에 따라서 다중상속과 유사한 구현을 할수 있게 @interface선언에 <>연결해서 지정해주므로 프로토콜 이름을 선언한다.
프로토콜은 하나이상의 메소드들의 집합이다. 예를 들어 다음과 같이 정의하였다.
  @protocal MyXMLSupport
-(NSXMLELement*)XMLRepresentation;
-initFromXMLRepresentation:(NSXMLElement*)XMLElement;
@end

프로토콜을 사용할 경우 #import문으로 프로토콜이 정의된 헤더 파일을 포함할 수 도 있고 @protocal지시문을 사용해도 된다.
  #import 프로토콜 파일명
@protocal 프로토콜명

과 같이 사용될수 있다.
또한 프로토콜 형식을 사용해 프로토콜 클래스를 얻을수 있다.
Protocol *myXMLSupportProtocol=@protocal(MyXMLSupport);
어렵게 생각하면 끝도 없지만 간단하게 보면 선언처럼 볼수 있다....