Java - 참조 타입
참조 타입과 참조 변수
기본 타입과 참조 타입
- 참조 타입인 배열, 열거, 클래스, 인터페이스 변수는 메모리의 번지를 변수안에 저장한다.
- 번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라고 부른다.
메모리 사용 영역
JVM(Java Virtual Machine): 자바로 개발한 프로그램을 컴파일하여 만들어지는 바이트 코드를 실행시키기 위한 가상 머신(소프트웨어)
메소드 영역
- JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
- 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 정적 필드와 상수, 메소드 코드, 생성자 코드 등을 분류해서 저장
힙 영역
- 객체와 배열이 생성되는 영역
- 여기서 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
- 만일 참조하는 변수나 필드가 없다면 의미 없는 객체가 되므로 JVM이 쓰레기 수집기(Garbage Collector)를 실행시켜 자동으로 제거한다.
JVM 스택 영역
- JVM 스택은 메소드를 호출할 때 마다 프레임을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.
참조 변수의 ==, != 연산
- 참조 타입 변수들 간의 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다.
- 참조 타입 변수의 값은 힙 영역의 객체 주소이므로 결국 번지 값을 비교하는 것
null과 NullPointerException
- 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다.
- null 값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.
- 예외(Exception): 자바에서 프로그램 실행 도중에 발생하는 오류
- NullPointerException: 참조 타입 변수가 null 상태에서 존재하지 않는 객체의 데이터나 메소드 사용할 경우 발생. 해당 참조 변수가 객체를 참조하도록 수정하여 해결한다.
String 타입
- String 변수에 문자열 리터럴을 대입할 경우, 문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다.
- 문자열 리터럴이 동일한 경우 같은 String 객체를 공유
- new 연산자: 힙 영역에 새로운 객체를 만들 때 사용하며, 객체 생성 연산자라고 한다.
문자열 리터럴과 new 연산자로 생성된 객체 비교
String name1 = "이름";
String name2 = "이름";
String name3 = new String("이름");
name1 == name2 의 결과는 true,
name1 == name3 의 결과는 false
동일한 String 객체이건 다른 String 객체이건 상관없이 내부 문자열을 비교하고 싶다면 equals() 메소드를 사용한다.
boolean result = str1.equals(str2);
배열
배열이란?
- 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스(index)를 부여해놓은 자료구조
- 같은 타입의 데이터만 저장할 수 있으며, 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다.
배열 선언
- 배열을 사용하기 위해서는 우선 배열 변수를 선언해야 한다.
형식 1 : 타입[ ] 변수;
형식 2 : 타입 변수[ ];
int[] intArray;
double[] doubleArray;
String[] strArray;
int intArray[];
double dlubleArray[];
String[] strArray;
참조할 배열 객체가 없다면 배열 변수는 null 값으로 초기화
배열 생성
값 목록으로 배열 생성
타입[ ] 변수 = { 값0, 값1, 값2, 값3, ··· };
이미 생성된 배열에서 한 가지 값을 변경하고 싶은 경우에는 아래와 같이 수정한다.
String[] names = { "둘리", "마이콜", "또치"};
names[1] = "고길동";
new 연산자로 배열 생성
- 값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶은 경우
타입[ ] 변수 = new 타입[길이];
슬슬 머리가 아파진다.
그래도 할 수 있다!