Contents

Java
2013.12.28 09:39

3.6.2 참조값의 원리

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

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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


3.6.2 참조값의 원리

new 연산자와 생성자를 이용해서 메모리를 하나 생성했다면 당연히 하나의 객체로써 사용할 수 있다. 하지만 new 연산자가 메모리를 생성한다고 했으며, 생성자가 호출된다고만 했지, 도대체 어떻게 메모리가 생성되어서 해당 메모리의 주소와 연결되는지에 대해서는 설명하지 않았다.


[그림 3.6.2] C++에서 클래스 변수 선언과 메모리 할당 과정

C++ 언어에서는 new를 이용해서 메모리를 생성했다면 직접적으로 주소 그 자체를 넘겨준다. 그렇기 때문에 주소를 저장하기 위한 포인터 변수를 이용해서 주소를 관리하게 된다. 위의 그림은 C++의 클래스로 메모리를 만들었을 때 메모리의 주소를 주소변수에 할당하는 예를 보여주고 있다.

C++에서는 사용자가 직접 주소를 핸들하게 된다. 그러나 자바 언어에서는 주소를 바로 주지 않는다. 클래스로 만든 데이터 타입으로 변수와 메모리를 생성했을 때 주소를 찾아보기는 힘들다. 자바에서는 객체의 주소 대신 참조값이라는 것을 할당 받게 된다. 그렇기 때문에 자바에서의 객체 변수를 참조 변수(Reference Variable)라고 말한다. PPT의 그림은 자바에서 참조값이 생성되는 순서를 보여주고 있다.

과정을 하나씩 따라가 보자. 위의 참조 변수의 메모리 할당의 순서대로 따라가 보자. 제일 먼저 Sun 클래스를 하나 만들도록 하자.

§ chap03\Sun.java
 
/**
참조의 원리를 테스트하기 위한 클래스 
**/
public class Sun { 
    public int distance;
    public int data;
/***
c:\javasrc\chap03>javac Sun.java
***/

그리고 나서 두 번째로 해당 변수를 선언한다. 메모리가 생성되기 전의 상태이기 때문에 null로 초기화한다.

▒ 객체 변수의 선언
 
Sun s1 = null;
Sun s2 = null;

그리고 세 번째로 메모리를 생성할 것이다.

▒ 객체 변수에 대한 메모리 생성
 
s1 = new Sun();
s2 = new Sun();

네 번째로 메모리가 생성되면 내부에서 인덱스 테이블(Index Table)에서 주소를 맵핑한 후 참조값을 하나씩 만들 것이다. 마지막으로 만들어진 참조값은 다시 참조 변수 s1과 s2에 할당될 것이다.

☞ 참조값은 누가 만드는가?
참조값은 가상머신(Virtual Machine)에서 자동으로 만들어지며, 객체를 구분하기 위한 유일한 수단이 된다.


실제 s1과 s2의 참조값이 서로 다르다는 것을 확인해보자. 다음은 위의 절차대로 객체를 생성한 후 s1과 s2의 참조값을 비교하는 예이다.

§ chap03\SunMain.java
 
/**
Sun 클래스를 이용한 참조값 비교
**/
public class SunMain{
    public static void main(String[] args){
        Sun s1 = null//객체 변수 선언 
        Sun s2 = null//객체 변수 선언 
        s1 = new Sun(); //메모리 할당 
        s2 = new Sun(); //메모리 할당 
        System.out.println("Sun의 변수 s1==s2 : " + (s1==s2));//객체 변수의 비교 
    
/***
c:\javasrc\chap03>javac SunMain.java
c:\javasrc\chap03>java SunMain
Sun의 변수 s1== s2 : false
***/

실행결과를 보면 참조값이 다르기 때문에 s1과 s2의 == 비교가 false인 것을 알 수 있다.

☞ 참조값의 확인
객체의 참조값은 가상 머신 내부에서 관리되기 때문에 객체의 참조값은 외부로 노출되지 않는다. 단지 객체의 참조 변수에 참조값에 해당하는 숫자가 들어 있다고 가정할 뿐이다.


□ == 연산자
◇ == 연산자는 자바에서 클래스의 참조값을 비교할 때 사용하는 연산자이다.

C 언어나 C++ 언어에서 메모리를 생성하는 작업과 자바에서 메모리를 생성하는 작업은 그 자체가 전혀 다른 의미를 지니고 있다. C++ 언어에서 new 연산자를 이용해서 메모리를 생성했다면 해당 메모리의 주소를 챙기게 된다. 하지만 자바는 메모리를 얻긴 하지만 해당 객체 변수가 주소를 가지지는 않는다. 주소에 연결되어 있는 참조값을 가지게 된다. 이런 의미에서 자바의 객체 변수를 참조 변수라고 하며, 참조 변수에는 참조값이라는 정수값이 들어가게 된다.

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