중간고사 대비 java 5단원 정리
- language
혼자 공부하는 자바 5단원, 참조 타입 내용 정리이다.
1. 참조 타입
자바의 기본 타입은 byte, char, short, int, long, float, double, boolean이 있다. 하지만 이 타입의 변수만 있는 게 아니다. 앞서 다루었던 String도 기본 타입이 아니었다. 이런 타입을 참조 타입이라고 한다.
기본 타입과의 가장 큰 차이점은 저장되는 값이다. 기본 타입의 변수들에는 실제 값이 저장된다. 하지만 참조 타입 변수들에는 메모리의 번지수, 즉 주소가 저장된다. 예를 들어 String타입의 경우 문자열 객체가 힙 영역에 저장되고 그 객체의 주소값이 String 타입 변수에 저장된다.
1.1 참조 변수의 비교
참조 타입의 변수들은 주소값을 저장하고 있다. 그렇기 때문에 참조 변수들끼리의 비교는 주소값을 비교하는 것이다. 즉 동일한 객체를 참조하고 있는지만 확인한다. 그래서 참조 변수들끼리의 비교는 == 연산자로 비교할 수 없다. == 연산자는 기본 타입의 변수들끼리의 비교에만 사용할 수 있다.
참조 타입 변수들의 비교에는 따로 메소드를 구현하거나 문자열의 equals()
메소드처럼 기본적으로 구현된 메소드를 사용해야 한다.
1.2 null
참조 타입 변수는 null 값을 가질 수 있는데 이는 힙 영역 객체를 참조하지 않는다는 뜻이다. null로 초기화된 참조 변수의 값은 스택 영역에 저장된다. 따라서 ==, !=
연산자로 비교할 수 있다.
그리고 null 값을 가지고 있는 참조 타입 변수를 사용하게 되면 NullPointerException이 발생한다. 이는 참조 변수가 참조하는 객체가 없기 때문에 발생하는 예외이다.
1.3 문자열 참조 변수
문자열은 참조 타입이다. 이 타입의 특성은 다음과 같다.
- 문자열 리터럴이 동일하면 같은 문자열 객체를 참조한다.
- new를 사용해서 아예 새로운 객체를 만들 수도 있다. 이 경우 같은 내용이라도 다른 객체를 참조하게 되므로 비교에
equals()
메소드를 사용해야 한다. - 참조 타입 변수이므로 null을 대입할 수 있다. 이 경우 참조를 잃은 객체는 가비지 컬렉터에 의해 제거된다.
2. 배열
배열은 같은 타입 데이터를 연속된 공간에 저장하는 자료구조이다.
2.1 배열의 선언
배열 변수 선언은 다음과 같은 2가지 방식으로 작성해야 한다.
즉 int[] arr;
와 int arr[];
2가지 방식으로 작성할 수 있다.
배열도 참조 타입 변수이므로 null로 초기화할 수 있다. 그리고 값의 목록을 통해 다음과 같이 배열을 생성할 수 있다.
int arr[] = {1, 2, 3};
혹은 new를 이용해 다음과 같이 할 수 있다.
int arr[] = new int[3];
이 경우 배열의 각 요소는 기본값으로 초기화된다. 기본 타입의 경우 0(boolean은 false), 참조 타입의 경우 null이다. 예를 들어 new int[3]
의 경우 0, 0, 0으로 초기화된다.
2.2 배열 길이
배열의 길이는 length
필드를 통해 알 수 있다.
이때 length 필드는 읽기 전용이기 때문에 값을 변경할 수 없다.
3. 열거형 타입
열거 타입은 한정된 값인 열거 상수(enumeration constant)들 중 하나의 상수를 저장하는 타입이다. 예를 들어서 요일 데이터를 갖는 타입을 만들고 싶다면 다음과 같이 작성할 수 있다.
그리고 열거타입 변수는 다음과 같은 예시처럼 선언+초기화할 수 있다.
그리고 열거 타입도 참조 타입이기 때문에 null로 초기화할 수 있으며 객체를 참조한다.
주의할 점은 열거 타입은 참조 타입이기 때문에 같은 열거 상수를 저장하는 변수는 같은 객체를 참조한다. 따라서 다음과 같은 코드는 true
를 출력한다.