2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[자바 기초] 객체 참조란? 객체 참조에 대해 알아보자.

2023. 6. 28. 19:52ㆍJAVA 기초

[객체 참조란 ?]

 

자바에서 정말 중요한 기본 중 하나이다.

 

과연 객체 참조란 무엇인가?

 

이 글 하나로 한방에 끝내도록 하자.

 

[객체 참조의 원리]

 

객체 참조를 알기전에 객체 참조의 원리를 알아야 한다.

 

자바는 객체를 저장할때 메모리 어딘가에 저장한다.

 

예를들어 보자.

 

 

 

나는 Item이라는 클래스를 만들어

 

Item01과 Item02를 만들었다.

 

당연히 클래스는 인스턴스(객체)를 만들 때 마다 메모리 다른 위치에 저장이 된다.

 

Item item = new Item()

    Item item2 = new Item()

 

이렇게 두 개의 객체를 만들면 각 각 다른 주소에 저장되며

 

이 객체는 동일한 객체가 아닌 다른 개체로 간주된다.

 

주소가 다른지 같은지 한번 보도록 하자.

 

 

 

로그 창을 본다면

 

아이템 1번과 2번의 메모리에 있는 주소가 각 각 다르다는 것을 알 수 있다.

 

이것을 이해한다면 이제 객체 참조에 대해 이해할 수 있다.

 

[객체 참조]

 

그렇다면 객체참조는 어떤 것일까?

 

객체 참조는 프로그램이나 메모리나 다른 저장 공간에서 특정의 변수의 값이나

레코드에 접근할 수 있도록 하는 값을 말한다.

 

이렇게 말하면 어렵다 한번 코드로 객체 참조를 보도록 하자.

 

 

이 코드를 한번 보자.

 

나는 item01에 아이템 이름과 가격을 각 각 넣었다.

 

아이템 이름 = 아이패드 프로 Max

 

아이템 가격 = 12,000

 

을 넣었고

 

ItemPut이라는 메서드에 Item 클래스를 넣었다.

 

이 메서드는 Item 클래스를 받은 객체의 이름과 가격을 각 각 

 

아이템 이름  = 아이폰 Max

아이템 가격 = 5,000

 

으로 넣었다.

 

만약 이 Item01과 Item02 가격과 돈을 찍어본다면 어떻게 될까?

 

 

 

찍어보니 내가 ItemPut에서 set으로 넣은 이름과 가격이 나오는 것을 확인 할 수 있다

 

 

 

 

이것이 바로 객체 참조이다.

 

아직까지 어려울 수 있는데 정말 쉽게 설명한다면

 

 

 

 

item01클래스가 ItemPut으로 들어간 순간

 

이 Item 타입의 item 변수 안에는 Item01의 메모리 주소가 들어가게 된다.

 

 

그렇게 되면 매개변수 값으로 들어온 item01의 주소가 -> item 변수에 들어가게 된 것.

 

그렇게 되면 같은 메모리 주소를 가진 item은 item01이 들어간 메모리를 참조 하고 있기 때문에

값을 변경하면 원본인 item01의 값도 영향을 받는 것.

 

이것이 바로 Call By Reference 이다.

 

자바의 변수라는 것은 곧 메모리 번지안에 들어가 있는 주소에 이름을 붙이는 것이 변수이다.

 

 

 

쉽게 이해하기 위해서는 item안에는 메모리 주소가 들어간다고 생각하자.

 

즉 ItemPut의 메서드로 들어간 순간 이렇게 해석된다.

 

Item 타입의 클래스의 접근권한을 허용하며 item 변수에는 item01의 메모리 주소를 가지고 있다.

 

그렇기 때문에 우리가 메서드에 받은 item의 가격과 이름을 변경해도

 

이 item 변수는 item01의 메모리 주소를 가지고 있기 때문에 값을 변경해도 item01의 아이템 이름과 가격이

