본문 바로가기

C/Objective C/Objective C

Objective C Number Object(숫자 객체) 다루는 예제 따라하기 숫자객체 지금까지 다룬 정수, 부동소수점 수, long 같은 모든 숫자 형은 Objective-C 언어의 기본 데이터 형이었 다. 다실 말해, 이것들은 객체가 아니었다. 그러므로 이것에 머세지 같은 것을 보내는 일은 불가능하다. 그런데 이런 형 값을 객체로 다뤄야 할 때가 있다. 예를 들어, Foundation 객체인 NSArray는 값을 저장할 수 있는 배열을 생성하도록 해준다. 이 값들은 객체여야 하기 때문에 이 배열들에 기본 데이터 형을 바로 저장할 수는 없다. 그 대신, 기본 숫자 데이터 형을 참조하려면(char 데이터 형도 포함) NSNumber 클래스를 사용하여 이 데이터 형들에게서 객체를 생 성할 수 있다. - 소스코드#import int main(int argc, const char * a.. 더보기
Objective C Framework(프레임워크) 프레임워크 프레임 워크는 프로그램을 쉽게 개발하도록 논리적으로 묶어 놓은 클래스, 메서드, 함수, 문서의 모음이다. 그중 프로그램 개발의 기본 혹은 기초를 제공하는 프레임워크가 바로 Foundation 프레임워크다. Foundation 프레임워크는 숫자나 스트링 같은 기본 객체, 객체의 컬렉션인 배열, 딕셔너리, 세트 등을 사 용하게끔 해준다. 또 이 프레임워크를 통해 날짜와 시간을 다루거나, 자동 메모리 관리 기능과 하부 파일 시스템을 사용하고, 객체를 저장(아카이빙)하며, 사각형과 같은 기하학 데이터 구조를 다룰 수 있다. Application Kit 프레임워크는 인터랙티브 그래픽 응용 프로그램을 개발하는 데 쓰는 방대한 양의 클래스 와 메서드 모음을 담고 있다. 이것들을 사용해서 텍스트, 메뉴, 툴.. 더보기
Objective C protocol(프로토콜) 프로토콜 ‘프로토콜’은 클래스 사이에서 공유되는 메서드 목록이다. 프로토콜에 나열된 메서드들은 해당하는 구현 부분이 없다. 프로그래머가 구현하도록 되어 있다. 프로토콜은 특정 이름과 관련된 메서드 모음을 정의하는 방법을 제공한다. 이 메서드들은 보통 문서화되어 어떤 식으로 동작하는지 알려 준다. 그 덕에 프로그래머가 원하다면 자신의 클래스 정의에서 이것들을 구 현할 수도 있다. 만일 특정 프로토콜에서 요구하는 메서드를 모두 구현하기로 했다면, 이는 프로토콜을 ‘따른다’ 혹은 ‘받아 들인다’고 말한다. 프로토콜을 정의하기는 쉽다. 그저 프로토콜 이름 앞에 @protocol 지시어를 붙이면 된다. 그 다음에 인터 페이스 부분에서 한 것과 동일하게 메서드를 선언하면 된다. 그러면 @end 지시어가 나오기 전까.. 더보기
Objective C category(카테고리) 예제 따라하기 카테고리 클래스 정의를 다루던 도중 새 메서드를 추가하고 싶을 때가 있을 것이다. 이를테면 Fraction 클래스에서 두 부수를 더하는 add: 메서드 외에도 뺄셈, 곱셈, 나눗셈을 하는 메서드가 필요할 수도 있다. 카테고리는 클래스 정의를 그룹짓거나, 연관된 메서드를 카테고리로 쉽게 모듈러할 수 있게 해준다. 또한 원본 소스코드에 접근하거나 서브클래스를 생성하지 않고도 현존하는 클래스의 정의를 쉽게 확장하 는 방법도 제공한다. 카테고리는 강력하면서도 매우 쉬운 기법이다. - 소스코드 #import #import @interface Fraction : NSObject { int numerator; int denominator; } @property int numerator, denominator; -(v.. 더보기
Objective C enum 예제 따라하기 열거 데이터 형 Objective-C에서는 변수에 할당 가능한 값의 범위를 지정할 수 있다. 열거 데이터형은 키워드 enum을 붙여서 정의한다. 이 키워드 뒤에 바로 열거 데이터 형의 이름이 붙고 그 다음에는 (중괄호 안에) 대입 가 능한 값들을 정의하는 식별자 목록이 나온다. 예를 들어, 다음 명령문으로는 flag라는 데이터 형을 정의한다. enu flag { false, true}; 이론적으로 이 flag형은 true와 false 값만 할당할 수 있다. 안타깝게도 컴파일러는 이 규칙을 위반해도 경고 메시지를 주지 않는다. enum flag 형 변수를 선언하려면 키워드 enum과 열거형 이름 flag를 쓴 다음 그 뒤에 변수 목록을 적어 준다. 다음 명령문으 endOfData, matchFound를 .. 더보기
Objective C 정적변수 예제 따라하기 정적 변수 앞서 메서드 외부에서 정의된 변수는 전역 변수만이 아니라 외부 변수도 된다고 이미 말했다. 그러나 전역 변수이면서도 외부 변수는 되지 않기를 원하는 경우가 많다. 다시 말하면, 특정 모듈(파일)에서는 지역변수 이면서 전역으로 변수를 정의하고 싶을 때가 있다는 이야기다. 만일, 특정 클래스 정의에 포함된 메서드를 제외하고는 특정 변수에 접근할 필요가 없다면, 이런 식으로 변수를 정의해야 합당하다. 파일 내에서 특정 클래스를 구현하는 부분이 있다면 파일 안에서 변수를 정적으로 정의하여 이를 달성할 수 있다. 만일 메서드(혹은 함수) 바깥에서 다음 명령문을 사용하면, 이 정의가 나오는 파일 안에, 명령문 다음에 등 장하는 모든 지점에서는 gGlobalVar의 값을 접근할 수 있다. 그러나 다른 파일.. 더보기
Objective C 전역 변수 외부 변수 만일 다음 명령문을 프로그램 초반에(메서드와 클래스 정의 그리고 함수 바깥에서)작성했다면 이 값은 그 모듈 어디서든 참조할 수 있다. int gMoveNumber = 0; 이 경우에 gMoveNumber가 ‘전역(global)’ 변수로 정의되었다고 말한다. 명명규칙(convention)을 따르면 보통 전역 변수의 첫 글자로 g가 쓰인다. 이를 통해 프로그램 코드를 읽는 사람은 변수의 범위를 알게 된 다. 사실, 변수 gMoveNumber를 이렇게 정의하면 다른 파일에서도 이 값에 접근할 수 있다. 특히 앞의 명령 문은 변수 gMoveNumber를 global 변수만이 아닌 ‘외부’ global 변수로 정의한다. ‘외부’ 변수는 그 값을 다른 메서드나 함수에서 접근하고 도 바꿀 수도 있는 변수다.. 더보기
Objective C Instance 변수의 범위를 조절하는 지시어 인스턴스 변수의 범위를 조절하는 지시어 이제 인스턴스 변수의 범위가 클래스에 정의된 인스턴스 메서드에 의해 제한된다는 것을 안다. 따라서 어 느 인스턴스 메서드든 특별한 방법을 사용하지 않고 인스턴스 변수에 이름으로 직접 접근할 수 있다. 또한, 서브클래스를 통해 상속받은 인스턴스 변수가 있음도 알 것이다. 서브클래스에 정의된 메서드는 상 속받은 인스턴스 변수에 이름으로 직접 접근할 수 있다. 다시 한 번 말하지만, 특별히 다른 무언가를 해주 지 않아도 된다. 인터페이스 부분에서 인스턴스 변수를 선언할 때 선언 앞에 네 가지 지시어를 붙임으로써 범위를 더 상세 히 설정할 수 있다. □ @protected – 어떤 클래스에서 인스턴스 변수가 정의되었을 때, 그 클래스와 그 서브클래스에 정의된 메서드는 이 .. 더보기
Objective C Class 초기화 예제 따라하기 클래스 초기화 하기 Fraction *myFract = [[Fraction alloc] init]; 두 메서드가 호출된 뒤, 보통 다음과 같이 새 객체에 값을 대입한다. 객체를 초기화하고 나서 초기값을 설정하는데, 보통 한 메서드에서 이 두 작업을 동시에 수행한다. 예를 들어, initWith:: 메서드를 정의하여 분수를 초기화하고 두 인수를 제공해 분자, 분모의 값을 설정할 수 있 다. 클래스에서 초기화 메서드의 이름은 보통 init... 으로 시작한다. 만일 클래스가 초기화 메서드를 하나 이상 갖는다면, 그 가운데 하나는 ‘지정된 초기화 메서드’여야 하고, 다른 메서드는 모두 이 초기화 메서드를 사용해야 한다. 지정된 초기화 메서드는 대개 가장 복잡한 초기화 메서드, 즉 가장 많은 인수를 받는 메서드.. 더보기
Objective C Polymorphism(다형성) 예제 따라하기 - 다형성 – 동일한 이름, 다른 클래스 다형성은 다른 클래스들 간에 동일한 메서드 이름을 사용할 수 있는 기능이다. 다형성을 이용하면 동일한 메서드 이름에 각각 응답할 수 있는 클래스 모음을 개발하는 것이다. 가능하다. 각 클래스 정의에서 특정 한 메서드에 필요한 코드를 캡슐화하여 다른 클래스의 정의로부터 독립적으로 만드는 방식으로 말이다. 또 한 다형성을 통해 동일한 이름의 메서드에 응답할 수 있는 새로운 클래스를 추가할 수도 있다. - 소스코드#import @interface Complex : NSObject { double real; double imaginary; } @property double real, imaginary; -(void) print; -(void) setReal: (doubl.. 더보기