ㅇ참조 타입 이해하기
ㅇ메모리 영역의 세부 영역과 기능 알기
ㅇ참조 변수의 ==, != 연산과 NullPointerException 알기
ㅇString타입, 배열 타입, 열거 타입 선언 학습하기
자바의 타입 -기본타입(primitive type), -참조타입
ㅇ참조타입
ㄴ객체의 번지를 참조하는 타입
ㄴ배열, 열거, 클래스, 인터페이스
아 저번에 어레이리스트 불러온거 생각나는데! 배열이라는게 참조타입으로 타입이었지!!
ㄴ기본타입 변수는 실제 값을 직접 저장하지만, 참조타입 변수는 메모리의 번지를 저장한다
우선!
JVM이 사용하는 '메모리 영역(Runtime Data Area)' 알아보기
JVM은 운영체제에서 할당받은 메모리 영역을 다음과 같이 세부 영역으로 구분해 사용한다.
Runtime Data Area
ㄴMethod Area
ㄴHeap Area
ㄴStack
메모리 영역 (Runtime Data Area) | ||
메소드 영역 (Method Area) | 힙 영역 (Heap Area) | JVM 스택 (Stack) |
사용되는 클래스를 읽어서 클래스별로 정리하고, 분류해서 저장 ㅇ클래스-1 ㄴ정적 필드 (static field) ㄴ상수 (constant) ㄴ메소드 코드 ㄴ생성자 (constructor) . . . ㅇ클래스-n ㄴ정적 필드 (static field) ㄴ상수 (constant) ㄴ메소드 코드 ㄴ생성자 (constructor) |
객체와 배열이 생성되는 영역 변수or필드가 여기에 생성된 객체를 참조할 수 있다. 만약 참조하는 변수or필드가 없으면 의미없는 객체이다. JVM이 쓰레기로 취급하고 Garbage Collector을 실행시켜 자동 제거 >>개발자는 객체를 별도로 제거하지 않아도 된다. |
메소드 호출 관련 ㄴ메소드를 호출할 때마다 프레임을 추가 (Frame push) ㄴ메소드가 종료되면 해당 프레임을 제거 (pop) 프레임 내부에는 로컬 변수 스택 있음. 최초로 변수에 값이 저장될 때 (=초기화가 될 때) 스택 영역에 변수가 생성됨. (기본, 참조 모두 해당) ㄴ기본: 스택 영역에 직접 값 가짐 ㄴ참조: 스택 영역에 힙 영역의 객체 주소를 가짐. ->힙 영역에 값이 생성된다는 것임. 변수는 블록 안에서만 스택에 존재함. (push/pop) ---------------------------------- 프레임 push, pop (메소드 호출 관련) 변수 push, pop (블록 내) |
이상 JVM이 메모리를 세부 영역으로 구분하는 것을 봄
<참조 변수의 ==, != 연산>
기본타입의 ==, != : 변수의 값이 같은지 아닌지 조사
참조타입의 ==, != : 참조하는 객체가 같은지 ====>> 번지값 비교
참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있다.
(++null도 초기값으로 사용 가능!! null로 초기화된 참조 변수는 스택 영역에 생성이 된다!)
예외(Exception): 자바에서 프로그램 실행 중 발생하는 오류.
ㄴ참조 변수 사용하면서 가장 많이 발생하는 Exception은 NullPointerException이다
참조 타입 변수를 잘못 사용하면 발생.
ㄴ예를들어서 참조 변수가 null을 가지는데, null상태에서 있지도 않은 객체의 데이터(필드)나 메소드를 사용하는 코드를 실행하면 NullPointerException 발생
>>(cf. 배열 변수이므로 참조 변수)
int[] intArray = null;
intArray[0] = 10; <<<<-------------NullPointerException
>>(cf. String은 클래스이므로 참조 변수)
String str = null;
System.out.println("총 문자수: " + str.length()); <-----NullPointerException
해결 방법: 참조 변수를 추적해서 객체를 참조하도록 수정한다.
<String>
++String변수에 저장한다는 말은 엄밀히 말하면 틀림 :
문자열이 String객체로 생성되고, 변수는 String객체를 참조하는 것이다.
변수에는 String객체의 '번지 값'이 저장된다.
(하지만 일반적으로 String변수에 저장한다고 말한다.)
String객체의 두 가지 생성 방법
1. 문자열 리터럴을 사용 (String str = "~";)
ㄴ리터럴이 동일하면 String객체를 공유한다. 문자열이 동일하면 동일한 String객체를 참조한다.
ㄴ힙 영역에 그 문자열 String객체가 하나.
2. new연산자를 통해 생성
(String name1 = new String("성시경"); String name2 = new String("성시경");
ㄴ이 때에는 name1과 name2가 서로 다른 String객체를 참조한다. new로 생성하면 그렇다.
ㄴ힙 영역에 그 문자열 String객체가 각각 있음.
>>문자열이 동일한지 확인하고 싶으면 뭐든간에 String객체의 .equals() 메소드를 사용해야 한다.
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 7/04 05-2 배열2 (0) | 2020.07.04 |
---|---|
[혼자 공부하는 자바] 7/03 05-2 배열 (0) | 2020.07.03 |
[혼자 공부하는 자바] 7/02 04 조건문과 반복문 (0) | 2020.06.30 |
[혼자 공부하는 자바] 6/30 02-4~03-2 (0) | 2020.06.30 |
[혼자 공부하는 자바] 6/28 02-4 변수와 시스템 입출력 (0) | 2020.06.28 |