영향을 받게되는 것 이다.

 

 

 

즉 우리가 맨 처음 찍었던 Item01 주소가 ItemPut(Item item) -> item의 변수에 저장되는 것 이다.

 

그렇다면 item02를 보자.

 

 

 

 

 

item02의 클래스가 ItemPut으로 들어간 순간

 

Item 클래스의 타입의 접근권한을 허용 하며 item 변수에 item02번의 메모리 주소를 가진다.

 

라는 의미가 되는 것 이다.

 

 

그렇다면 이 item의 변수는 item02의 주소를 가지게 되는 것 임으로

 

item의 이름과 가격을 변경한다면 item02의 주소를 가지고 있기 때문에

 

item02의 이름과 값이 변경되는 것 이다.

 

출력해본다면

 

 

 

이렇게 아이템 이름과 가격이 변경되는 것을 볼 수 있다.

 

 

즉 이해하기 쉽게하자면

 

타입이라는 것은 결국 접근권한을 허용하는 것 이며 변수는 그 데이터의 주소를 담아두는 공간이다.

 

 

 

 

즉 해석하자면 이렇다.

 

타입 = Item 

▶  Item 클래스의 접근권한을 허용 한다. 

 

변수 = item

▶ 매개변수로 들어온 item 데이터의 주소를 담는다.

 

 

사진으로 본다면 이런 형태 일 것 이다.

 

 

 

이렇게 객체 a와 객체 b가 같은 주소를 바라보고 있다면

 

객체 b를 변경하면 a의 값도 같이 바뀌는 것 이다.

 

 

자 그렇다면 예제를 하나 더 보자.

 

 

이런 클래스가 있다.

 

나는 필드 변수에 int형 배열을 만들어 {1,2,3,4,5}를 저장했다.

 

그리고는 ArrayList에 배열의 값을 9999 ~ 1111111까지로 저장했다.

 

그렇다면 값은 어떻게 나올 것 인가?

 

이제는 다들 이해가 쉬울 것 이다.

 

 

 

 

이렇게 동일한 배열의 값을 찍었음에도 불구하고 , 배열의 값은 다르게 나온걸 볼 수 있다.

즉 이것을 보면 알 수 있을 것 이다.

 

"원본 객체가 바뀌었다"

 

즉 우리는 배열의 주소의 있는 값을 직접적으로 바꾸었기 때문에 이렇게 배열의 값이 바뀌었다.

 

 

즉 이부분에 들어오는 array는 배열의 값 주소가 들어오는 것 이다.

주소값을 가진체로 주소값에 있는 값들을 건드리면 주소 값에 있는 값 자체가 바뀐다.

 

c언어에서 포인터를 사용해본 사람이라면 쉽게 이해할 것 이다.

 

이 코드를 자세하게 이해해보자.

 

타입 = int[]

▶ int형 배열을 사용할 수 있도록 접근 권한을 허용 한다.

 

변수 = array

▶ 매개변수로 들어온 array의 메모리 주소를 가지고 있는다.

 

▶같은 메모리 주소를 가지고 있음으로 값을 변경하면

필드 변수에 있는 array의 값의 영향을 받는다. 

 

 

 

다시한번 사진으로 본다면

 

Object A는 = int[] array = {1,2,3,4,5} 이며

 

Object  B는 = ArrayList에서 array의 주소값을 가진 함수이다. 

 

B와 A는 같은 메모리 주소를 가지고 있기 때문에

 

메모리에 저장되어있는 같은 객체를 가르키게 된다.

 

그렇게 된다면 B를 변경해도 A가 변경되게 되는 것 이다. 

 

 

[정리]

 

1. 자바에서 동일한 주소값을 가지고 있다는 것은그 주소값에 있는 값들을 가르키고 있는 것 이다.

 

2.그러므로 주소값의 값을 바꾸면 주소값안에 있는 값 자체가 바뀐다.