Contents

Java
2013.12.28 09:40

3.6.4 참조 변수끼리의 할당

조회 수 535 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄


3.6.4 참조 변수끼리의 할당

참조 변수의 의미를 알았으니 이번에는 참조 변수의 할당이라는 측면에서 알아보자. 일반적인 변수의 경우 다음과 같이 값복사를 할 수 있다.

▒ 기본 데이터 타입의 값복사
 
int a = 5;
int b = a;

아주 단순한 할당이다. 참조에도 이 법칙을 적용해보자. 먼저 여러분이 알아야 할 것은 자바에서 참조값을 만드는 방법은 new 연산자를 이용하는 방법밖에 없다는 것이다. 참조값을 사용자가 직접 수(手)작업으로 만드는 방법은 없다. 가상머신의 허락을 얻어야만 참조값을 얻을 수 있다. 그 허락을 받는 것이 바로 new 연산자이다.

참조값을 테스트하기 위해서 다음과 같이 단순한 클래스를 하나 만들도록 하자.

§ chap03\MotorCycle.java
 
/**
참조를 증명하기 위한 클래스
**/
public class MotorCycle { 
    private int id;
    private int speed;
    public void setData(int i, int s){ 
        id = i;
        speed = s;
    }
    public void drive(){ 
        System.out.println("이 오토바이의 번호판은 " + id + " 입니다.");
        System.out.println("오토바이는 현재 " + speed + " Km 속도로 달립니다.");
    }
/***
c:\javasrc\chap03>javac MotorCycle.java
***/

오토바이의 번호판(id)과 속도(speed)를 세팅한 후 운전을 할 수 있는 MotoCycle 클래스를 만들어 보자. 다음과 같이 메모리가 있는 객체와 메모리가 없는 객체를 만들도록 하자.

▒ 메모리 없는 객체 m과 메모리 있는 객체 c의 생성
 
MotorCycle m = null;
MotorCycle c = new MotorCycle();

현재 m은 참조값을 저장할 수 있는 4바이트의 메모리만 확보한 상태이다. m에 연결된 객체는 없다. 그리고 객체 c는 참조 변수에 실제 객체가 연결되어 있다. 기본 데이터 타입 변수의 할당의 방법처럼 참조 변수끼리 할당해보자.

▒ 참조 변수끼리의 할당(참조값 값복사)
 
MotorCycle m = null;
MotorCycle c = new MotorCycle();
m = c;

이렇게 하면 무엇이 복사될까? 이것은 참조값 값복사가 된다. c에는 참조값이 들어 있기 때문에 c의 참조값이 m으로 값복사되어 들어간 것이다. 여러분은 앞에서 값복사에 대해서 배웠다. 두 개의 메모리가 존재하고, 한 쪽의 메모리에 들어 있는 값을 다른 쪽에 값만을 복사한다라고 배웠다. 현재의 'm = c'는 c에 들어 있는 정수값 즉 4바이트의 참조값을 m에 복사하는 것이다. 결국 똑같은 참조값을 가지기 때문에 m과 c는 똑같은 메모리를 가리키는 것이다. 이것을 증명하는 예를 만들면 아래와 같다.

§ chap03\MotorCycleMain.java
 
/**
참조 값복사를 테스트하는 예
**/
public class MotorCycleMain {
    public static void main(String[] args){
        MotorCycle c = new MotorCycle(); //메모리 있는 객체 변수 선언 
        c.setData(9872, 150);
        c.drive();
        System.out.println("객체 c : " + c); //객체 출력
        System.out.println();//한줄 추가
  
        MotorCycle m = c; //참조값복사 
        m.drive(); //복사된 참조값을 이용한 메서드 호출
        System.out.println("객체 m : " + m); //객체 출력
        System.out.println();//한줄 추가
  
        System.out.println("객체 비교 c==m : " + (c == m)); 
    
/***
c:\javasrc\chap03>javac MotorCycleMain.java
c:\javasrc\chap03>java MotorCycleMain
이 오토바이의 번호판은 9872 입니다.
오토바이는 현재 150 Km 속도로 달립니다.
객체 c : MotorCycle@12498b5
  
이 오토바이의 번호판은 9872 입니다.
오토바이는 현재 150 Km 속도로 달립니다.
객체 m : MotorCycle@12498b5
  
객체 비교 c == m : true
***/

위의 예제에서 객체 c를 m에 참조값 값복사를 하고 있다.

▒ 참조값 값복사
 
MotorCycle m = c;

참조값 값복사 이후에 m은 새로운 객체의 메모리를 생성한 것이 아니라 c의 참조값을 이용하고 있는 것이다. 이렇게 되면 하나의 메모리를 두 참조 변수가 가리키게 된다. 그렇기 때문에 다음과 같이 두 객체를 비교했을 때 true의 결과를 얻을 수 있다.

▒ 참조 변수의 비교
 
System.out.println("객체 비교 c == m : " + (c == m));

☞ 객체 변수와 참조 변수
객체 변수는 참조 변수이며 참조 변수끼리의 할당은 참조값 값복사가 된다. 참조값끼리 아무리 복사를 하더라도 객체 내부의 메모리끼리의 복사는 이루어지지 않는다. 단지 참조값만이 복사되어진다. 이러한 이유에서 자바에서는 값에 의한 호출(Call by Value)만 존재한다. 참조값 값복사도 값복사이다!


다음으로 참조 변수의 타입에 대해서 알아보자.

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
68 Java 3.6.7 결론 IT장인 2013.12.28 419
67 Java 3.6.6 MotorCycle m = new MotorCycle() IT장인 2013.12.28 895
66 Java 3.6.5 참조 변수의 타입 IT장인 2013.12.28 512
» Java 3.6.4 참조 변수끼리의 할당 IT장인 2013.12.28 535
64 Java 3.6.3 참조 변수의 특징 IT장인 2013.12.28 1109
63 Java 3.6.2 참조값의 원리 IT장인 2013.12.28 641
62 Java 3.6.1 객체의 메모리 생성 IT장인 2013.12.28 307
61 Java 3.5.5 private 멤버 필드를 사용하는 이유 IT장인 2013.12.28 1862
60 Java 3.5.4 private의 사용 이유 IT장인 2013.12.28 277
59 Java 3.5.3 private에 접근하는 방법 IT장인 2013.12.28 2206
58 Java 3.5.2 private의 접근과 컴파일 에러 IT장인 2013.12.28 666
57 Java 3.5.1 접근제어란? IT장인 2013.12.28 472
Board Pagination Prev 1 2 3 4 5 6 Next
/ 6