- 메소드(Method)
- Method 사용 Flow(흐름도)
- Activation Record (Activation Framework)
- method를 호출할 때 마다 JVM이 메모리에서 stack 영역에 생성하는 정보 (메소드에서 선언한 변수 전체 정보)
- Stack 영역을 call stack, execution stack, runtime stack, machine stack 등으로 부름
- Stack 의미 : LIFO(Last In First Out)
- 1) 나중에 입력된 것을 맨 처음으로 읽음(삭제)
- 2) Method내 선언된 변수들 중 마지막에 선언된 변수가 stack 상단에 위치
- JVM S/W 실행순서
- JVM SW가 메인 메모리에 올라감
- JVM이 실행할 class files들을 기계어로 번역 후 메모리에 올림
- CPU가 기계어로 된 응용 프로그램 1 line씩 실행
- JVM이 사용하는 메모리 영역 상세
- OS에서 할당 받은 메모리 영역(Runtime Data Area)을 세 영역으로 구분
- 참조 타입 객체 stack-heap 관계
- 변수의 메모리 사용
- 기본 타입 변수 - 실제 값을 변수 안에 저장
- 참조 타입 변수 - 주소를 통해 객체 참조
// 기본 타입 변수
int age =25;
double price = 100.5;
// 참조 타입 변수
String name = "신용권";
String hobby = "독서";
- Program Code, Stack, Heap 관계 예시
- JVM이 사용하는 메모리 영역
◎ 메소드 영역(Static 영역, 클래스 영역)
- 클래스(메소드와 코드)들이 Load되는 영역
- 클래스에 선언된 import 구문에 작성된 패키지의 클래스들이 Load되고 사용자가 작성한 클래스도 Load되고 강제로 클래스를 로드 가능
- 클래스는 Load 되면 프로그램이 종료될 때까지 소멸되지 않음
- 문자열 상수도 이 영역에 저장됨
◎ 자바 Stack
- method를 호출하면 method 수행에 필요한 것들을 저장하는 영역
- 가장 최근에 호출된 method의 프레임이 가장 위에 존재하고 이 프레임이 활성 Stack 프레임이라고
- method의 수행이 종료되면 자동적으로 소멸
◎ Heap
- new라는 예약어를 이용하여 동적으로 할당 받는 객체들의 영역
- Garbage Collection이 자율적으로 객체의 메모리 해제(삭제)를 관리
- 참조 변수의 ==, != 연산
◎ 변수의 값이 같은지 다른지 비교
- 기본 타입 : byte, char, short, int, long, float, double, boolean
- 의미 : 변수의 값이 같은지 다른지 조사
- 참조 타입 : 배열, 열거, 클래스, 인터페이스
- 의미 : 동일한 객체를 참조하는지 다른 객체를 참조하는지 조사
refVar1 == refVar2 // 결과 : false
refVar1 != refVar2 // 결과 : true
refVar2 == refVar3 // 결과 : true
refVar2 != refVar3 // 결과 : false
if(refVar2 == refVar3) {...}
- null과 NullPointerException
◎ null(널)
- 변수가 참조하는 객체가 없을 경우 초기값으로 사용 가능
- 참조 타입의 변수에만 저장 가능
- null로 초기화된 참조 변수는 스택 영역 생성
- ==, != 연산 가능
// 위 그림에서 reVar1은 힙 영역의 객체를 참조하므로 연산의 결가는 다음과 같다.
refVar1 == null // 결과 : false
refVar1 != null // 결과 : true
// refVar2는 null값을 가지므로 연산의 결과는 다음과 같다.
refVar2 == null // 결과 : true
refVar2 != null // 결과 : false
◎ NullPointerException의 의미
- 예외 (Exception)
- 사용자의 잘못된 조작이나 잘못된 코딩으로 인해 발생하는 프로그램 오류
- NullPointerException
- 참조 변수가 null 값을 가지고 있을 때
- 객체의 필드나 메소드를 사용하려고 했을 때 발생
int[] intArray = null;
intArray[0] = 10; // NullPointerException
String str = null;
System.out.println("총 문자수:" + str.length()); // NullPointerException
◎ String 타입
- 문자열을 저장하는 클래스 타입
- 문자열 리터럴 동일하다면 String 객체 공유
- new 연산자를 이용한 String 객체 생성
- - 힙 영역에 새로운 String 객체 생성
- - String 객체를 생성한 후 번지 리턴
String name1 = new String("신용권");
String name2 = new String("신용권");
오늘은 참조타입에서 메소드, Stack, heap, null과 NullPointerException, String 타입에 대해서 공부를 해보았습니다. 다음 시간에는 참조타입의 뒷 내용인 배열 타입과 열거 타입에 대해서 공부를 해보겠습니다.
반응형