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 |
---|