데이터 타입 또는 자료형은 컴퓨터 과학과 프로그래밍 언어에서 실수치, 정수, 불린 자료형 따위의 여러 종류의 데이터를 식별하는 분류이다. (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하여 작성했음 } }