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
          char v1 = 'A';
      
          // #2
          if (v1 == 'A') {
              int v2 = 100;
              double v3 = 3.14;
          }
      
          // #3
          boolean v4 = true;
          
          // #4 , 자바에서는 배열을 객체로 취급
          int[] scores = {10, 20, 30};
      • #1 ~ #3

      • #4

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

==과 != 연산

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

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

null과 NullPointerException

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

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

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

String 타입

  • 변수 선언

// #1
String 변수; //변수 선언
변수 = "문자열"; //문자열 리터럴 대입

// #2
String 변수 = "문자열"; // 변수 선언과 동시에 문자열 저장
  • 자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있음.

    // stack 영역에 name1과 name2 변수가 생성됨, 하지만 같은 heap 영역의 객체를 참조
    String name1 = "남의영";
    String name2 = "남의영";
  • new 연산자 사용시 서로 다른 객체를 참조함

    String name1 = new String("남의영");
    String name2 = new String("남의영");

배열 타입

배열이란 ?

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

배열 선언

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

  1. 타입[] 변수;

int[] intArr;
double[] doubleArr;
String[] strArr;
  1. 타입 변수[];

int intArr[];
double doubleArr[];
String strArr[];
  1. 값 목록으로 배열 생성

// 배열 변수를 이미 선언한 후에 다른 실행문에서 중괄호를 사용한 배열 생성은 허용되지 않음	
타입[] 변수;
변수 = {v1, v2, v3 ...} // 컴파일 에러

// 배열 변수를 이미 선언한 후, 나중에 결정되는 상황이라면 -> new 연산자 사용
변수 = new 타입[] {v1, v2, v3...};
  1. new 연산자로 배열 생성

타입[] 변수 = new 타입[길이];

타입[] 변수 = null;
변수 = new 타입[길이];

int[] intArr = new int[5];
  1. 배열 길이

배열변수.length
  1. 객체를 참조하는 배열

// 모든 배열의 요소들은 참조값을 갖게됨.
String[] strArr = new String[3];
strArr[0] = "java";
strArr[1] = "C++";
strArr[2] = "C#";
  1. 배열 복사

// 1. for 문 사용
// 2. System.arraycopy() 사용

열거타입

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

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

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

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

    • 힙 영역에 객체 저장.

Last updated