Practice JAVA - 참조 타입, 변수

최정환·2022년 12월 8일
0

Practice JAVA

목록 보기
4/10
post-thumbnail

기본 타입(primitive type), 참조 타입(reference type)

자바의 타입은 기본과 참조로 나뉜다.

기본

정수 타입(byte, char, short, int, long)
실수 타입(float, double)
논리 타입(boolean)

참조

배열 타입
열거 타입
클래스
인터페이스


기본 타입 변수

int age = 25;
double price = 100.5;

기본 타입 변수인 int, double은 메모리 주소를 가지고 값을 가지게 된다.

참조 타입 변수

String name = "Choi";
String hobby = "Game";

참조 타입 변수인 String의 경우 주소를 할당 받고 Heap 영역에 존재하는 String 객체의 주소를 참조한다.

위 사진과 같이 같은 참조 타입의 값을 가진 변수는 같은 메모리 주소를 가지고 있다.


JVM의 메모리 영역을 보면 Heap, Method, JVM stack이 있다.

Method Area

JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.

메소드 영역에는 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 정적 필드, 상수, 메소드 코드, 생성자 코드 등을 분류해서 저장한다.

Heap

객체와 배열이 생성되는 영역이다.

여기에 생성된 객체와 배열은 JVM stack 영역의 변수나 다른 객체의 필드에서 참조한다.
만약 참조하는 변수나 필드가 없다면 Garbage Colletor를 실행시켜 자동으로 제거한다.

JVM stack

JVM stack은 메소드를 호출할 때마다 프레임을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.

프레임임 내부에는 로컬 변수 스택이 있는데 기본, 참조 타입 변수가 추가되거나 제거된다.

char v1 = 'A';

if(v1=='A'){
	int v2 = 100;
    double v3 = 3.14;
}

boolean v4 = true

위의 예는 기본 타입만을 사용했기 때문에 stack에 값을 가지고 쌓인다.
만약 참조 타입이라면 변수와 힙에 있는 값의 주소값을 가지고 쌓인다.

stack 영역 과정

  1. v1 이 push
  2. v2, v3가 push
  3. v2, v3가 pop되고 v4 push
  4. v1, v4가 남음


참조 변수의 비교 연산

기본 타입의 경우 ==는 값이 같은지 보는 연산이지만 참조 타입의 경우 주소 값을 비교하는 연산자로 사용된다.

String name = "Choi";
String myName = "Choi";
String myName2 = new String("Choi");

name == myName // true
name == myName2 // false

일반적으로 문자열을 저장할 경우 String을 사용하지만 new 연산자를 사용해 객체를 생성시킬 수 있다.
이런 경우 원래는 같은 문자열을 사용할 경우 변수는 힙 영역의 같은 주소를 가지고 있지만 만약 연산자로 객체를 생성한다면 힙 영역에 다른 String 객체가 생성된다.

따라서 같은 문자열 값을 가지고 있는 변수라도 주소가 다르기 때문에 서로 다른 결과가 나오는 것이다.

String을 비교할때는 equals 메소드를 사용하는 것이 좋다.

NullPointerException

참조 변수가 null을 가지고 있을 경우 참조 객체가 없기 때문에 참조 변수를 통해 객체를 사용할 수 없습니다.

만약 null인 참조 변수를 통해 있지도 않은 객체의 필드나 메소드를 사용하면 발생하는 에러가 NullPointerException이다.

Kotlin이 Java와 비교하면서 가장 많이 드는 부분이 NullPointerException이다.

Java의 경우 사용하는 데이터가 null인 경우 Error를 뱉지만 Kotlin은 null safe를 지원한다.

0개의 댓글