JVM이 할당받은 메모리 영역을 세 영역으로 구분
JVM 시작할 때 생성되는 영역으로 로딩된 클래스 바이트 코드를 분석 후에 저장함
런타임 상수풀, 필드/메소드 데이터, 메소드 코드, 생성자 코드 등이 저장됨
모든 스레드가 공유
JVM 시작할 때 생성되며, 객체/배열을 저장
사용되지 않는 객체는 GC(Garbage Collector)가 자동 제거
스레드 별로 생성되어 메소드를 호출할 때마다 frame을 스택에 추가(push)
메소드가 종료되면 frame을 스택에서 제거(pop)
1) java MemoryExample
명령어를 통해 MemoryExample 실행
2) JVM 구동되며 Runtime Data Area에 Method Area, Heap Area 생성
3) Method 영역에 MemoryExample 클래스를 로딩
4) main 스레스를 생성하며, main thread에 대한 JVM Stack 생성
5) main() 메소드 호출시, main frame 생성해 JVM stack에 push
5) main에서 사용되는 배열/객체들을 Heap 영역에 저장 후, main 프레임에 배열 주소 저장
main에서 사용되는 변수들은 frame에 직접 저장
6) main() 안에서 a() 메소드 호출 시, a frame 생성해 JVM stack에 push
7) a() 메소드 종료 시, JVM stack에서 a frame pop
8) main() 메소드 종료 시, JVM stack에서 main frame Pop
9) JVM 종료
변수의 값이 같은지 다른지를 조사함
예) v1:10, v2:100, v3:100일 떄
v1 == v2 : false
v1 != v2 : true
v2 == v3 : true
v2 != v3 : false
동일한 객체를 참조하는지 다른 객체를 참조하는지를 조사
예: refVar1 : 100번지, refVar2 : 200번지, refVar3 : 200번지
refVar1 == refVar2 : false
refVar1 != revVar2 : true
refVar2 == refVar3 : true
refVar2 != refVar3 : false
변수가 참조하는 객체가 없을 경우 초기값으로 사용 가능하며 참조 타입의 변수에만 저장 가능함
null로 초기화된 참조 변수는 stack 영역에 생성됨
==, != 연산이 가능해짐
Exception 은 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류로, NullPointerException은 참조 변수가 null 값을 가지고 있는 상태에서 해당 객체의 필드나 메소드를 사용하려 한 경우 발생함
int[] intArray = null;
intArray[0] = 10; //NullPointerException
String str = null;
System.out.println("총 문자수 : " + str.length()); //NullPointerException
문자열을 저장하는 클래스 타입으로 참조 타입 임
즉, Heap영역에 String 객체를 저장한 후 Stack 영역에 주소값 저장됨
문자 리터럴이 동일한 경우에는 String 객체를 공유하게 됨
Heap 영역에 새로운 String 객체를 생성한 후 주소를 반환하기 때문에 기존에 동일한 문자 리터럴이 저장되어 있어도 다른 객체로 생성됨
동일한 객체가 아닌 동일한 문자열 인지 확인하기 위해서는 equals()
를 통해 비교해야함
String name1 = "신용권";
String name2 = "신용권";
String name3 = new String("신용권");
name1 == name2; //true
name1 == name3; //false
name1.equals(name3); //true
byte, char, short, int, long, float, double, boolean 배열
각 항목에 직접 값을 저장하는 배열임
각 항목에 객체의 주소값을 저장하는 배열
배열 생성 이후에는 크기 변경 불가능하기 때문에 확장을 위해서는 더 큰 배열을 생성한 후 항목값들 복사 필요
int[] old = {1,2,3};
int[] new = new int[5];
for(int i = 0 ; i < old.length ; i++){
new[i] = old[i];
}
System.arraycopy(Objecr src, int srcPos, Object dest, int destPos, int length);
String[] old = {"java", "array", "copy"};
String[] new = new String[5];
System.arraycopy(old, 0, new, 0, old.length);
참조 타입의 배열 복사의 경우, 각 항목을 새로 생성해서 저장하는 것이 아니라 주소값을 복사해옴
== 얉은 복사
한정된 값만 가지는 데이터 타입으로 열거 상수로 정의함
예 : 요일 / 계절 / 로그인 성공 여부(실패, 성공)
1) 소스 파일 생성 (~.java)
2) 파일 이름과 동일한 이름으로 선언
public enum 열거타입이름 {...}
3) 한정된 값인 열거 상수 정의
public enum Week {MON, TUE, WED, THU, FRI, SAT, SUN}
public enum LoginResult {LOGIN_SUCCESS, LOGIN_FAIL}
열거 상수 정의 관례
모두 대문자로 작성 및 결합된 이름인 경우 _ 로 연결
열거타입 변수
열거 타입 변수값은 열거 상수 중 하나이어야 함
열거타입 변수 = 열거타입.열거상수
열거 타입 변수는 참조 타입이므로 null값을 저장할 수 있음
열거 객체는 Heap에 생성되어, 열거 상수는 method 영역에서 열거 객체를 참조하게 됨
Week today = Week.SUNDAY;
today == Week.SUNDAY; //true
Week week1 = Week.SATURDAY;
Week week2 = Week.SATURDAY;
System.out.println(week1 == week2); //true
열거 객체는 열거 상수의 문자열을 내부 데이터로 가짐
열거 타입은 컴파일 시에 java.lang.Enum 클래스를 자동 상속
리턴 타입 | 메소드(매개변수) | 설명 |
---|---|---|
String | name() | 열거 객체의 문자열 리턴 |
int | ordinal() | 열거 객체의 순번(시작:0) 리턴 |
int | compareTo() | 열거 객체 비교하여 순번 차이 리턴 |
열거타입 | valueOf(String name) | 주어진 문자열의 열거 객체 리턴 |
열거배열 | values() | 모든 열거 객체들을 배열로 리턴 |