중간고사 대비 java 5단원 정리

목차

혼자 공부하는 자바 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 필드를 통해 알 수 있다.

int arr[] = {1,2,3,4,5};
System.out.println(arr.length);

이때 length 필드는 읽기 전용이기 때문에 값을 변경할 수 없다.

3. 열거형 타입

열거 타입은 한정된 값인 열거 상수(enumeration constant)들 중 하나의 상수를 저장하는 타입이다. 예를 들어서 요일 데이터를 갖는 타입을 만들고 싶다면 다음과 같이 작성할 수 있다.

public enum Weekday {MON, TUE, WED, THU, FRI, SAT, SUN};

그리고 열거타입 변수는 다음과 같은 예시처럼 선언+초기화할 수 있다.

Weekday today = Weekday.MON;

그리고 열거 타입도 참조 타입이기 때문에 null로 초기화할 수 있으며 객체를 참조한다.

주의할 점은 열거 타입은 참조 타입이기 때문에 같은 열거 상수를 저장하는 변수는 같은 객체를 참조한다. 따라서 다음과 같은 코드는 true를 출력한다.

public enum Weekday {MON, TUE, WED, THU, FRI, SAT, SUN};
  public static void main(String[] args){
    Weekday today=Weekday.MON;
    System.out.println(today==Weekday.MON);
}