
참조 타입
데이터 타입 분류
- 자바의 데이터 타입에는 크게 기본 타입과 참조 타입으로 분류된다.
- 기본 타입은 정수, 실수, 문자, 논리 리터럴을 저장
- 참조 타입은 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 의미
💡 참조 타입인 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리의 번지를 값으로 갖는다.
- 변수는 스택 영역에 생성되고 객체는 힙 영역에 생성된다.
힙(Heap) 영역
- 힙 영역은 객체와 배열이 생성되는 영역
- 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조
JVM 스택(Stack) 영역
- JVM 스택 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.
- 자바 프로그램에서 추가적으로 스레드를 추가하지 않았다면 존재하는 스레드는 main 스레드 한가지만 존재하게 된다.
null과 NullPointerException
- 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다.
- 참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나로 NullPointerException이 있다.
- NullPointerException이 발생하면, 예외가 발생된 곳에서 객체를 참조하지 않은 상태로 참조 타입 변수를 사용하고 있음을 알아야한다.
String
- 자바에서 문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다.
- 즉, String 변수에는 String 객체의 주소 값이 저장된다.
💡 동일한 String 객체이건 다른 String 객체이건 상관없이 문자열만을 비교할 때에는 String 객체의 equals() 메소드를 사용해야한다.
배열 타입
배열
- 배열은 같은 타입의 데이터만 저장할 수 있다. int 배열은 int 값만 저장 가능하고, String은 문자열만 저장 가능하다.
배열 선언
- 참조할 배열 객체가 없다면 배열 변수는 null 값으로 초기화될 수 있다.
- 배열 변수를 미리 선언한 후, 값 목록들이 나중에 결정되는 상황이라면 new 연산자를 사용해서 값 목록을 지정해주면 된다.
💡 타입 [] 변수 = new 타입[길이];
객체를 참조하는 배열
- 기본 타입(byte, char, short, int, long, float, double, boolean) 배열은 각 항목에 직접 값을 갖고 있지만, 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있다.
- String[] 배열은 각 항목에 문자열이 아니라, String 객체의 주소를 가지고 있다. 즉 String 객체를 참조하게 된다. → 따라서 String[] 배열의 항목도 결국 String 변수와 동일하게 취급되어야 한다. 문자열을 비교하기 위해서는 == 연산자 대신 equals() 메소드를 사용해야한다.
배열 복사
- 배열 간의 항목 값들을 복사하려면 for문을 사용하거나 System.arraycopy() 메소드를 사용하면 된다.
💡 System.arraycopy(Object src, int srcPos, Object dest, int desPos, int length);
→ src 매개값은 원본 배열이고, srcPos는 원본 배열에서 복사할 항목의 시작 인덱스
→ dest 매개값은 새 배열이고, destPos는 새 배열에서 붙여넣을 시작 인덱스이다.
→ length는 복사할 개수이다.
향상된 for문
for(타입 변수 : 배열){
}
- for문이 처음 실행될 때 배열에서 가져올 첫 번째 값이 존재하는지 평가한다.
- 가져올 값이 존재하면 해당 값을 변수에 저장한다.
- 실행문을 실행한다.
- 실행문이 모두 실행되면 다시 루프를 돌아 배열에서 가져올 값이 존재하는지 평가한다.
- 만약 다음 가져올 항목이 없으면 for문이 종료된다.
→ for문의 반복 횟수는 배열의 항목 수가 된다.