본문 바로가기

Language/Java

Chap07_13 참조(reference)

1. 참조 변수와 일반 변수의 차이 

일반 변수는 값 자체를 변수에 바로 저장.

참조 변수는 값이 들어있는 주소를 변수에 저장

(자세한 건 밑에 자세히 풀어썼으니 참고 해주세요.) 

https://dalcheonroadhead.tistory.com/68

 

일반 변수와 참조 변수 바로 알기

1. 데이터 타입의 종류 크게 기본 타입과 참조 타입으로 나누어진다. 두 타입을 나누는 기준은 무슨 값이 저장되는가 이다. 2. 각 타입들이 값을 저장하는 원리 기본타입은 해당 변수에 값 자체를

dalcheonroadhead.tistory.com

2. a=b; 이후 b에 다른 값을 집어넣었을 때 둘의 차이  

(1) 일반 변수의 경우

int a= 10; int b = 20;
a = b;

System.out.println(a);
System.out.println(b);

b = 100; 

System.out.println(a);
System.out.println(b);
// 결과 값
첫 번째 출력	:	20
			20

두 번째 출력	:	20
			100

Stack에서 값 자체가 바뀌고 a와 b는 서로 연관되어 있지 않다.

(2) 참조 변수의 경우

Camera c1 = new Camera();
Camera c2 = new Camera();

c1.name = "카메라1";
c2.name = "카메라2";

System.out.println(c1.name);
System.out.println(c2.name);

c2 = c1;

System.out.println(c1.name);
System.out.println(c2.name);

c2.name = "고장난 카메라";

System.out.println(c1.name);
System.out.println(c2.name);
//결과 값

첫 번째 출력
:	카메라1
	카메라2
    
두 번째 출력
:	카메라1
	카메라1
    
세 번째 출력
:	고장난 카메라
	고장난 카메라

c2 = c1; 을 해주는 순간 c1이 저장하던 주소값을 c2에 옮겨쓴다. 따라서 둘은 같은 주소를 가르키게 된다. 그 후 

c2.name = "고장난 카메라";

해당 명령어가 주소를 바꾼 게 아니므로 c1과 c2는 여전히 똑같은 주소를 가르킨다. 다만 주소가 가르키는 값이 바뀐다. 따라서 둘 다 고장난 카메라를 출력한다. 

따라서 일반 변수는 a= b 이후 다음 b에 이루어진대입은 a에게 영향을 주지 않지만, 참조 변수일 경우 a에게 영향이 간다.

3. 매소드에 인수로 넣었을 때 둘의 차이

(1) 일반 변수의 경우

매소드에 인수로 들어가는 것은 a,b에 들어간 값 자체임으로, 해당 매소드의 값이 a,b 변수에 영향을 주지 않는다. 

만약,

public static int changNum (int num1, int num2)
{
	num1 = num2;
    num2 = num1; 
}
public static void main(String[] args) {
   
    int a = 3; 
    int b = 10; 

            System.out.println(a);
            System.out.println(b);

    changNum(a, b);
            System.out.println(a);
            System.out.println(b);



}
출력 값
:	3
	10
    ----- 매소드 실행 후----
    3
    10

(2) 참조 변수의 경우

매소드에서 나온 뒤에서 매소드의 계산이 참조 변수에 영향을 준다. 

해당 매소드에 값을 가르키는 주소가 들어감. 값이 계속 변화해도 주소는 항시 그 값을 가르킴. 

이는 업데이트된 내용을 매소드가 끝나도 주소를 따라가면 볼 수 있게 만듦.

예시 : 서교 푸르지오 301동 803호라는 집이 리모델링 하고 있다. 우리는 리모델링 전의 집 상태를 주소를 통해 가서 볼 수 있고, 리모델링 후의 모습도 주소를 따라 가면 볼 수 있다.

//위의 Camera 객체 예시에서 이어서
changName(c2);

System.out.println(c1.name);
System.out.println(c2.name);

    public static void changName(Camera camera) {

        camera.name = "잘못된 카메라";
    }



//출력 값
:	잘못된 카메라
	잘못된 카메라

 

 

 

 

 

'Language > Java' 카테고리의 다른 글

[JAVA]열거형  (0) 2023.01.29
[JAVA]final  (0) 2023.01.29
[JAVA] Super  (0) 2023.01.28
일반 변수와 참조 변수 바로 알기  (0) 2023.01.28
[JAVA] 다형성(polymorphis)  (0) 2023.01.28