JAVA에서 가장 중요한 개념 중 하나 "참조변수" 알아봅시다.
#1
메모리 할당과정부터 알아봅시다.
C++ 에서 메모리할당 과정
class Cstal
- int a
- int b
Cstal* C = null; //선언
C = new Cstal(); //메모리를 생성하면서 실제주소를 C에 저장한다.(C는 결국 주소를 직접 가진다)
따라서 C++에서는 주소를 직접 핸들링 합니다.
- int b
Cstal* C = null; //선언
C = new Cstal(); //메모리를 생성하면서 실제주소를 C에 저장한다.(C는 결국 주소를 직접 가진다)
따라서 C++에서는 주소를 직접 핸들링 합니다.
JAVA 에서 메모리 할당 과정
class JStal
- int a
- int b
JStal J = null; //선언
J = new JStal(); //메모리를 생성하면서 실제주소를 해시코드로 생성하여 참조값을 J에 저장한다.(J는 참조값(해시코드)를 가진다)
C++스타일의 C변수를 출력하면 실제 메모리의 주소를 출력합니다. 하지만, JAVA스타일의 J변수를 출력하면 실제 메모리의 주소를 JAVA의 가상머신(Virtual Machine)의 인덱스 테이블(Index Table)에 의해 자동으로 생성된 유일한 키(Key) = 참조값 = 해시코드 가 출력이 됩니다.
따라서, C나 C++에서와 JAVA에서는 메모리를 생성 작업이 틀립니다. C나 C++에서는 메모리 주소를 객체 변수가 직접 가지지만, JAVA에서는 메모리 주소에 연결된 참조값을 변수가 가지게 되는 것입니다.
#2
그럼.. 여기서 하나의 의문이 드는데..참조변수끼리 할당을 할땐 어떻게 될까요?
Jstal J = new Jstal();
J.a = 4;
J.b = 5;
J.a = 4;
J.b = 5;
Jstal K = J;
이렇게 되면 K에는 어떤 값을 가질까요? J의 클래스 메모리 전체를 복사하는 것이 아닌 J에 저장되어 있는 참조변수만!을 K로 복사한다고 하네요. 그럼 J나 K나 같은 메모리를 참조하고 있는 것입니다. K에서 a나 b를 수정하면 J에서도 같은 곳을 참조하니깐 같은 값이 나오게 됩니다. 메소드를 추가한다면, 그것도 같겟죠^^. 참조값만을 복사하는 거죠. 앞에서 공부할때, JAVA는 값 복사(Call by value)만 한다고 했는데라고 한다면.. 참조값 복사도 값복사입니다. 참조값! 그 값을 복사하니깐요...ㅎㅎ
#3
혹시 .. 참조값만 복사된다고 해서, 아무 클래스나 서로 할당을 하려고 하진않겟죠?
그렇다면.. 에러가 걸립니다.
#3
혹시 .. 참조값만 복사된다고 해서, 아무 클래스나 서로 할당을 하려고 하진않겟죠?
그렇다면.. 에러가 걸립니다.
Cstal C = new Cstal();
JSta J = C;
JSta J = C;
이렇게 한다면... 참조값만 복사되니깐 걍 복사될꺼같지만.. 에러가 걸립니다.
결국.. 참조변수도 타입이 있다는 겁니다.
결국.. 참조변수도 타입이 있다는 겁니다.
#4 point
클래스 변수 = 객체변수 = 참조변수
복사하려하면 메모리는 복사 되지 않고, 참조값만 복사된다.
(메모리까지 복사하려면 클론Clone 기법을 사용해야하는데..이건 뒤에서)
참조값만 가지고도 해당 객체를 핸들할수 있다.
-------------------------------------------------------------
자바 공부하는데, JAVA에는 타 클래스를 참조하기 위해 main에다가 include따위는 쓸 필요가 없는거 같네요.
그냥 같은 경로에 생성하려는 class만 있으면, 바로 생성이 되네요.
예를 들면,
stal/src/ 경로 안에
만든 클래스 Jstal.java,
출력하려는 main이 있는 Main.java,
가 있다면, Main.java에서 main안에 Jstal J = new JStal(); 이 부분을 추가하기전에 Jstal이라는 클래스를 포함한다고 말은 안해도 되네요. C에서는 (include "Jstal.java"이런식??^_^..)를 했었는데 말이죠.