objective-c 맥 예제

browser.zip

Calculator1.zip

date.zip

image.zip

imagecap.zip

webkit.zip

아카이브.zip



objective-c 아이폰 예제

drawing.zip

empty.zip

imageinsert.zip

map 2.zip

touches.zip

web.zip

도형움직임.zip

타이머와 버튼&라벨.zip


인다이렉션이란 변수와 객체의 값이 아닌 메모리 상의 위치에 대한 포인터를 가지고 작업하는 것이다.

즉 변수에 저장된 값으로 작업하지 않고 그 변수가 위치한 메모리 주소의 포인터를 가지고 작업하는 것을 말하는 것이다. 이것은 C언어에서의 포인터 개념과 같다.

 

포인터는 변수앞에 *를 붙이면 변수로 사용할수 있고, 일반 변수의 주소는 변수앞에 & 표시를 붙여서 참조할 수 있다.

 

위의 소스를 예로 들면

myvar이라는 정수형 변수에 10이라는 값을 저장하고

정수형 포인터로 myptr을 선언한다음, myptr변수에 myvar의 주소값을 받은 상태이다.

이것은 단순히 *myptr이 10이라는 값을 받은것이 아니라 myvar과 같은 주소를 사용하고 있는 것이다.

 

주소를 받은 다음에 그값을 변화시키고 싶다면 다시 *을 붙인 다음 값을 변환해주면 된다. 때문에 함수를 사용하더라도 주소를 옮기는 것이기 때문에 값을 유지할 수 있다. 

 

 

▲포인터 myptr에 myvar주소를 옮기고 10을 증가시켰을때 myvar값이 증가하는 것을 볼 수 있다.

 

 

▲myvar주소를 함수 myFunction에 넣어줬기 때문에 값이 유지된다.

 

인다이렉션과 객체

 

 

전 게시물에 올렸던 이 코드는 BankAccount 타입의 객체를 처리하기 위하여 포인터 변수 account1를 선언해서 인다이렉션을 한 것이다.

alloc과 init 메서드는 객체를 메모리에 생성한 다음에 객체의 주소를 account1이라는 포인터 변수에 할당하는 것이다.

 

메서드를 호출과 같이 작업을 수행할 때 별표를 객체 포인터 앞에 둘 필요가 없다.

 

 

객체를 복사하기 위해서는 객체의 포인터에 대한 복사본이 생성된다는 점을 이해하는 것이 중요하다.

 

위의 소스로 account1과 account2는 메모리 상의 동일한 위치를 가리키게 된다.

객체는 데이터 변수와 메서드라 불리는 함수들로 구성, 이 함수를 호출하고 실행함으로써 작업을 수행한다.

(이것을 총괄하여 멤버(member)라고 부른다.)

 

오브젝티브-C 클래스는 interface와 implementation으로 정의된다.

클래스는 오브젝트가 생성되었을 때 어떠한 못브을 보일 것인지 정의하고, 메서드는 어떠한 일을 하는지, 멤버 변수는 어떠한 것이 있는지 정의한다.

 

interface

새로운 클래스가 상속받는 베이스 클래스를 지정하고, 클래스의 멤버와 메서드를 선언한다.

입력형식

@interface NewClassName: ParentClass{

ClassMembers;

}

ClassMethods;

@end

 

ClassMembers : 클래스에서 사용할 변수들을 선언한다.(이것을 인스턴스 변수라 불림)

멤버 변수를 선언하는 방식은 일반적인 오브젝티브-C의 변수 선언과 같다.

 

ClassMethods : 호출될 메서드를 선언한다. 메서드는 기본적으로 호출될 때 특정한 일을  수행하는 함수이다.

 

 

ParentClass​ : ParentClass에 NSObject 클래스가 들어갔는데 이 클래스는 오브젝티브-C 파운데이션 프레임워크의 표준 베이스 클래스로서, 대부분의 클래스 생성시 상속받는 클래스로 사용된다. 위의 소스는 BankAccount 클래스가 NSObject라는 부모 클래스로부터 상속을 받았기 때문에 우리가 직접 코딩할 필요없이 인스턴트의 생성,관리,제거에 대한 메서드를 이용할 수 있다.

 

인스턴스 변수(instance variables) : 객체지향 프로그래밍의 주요 목표는 데이터 캡슐화, 즉 데이터는 클래스 안에 저장되어야 하고 오직 클래스에서 선언된 메서드에서만 접근이 가능해야 하는데 클래스에서 캡슐화가 된 데이터가 바로 인스턴트 변수이다. (요약하면 클래스 내에서만 작용하는 변수)

 

클래스 메서드와 인스턴스 메서드

클래스 메서드는 클래스의 인스턴트를 생성하는 것과 같은 클래스 차원의 일을 수행

선언시 앞에 '+' 를 사용한다.

인스턴스 메서드는 두 개의 인스턴트 변수에 대해 산술 연산하여 결과를 얻는 것과 같은 클래스의 인스턴스에 대한 작업을 수행

선언시 앞에 '-'를 사용한다.

 

메서드가 반환할 결과 값이 있으면 메서드 이름 앞의 괄호 속에 데이터 타입을 지정해준다. (없다면 void)

데이터를 전달받아야 하는 경우에는 메서드 이름 뒤에 콜론을 붙인 후, 괄호 속에 데이터 타입과 인자의 이름을 지정

 

Ex)

 

1. 인스턴스 메서드에 결과값을 반환하지않으므로 void, y라는 long 타입 데이터를 받는다.

2. long 타입 데이터를 반환하는 인스턴스 메서드이다.

3. 반환값이 없는 한 인스턴스 메서드에 2개의 인자를 받은 것이다. (setAccount - long타입 y, andBalance - double타입 x)

 

implementation

클래스를 만드는 다음단계는 선언한 메서드의 코드를 implementation으로 구현하는 것이다. 

입력형식

@implementation NewClassName

ClassMethods

@end

 

interface 부분에서 선언한 메서드를 구현하려면 같은 클래스 이름을 쓰고 반환값이 있는곳에 return 변수; 를 해주면 된다.

 

 ▲이렇게 implementation 부분을 작성한다.

 

인스턴스 선언 및 초기화하기

 

이 클래스를 가지고 어떠한 일을 하기 위해서는 인스턴스를 만들어야한다. 가장 먼저 할 일은 인스턴스가 만들어졌을 때 이 인스턴스의 포인터를 저장할 변수를 선언하는 것이다.

입력형식

Ne​wClass 변수;    클래스 인스턴스의 참조를 저장할 변수를 만드는것

변수=[NewClass ClassMethods]   클래스의 메서드를 호출하는 것

 

 

위의 문장은 BankAccount *account1=[[BankAccount alloc] init]; 로 줄일수있다.

 

 

메서드 호출과 인스턴스 데이터 접근하기

 

메서드 호출 형식

[오브젝트포인터변수 호출할메서드];

 

 

오브젝티브-C 도트 표기법

도트 표기법이란 인스턴스 변수나 접근하려는 속성 이름 다음에 도트로 클래스 인스턴스를 지정하여 인스턴스 변수에 접근 하는방법이다. 도트 표기법을 이해하는 핵심은 선언된 신서사이즈 접근자 메서드들에 대한 인스턴스 변수들만 사용할 수 있다는 것이다. 만약 신서사이즈(synthesize)되지 않은 접근자에 대한 인스턴스 변수에 접근하려고 도트 표기법을 사용하려고 한다면 그 코드는 에러가 뜰 것이다.

(아마 선언한 인스턴트 변수만 사용할 수 있다고 설명하는 것 같다)

사용 예)

 

+ Recent posts