자바의 데이터 타입
1. 기본타입(primitive type) : 정수(byte, char, short, int, long), 실수(float, double), 논리(boolean)
2. 참조타입(reference type) : 배열, 열거, 클래스, 인터페이스 >> 객체의 번지를 참조하는 타입
두 타입의 차이점 : 저장되는 값
기본타입은 실제 값을 변수 안에 저장
참조타입을 이용해 선언된 변수는 메모리의 번지를 값으로 갖는다.(번지를 통해 객체를 참조)
변수는 스택영역에 생성되고, 객체는 힙 영역에 생성되는데,
예를 들어 이렇게 네 개의 변수가 선언되었다고 한다면,
int age = 40;
double price = 100.0;
String name = "홍길동"
String hobby = "Game"
age와 price 변수는 실제 값인 40과 100.0을 가진다.
반면에 name과 hobby는 실제 값이 힙 영역에 저장된다.
(홍길동의 주소값이 100, Game의 주소값이 200 이라고 한다면) name과 hobby에 저장된 값은 100과 200이다.
메모리 사용 영역
JVM(JAVA Virtual Machine)은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)를 다음과 같이 나누어서 사용한다.
1. 메소드(method) 영역
: 코드에서 사용되는 클래스(~.class)들을 읽어 클래스별로 런타임 상수풀, 필드(field)데이터, 메소드 데이터, 메서도 코드, 생성자 코드 등을 분류해서 저장한다.
: JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
2. 힙(Heap)영역
: 객체와 배열이 생성되는 영역
: 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조함
: 참조하는 변수나 필드가 없다면 의미없는 객체가 되므로 Garbage Collector를 실행시켜 자동으로 제거함
: 객체를 제거하기 위해 별도의 코드를 작성할 필요 x
3. JVM 스택(Stack)영역
: 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당됨
: 자바 프로그램에서 추가적으로 스레드를 생성하지 않았다면, main 스레드만 존재하므로 JVM스택도 하나
: 메소드를 호출할 때마다 프레임을 추가(push)하고, 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행
기본타입 변수는 스택에 직접 값을 가지고 있지만,
참조타입 변수는 값이 아니라 힙 영역이나 메소드 영역의 객체주소를 가진다.
int[] score = {10,20,30} 이라고 할 때,
배열 변수 score는 스택영역에 생성되지만, 실제 10, 20, 30 을 갖는 배열 자체는 힙 영역에 생성됨
참조 변수의 ==. != 연산
참조 타입 변수들 간의 ==, != 연산은 결국 주소 값을 비교하는 것
값이 동일한지 비교하려면 변수1.equals(변수2) 을 사용해야한다.
null
null로 초기화된 참조변수는 스택 영역에 생성됨
=> 참조타입 변수가 null값을 가지는지 확인하려면 ==, !=연산을 수행하면 됨
String
String name;
name = "홍길동";
String hobby = "Game";
위와 같이 name, hobby 변수를 선언하고 각각 "홍길동"과 "Game" 입력했다.
이때 name, hobby 변수는 스택영역에 생성되고, "홍길동"과 "Game"은 힙 영역에 String 객체로 생성된다.
name, hobby에는 String 객체의 주소 값이 저장됨
자바는 문자열 리터럴이 동일하다면 String 객체를 공유함(같은 주소를 사용함)
String name1 = "홍길동";
String name2 = "홍길동";
name1 == name2;
이 때 같은 주소값을 가지고 주소값을 비교하므로 name1 == name2 의 결과는 true이다.
일반적으로 변수에 문자열을 저자할 때는 위와같이 문자열 리터럴을 사용하지만,
new 연산자를 사용해서 직접 String 객체를 생성시킬 수도 있다.
String name1 = new String("홍길동");
String name2 = new String("홍길동");
name1 == name2;
이 경우 name1과 name2는 서로 다른 String 객체를 참조하므로 name1 == name2 의 결과는 false이다.
'STUDY > JAVA' 카테고리의 다른 글
JAVA - 다차원 배열 (0) | 2022.04.13 |
---|---|
JAVA - 배열 1 (0) | 2022.04.13 |
JAVA 연산자 (0) | 2022.04.11 |
이클립스 블랙모드 설정하기 (0) | 2022.03.29 |
eclipse 삭제 및 재설치하기 (+ Preferences설정하기) (0) | 2022.03.28 |