참조타입 변수

2019. 12. 22. 16:57개인공부/자바

자바의 변수는 참조타입 변수와 기본타입 변수로 나눌 수 있다.

기본타입(primitive) 변수는 byte, char, short, int, long, float, double, boolean과 같은 타입의 변수가 해당되고,

참조타입 변수는 배열, 열거, 클래스, 인터페이스가 해당된다.

변수는 메모리의 스택 영역에 생성되는데 기본 타입변수는 직접 그 값을 저장하고 있다.
하지만 참조 타입변수는 힙영역에 생성된 객체의 주소를 참조한다.

여기서 변수명은 메모리 공간에 붙여진 이름이다. 그림으로 나타내면 다음과 같다.

 

+자바는 문자열이 리터럴이 동일하다면 같은 String 객체를 공유하도록 되어있다.

String Name=”내이름”;
String Name2=”
내이름”;
참조타입 변수를 ==로 비교하면 그 값은 true이다. 참조타입의 변수의 경우 ==연산시 같은 객체를 참조하는지 검사하기 때문이다.
Name==Name2; //true

 

그러나String Name=”내이름”;
String Name2=new String(“
내이름”); 의 경우,
new
연산자를 사용하여 새로운 String객체를 생성하고 그 주소 값을 Name2 스트링 참조변수가 참조하기 때문에
Name==Name2; //false
이다.
문자열만을 비교하고 싶은 경우 String객체의 equals() 메소드를 사용해야 한다.

 

 

추가사항1. 객체 자동 제거
더 이상 참조되지 않는 객체는 쓰레기 수집기(Gabage collector)에 의해 메모리에서 자동 제거된다.

ex)

String Name=new String(“바나나”);
Name=new String(“
딸기”); --> 바나나를 더 이상 참조하는 변수가 없는 경우 바나나 객체는 힙 영역에서 자동 제거.

 

 

추가사항2. 배열객체

ex)
String[] Students=new String[6]; //
길이6의 배열을 생성하고, 그 배열에는 각각 String객체가 참조
Students[0]=new String(“
학생1”);//배열의 인덱스 0번에 학생1이라는 스트링 객체를 참조.
그림으로 나타내면 다음과 같다.

 

첫 줄의 코드 String[] Students=new String[6];는 배열 객체를 생성하는 것 뿐이다.

아직 String 객체는 생성되지 않았다.

따라서 아직 참조되지 않은 인덱스 1에 접근하면 NullPointerException이 발생하고(중요!),

 

기본타입 배열의 경우는 객체의 주소 값이 아닌 실제 값이 들어가므로 인덱스가 초과된 경우
ArrayIndexOutOfBoudsException
이 발생한다.

 

 

추가사항3. 배열 복사
배열은 한 번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야 한다. 이때 for문을 사용하거나 System.arrayCopy()를 이용한다.

ex)
int[] oldArray={1,2,3};
int[] newArray=new int[5];
for(int i=0; i<newArray.length; i++){
           newArray[i]=oldArray[i];
}

이를 shallowCopy(얕은 복사)라고 하며,

 

참조하는 객체를 별도로 생성해서 복사하는 것은 deepCopy(깊은 복사)라고한다.

 

추가사항4. 열거타입

아래와 같이 선언할 수 있음.

public enum Week{

     MONDAY,

     TUESDAY,

     WEDNESDAY,

     THURSDAY,

     FRIDAY,

     SATURDAY,

     SUNDAY

 }

열거타입은
Week today = Week.MONDAY;
로 객체의 참조값을 받을 수 있음. 여기서 Week.MONDAY는 열거상수이고 메소드 영역에 선언되어 있는 Week클래스의 값임. 힙 영역에 있는 열거객체의 참조값에 해당하고, 열거 변수 today에 해당 값을 할당함. 그림으로 나타내면 다음과 같음.

 

 

'개인공부 > 자바' 카테고리의 다른 글

클래스 static, 접근제한자 private  (1) 2019.12.22