인다이렉션이란 변수와 객체의 값이 아닌 메모리 상의 위치에 대한 포인터를 가지고 작업하는 것이다.
즉 변수에 저장된 값으로 작업하지 않고 그 변수가 위치한 메모리 주소의 포인터를 가지고 작업하는 것을 말하는 것이다. 이것은 C언어에서의 포인터 개념과 같다.
포인터는 변수앞에 *를 붙이면 변수로 사용할수 있고, 일반 변수의 주소는 변수앞에 & 표시를 붙여서 참조할 수 있다.
위의 소스를 예로 들면
myvar이라는 정수형 변수에 10이라는 값을 저장하고
정수형 포인터로 myptr을 선언한다음, myptr변수에 myvar의 주소값을 받은 상태이다.
이것은 단순히 *myptr이 10이라는 값을 받은것이 아니라 myvar과 같은 주소를 사용하고 있는 것이다.
주소를 받은 다음에 그값을 변화시키고 싶다면 다시 *을 붙인 다음 값을 변환해주면 된다. 때문에 함수를 사용하더라도 주소를 옮기는 것이기 때문에 값을 유지할 수 있다.
▲포인터 myptr에 myvar주소를 옮기고 10을 증가시켰을때 myvar값이 증가하는 것을 볼 수 있다.
▲myvar주소를 함수 myFunction에 넣어줬기 때문에 값이 유지된다.
인다이렉션과 객체
전 게시물에 올렸던 이 코드는 BankAccount 타입의 객체를 처리하기 위하여 포인터 변수 account1를 선언해서 인다이렉션을 한 것이다.
alloc과 init 메서드는 객체를 메모리에 생성한 다음에 객체의 주소를 account1이라는 포인터 변수에 할당하는 것이다.
메서드를 호출과 같이 작업을 수행할 때 별표를 객체 포인터 앞에 둘 필요가 없다.
객체를 복사하기 위해서는 객체의 포인터에 대한 복사본이 생성된다는 점을 이해하는 것이 중요하다.
위의 소스로 account1과 account2는 메모리 상의 동일한 위치를 가리키게 된다.
'프로그래밍 > Objective-c' 카테고리의 다른 글
objective-c 맥, 아이폰 소스들 (0) | 2016.07.09 |
---|---|
objective-C, 오브젝트C, 오브젝티브C) Class(클래스) (0) | 2016.07.09 |