5. reference type
프로그램은 데이터를 처리하는 일을 함.
이러한 데이터를 잘 다루기 위해 데이터 타입(원시:primitive, 참조: reference)에 대해 제대로 된 이해가 필요
데이터 타입 분류
기본 타입 : 정수, 실수, 문자, 논리 리터럴을 저장하는 타입
(실제 값을 변수 안에 저장)
정수 : byte, char, short, int, long
실수 : float, double
논리 : boolean
참조 타입: 객체(Object)의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 등
(메모리의 번지로 값을 가짐, 번지를 통해 객체를 참조한다 → 참조 타입)
배열
열거
클래스
인터페이스
JAVA에서의 변수는 스택영역, 객체는 힙 영역에 생성됨
기본 타입 변수인 prive와 age는 값을 저장.
찹조 타입 변수인 name과 hobby에는 객체 주소값을 가지고 잇음. 주소를 통해 객체를 참조한다는 뜻에서 String 클래스 변수를 참조 타입 변수라고 함.
메모리 사용 영역
java.exe로 JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 다음과 같이 세부 영역으로 구분해서 사용함.

메서드(Method) 영역
클래스(
~.class
)들을 **클래스 로더(class loader)
**로 읽어 클래스별로 런타임 상수풀(runtime constant pool), 필드(field) 데이터, 메서드(method) 데이터, 메서드 코드, 생성자(constructor) 코드 등을 분류해서 저장함. 메서드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역.ClassLoader
JVM 구성요소 중 하나로 ‘.class’ 바이트 코드로 읽어들여 class 객체를 생성하는 역할
클래스가 요청될 때 class 파일로부터 바이트코드를 읽어 메모리로 로딩하는 역할
각 클래스들은 필요할 때 application에 올라감. 이 작업을 classLoader가 해줌
힙(Heap) 영역
힙 영역은 객체와 배열이 생성되는 영역.
참조하는 변수나 필드가 없다면 GC(Garbage Collector) 대상이 됨
JVM 스택(Stack) 영역
JVM 스택 영역은 각 스레드마다 하나씩 존재, 스레드가 시작될 때 할당됨
메서드를 호출할 때마다 프레임(Frame)을 추가(push), 종료되면 프레임을 제거(pop) 하는 동작을 수행함.
예외 발생 시 printStackTrace() 메서드로 보여주는 Stack Trace의 각 라인은 하나의 프레임을 표현함
참조 변수의 ==, != 연산
==과 != 연산
기본 타입 : 변수의 값이 같은지 아닌지를 조사
참조 타입 : 객체 주소값을 비교
null과 NullPointerException
참조 변수의 null : 힙 영역의 객체를 참조하지 않겠다 라는 뜻
이러한 null 값을 가지는 참조 변수를 사용하려 할 때 NPE 발생
(참조할 객체가 없으므로 사용할 수 없음)
String 타입
변수 선언
// #1
String 변수; //변수 선언
변수 = "문자열"; //문자열 리터럴 대입
// #2
String 변수 = "문자열"; // 변수 선언과 동시에 문자열 저장
자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있음.
// stack 영역에 name1과 name2 변수가 생성됨, 하지만 같은 heap 영역의 객체를 참조 String name1 = "남의영"; String name2 = "남의영";
new 연산자 사용시 서로 다른 객체를 참조함
String name1 = new String("남의영"); String name2 = new String("남의영");
배열 타입
배열이란 ?
같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 인덱스(index)를 부여해 놓은 자료구조
배열 선언
배열을 선언하는 기호로 사용되는 대괄호 [] 는 타입이나 변수 뒤에 붙을 수 있음.
타입[] 변수;
int[] intArr;
double[] doubleArr;
String[] strArr;
타입 변수[];
int intArr[];
double doubleArr[];
String strArr[];
값 목록으로 배열 생성
// 배열 변수를 이미 선언한 후에 다른 실행문에서 중괄호를 사용한 배열 생성은 허용되지 않음
타입[] 변수;
변수 = {v1, v2, v3 ...} // 컴파일 에러
// 배열 변수를 이미 선언한 후, 나중에 결정되는 상황이라면 -> new 연산자 사용
변수 = new 타입[] {v1, v2, v3...};
new 연산자로 배열 생성
타입[] 변수 = new 타입[길이];
타입[] 변수 = null;
변수 = new 타입[길이];
int[] intArr = new int[5];
배열 길이
배열변수.length
객체를 참조하는 배열
// 모든 배열의 요소들은 참조값을 갖게됨.
String[] strArr = new String[3];
strArr[0] = "java";
strArr[1] = "C++";
strArr[2] = "C#";
배열 복사
// 1. for 문 사용
// 2. System.arraycopy() 사용
열거타입
열거타입이란? 한정된 값만을 갖는 데이터 타입
열거 타입 이름(.java) 은 관례적으로 CamelCase, 열거 상수는 관례적으로 모두 대문자로 snake_case
열거타입도 참조타입으로
메서드 영역에 열거상수(가 힙영역의 객체를 참조하게 됨)’
힙 영역에 객체 저장.
Last updated