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

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

 

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

 

위의 소스를 예로 들면

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

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

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

 

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

 

 

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

 

 

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

 

인다이렉션과 객체

 

 

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

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

 

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

 

 

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

 

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

+ Recent posts