Home > Java > 참조형(Reference Data Type)

참조형(Reference Data Type)
java

데이터 타입 또는 자료형은 컴퓨터 과학과 프로그래밍 언어에서 실수치, 정수, 불린 자료형 따위의 여러 종류의 데이터를 식별하는 분류이다. (feat. 위키백과)

참조형의 메모리 저장 방식

  • 참조형은 Stack 영역에 실제 값이 저장된 공간의 주소를 저장하고, Heap 영역에 실제 값을 저장한다.
  • ex)

참조형 종류 (기본형 제외 나머지)

  • 대표적인 참조형을 살펴보겠다.
타입 설명
배열 동일한 타입의 데이터를 고정된 크기의 연속된 메모리 공간에 저장하는 자료구조
ArrayList (Collection) 크기가 동적으로 변하는 배열 기반의 자료구조
String 문자열을 다루는 클래스
Wrapper 클래스 기본형을 객체로 감싸서 다룰 수 있게 하는 클래스 (ex) Integer, Long)
사용자 정의 클래스 개발자가 정의한 데이터 구조를 표현하는 클래스

참조형 선언 및 초기화, 출력, 비교

  • 배열
      // 선언 및 초기화
      int[] arr = {1, 2};
          // 또는
              // int[] arr = new int[]{1, 2};
          // 또는
              // int[] arr = new int[2];  // arr[0], arr[1]의 초기값은 0
              // arr[0] = 1;      
              // arr[1] = 2;
      int[] arr_same = {1, 2};
    
      // 출력
      System.out.println(arr); // 출력 : [I@7229724f -> 주소
      for (int i = 0; i < arr.length; i++) {
          System.out.print(arr[i] + " "); // 출력 : 1 2
      }
      System.out.println(Arrays.toString(arr)); // 출력 : [1, 2]
    
      // 비교
      System.out.println(arr == arr_same); // 출력 : false -> 주소 비교
      System.out.println(Arrays.equals(arr, arr_same)); // 출력 : true -> 배열의 내용 비교
    
  • ArrayList
      // 선언 및 초기화
      List<Integer> list = new ArrayList<>(Arrays.asList(1,2));
          // 또는
              // List<Integer> list = new ArrayList<>();
              // list.add(1);
              // list.add(2);
      List<Integer> list_same = new ArrayList<>(Arrays.asList(1,2));
    
      // 출력
      for (int i = 0; i < list.size(); i++) {
          System.out.print(list.get(i) + " "); // 출력 : 1 2
      }
      System.out.println(list); // 출력 : [1, 2] -> ArrayList 클래스에서 toString() 메서드가 Override돼있음
    
      // 비교
      System.out.println(list == list_same); // 출력 : false -> 주소 비교
      System.out.println(list.equals(list_same)); // 출력 : true -> List의 내용 비교
    
  • String
      // 선언 및 초기화
      String str_ltr_1 = "hello"; // 문자열 리터럴을 사용하여 생성
      String str_ltr_2 = "hello";
      String str_new_1 = new String("hello"); // new 키워드를 사용하여 생성
      String str_new_2 = new String("hello");
    
      // 출력
      System.out.println(str_ltr_1); // 출력 : hello
      System.out.println(str_new_1); // 출력 : hello
    
      // 비교
      System.out.println(str_ltr_1 == str_ltr_2); // 출력 : true -> 리터럴로 생성한 
                                                  // 문자열은 같은 객체(String pool) -> 주소 비교
      System.out.println(str_ltr_1 == str_new_1); // 출력 : false -> 다른 객체
      System.out.println(str_new_1 == str_new_2); // 출력 : false -> new로 생성한 
                                                  // 문자열은 다른 객체
      System.out.println(str_ltr_1.equals(str_ltr_2)); // 출력 : true -> 문자열의 내용 비교
      System.out.println(str_ltr_1.equals(str_new_1)); // 출력 : true
      System.out.println(str_new_1.equals(str_new_2)); // 출력 : true
    
  • 사용자 정의 클래스
      class Person {
          private String name;
          private int age;
    
          public Person(String name, int age) {
              this.name = name;
              this.age = age;
          }
    
          @Override
          public boolean equals(Object obj) {
              if (this == obj) return true; 
              if (obj == null || getClass() != obj.getClass()) return false;
              Person person = (Person) obj; 
              return age == person.age && name.equals(person.name);
          }
      }
    
      public class Main {
          public static void main(String[] args) {
              // 선언 및 초기화
              Person p1 = new Person("백엔드", 25);
              Person p2 = new Person("백엔드", 25);
    
              // 출력
              System.out.println(p1); // 출력 : Person@4c873330 -> 주소
    
              // 비교
              System.out.println(p1 == p2); // 출력 : false -> 주소 비교
              System.out.println(p1.equals(p2)); // 출력 : true -> 객체의 내용 비교
                                              // Person 클래스에서 equals() 메서드를 
                                              // 개발자가 직접 Override하여 작성했음
          }
      }