5. reference type

프로그램은 데이터를 처리하는 일을 함.

이러한 데이터를 잘 다루기 위해 데이터 타입(원시:primitive, 참조: reference)에 대해 제대로 된 이해가 필요

데이터 타입 분류

  • 기본 타입 : 정수, 실수, 문자, 논리 리터럴을 저장하는 타입

    (실제 값을 변수 안에 저장)

    • 정수 : byte, char, short, int, long

    • 실수 : float, double

    • 논리 : boolean

  • 참조 타입: 객체(Object)의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 등

    (메모리의 번지로 값을 가짐, 번지를 통해 객체를 참조한다 → 참조 타입)

    • 배열

    • 열거

    • 클래스

    • 인터페이스

  • JAVA에서의 변수는 스택영역, 객체는 힙 영역에 생성됨

    • 기본 타입 변수인 prive와 age는 값을 저장.

    • 찹조 타입 변수인 name과 hobby에는 객체 주소값을 가지고 잇음. 주소를 통해 객체를 참조한다는 뜻에서 String 클래스 변수를 참조 타입 변수라고 함.

메모리 사용 영역

  • java.exe로 JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 다음과 같이 세부 영역으로 구분해서 사용함.

  1. 메서드(Method) 영역

    • 클래스(~.class)들을 **클래스 로더(class loader)**로 읽어 클래스별로 런타임 상수풀(runtime constant pool), 필드(field) 데이터, 메서드(method) 데이터, 메서드 코드, 생성자(constructor) 코드 등을 분류해서 저장함. 메서드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역.

      • ClassLoader

        • JVM 구성요소 중 하나로 ‘.class’ 바이트 코드로 읽어들여 class 객체를 생성하는 역할

        • 클래스가 요청될 때 class 파일로부터 바이트코드를 읽어 메모리로 로딩하는 역할

        • 각 클래스들은 필요할 때 application에 올라감. 이 작업을 classLoader가 해줌

  2. 힙(Heap) 영역

    • 힙 영역은 객체와 배열이 생성되는 영역.

    • 참조하는 변수나 필드가 없다면 GC(Garbage Collector) 대상이 됨

  3. JVM 스택(Stack) 영역

    • JVM 스택 영역은 각 스레드마다 하나씩 존재, 스레드가 시작될 때 할당됨

    • 메서드를 호출할 때마다 프레임(Frame)을 추가(push), 종료되면 프레임을 제거(pop) 하는 동작을 수행함.

    • 예외 발생 시 printStackTrace() 메서드로 보여주는 Stack Trace의 각 라인은 하나의 프레임을 표현함

    • 기본 타입 변수는 직접 값을 갖고 있지만, 찹조 타입 변수는 힙이나 메서드 영역의 객체 주소를 가짐

      • #1 ~ #3

      • #4

참조 변수의 ==, != 연산

==과 != 연산

  • 기본 타입 : 변수의 값이 같은지 아닌지를 조사

  • 참조 타입 : 객체 주소값을 비교

null과 NullPointerException

  • 참조 변수의 null : 힙 영역의 객체를 참조하지 않겠다 라는 뜻

  • 이러한 null 값을 가지는 참조 변수를 사용하려 할 때 NPE 발생

    (참조할 객체가 없으므로 사용할 수 없음)

String 타입

  • 변수 선언

  • 자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있음.

  • new 연산자 사용시 서로 다른 객체를 참조함

배열 타입

배열이란 ?

같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 인덱스(index)를 부여해 놓은 자료구조

배열 선언

  • 배열을 선언하는 기호로 사용되는 대괄호 [] 는 타입이나 변수 뒤에 붙을 수 있음.

  1. 타입[] 변수;

  1. 타입 변수[];

  1. 값 목록으로 배열 생성

  1. new 연산자로 배열 생성

  1. 배열 길이

  1. 객체를 참조하는 배열

  1. 배열 복사

열거타입

  • 열거타입이란? 한정된 값만을 갖는 데이터 타입

  • 열거 타입 이름(.java) 은 관례적으로 CamelCase, 열거 상수는 관례적으로 모두 대문자로 snake_case

  • 열거타입도 참조타입으로

    • 메서드 영역에 열거상수(가 힙영역의 객체를 참조하게 됨)’

    • 힙 영역에 객체 저장.

Last updated