[JAVA] 2-2. 자바의 참조 데이터(참조 변수 | 객체) 타입 종류와 특징

Re_Go·2024년 5월 26일
0

JAVA

목록 보기
8/37
post-thumbnail

자바에서는 자바스크립트와 마찬가지로 데이터의 타입을 크게 두 가지로 분류하고 있습니다. 기본 데이터 타입(primitive type)참조 데이터 타입(reference type)인데요.

큰 골자에서는 자바에서의 참조 데이터 타입 또한 자바스크립트와 크게 다를 바가 없습니다. 그래서 자바에서 참조 데이터 타입으로 선언된 변수도 객체가 생성된 메모리 주소 번지를 저장하고 있다는 것인데요.

차이점을 꼽아보자면 객체 메모리의 관리를 하는 주체(자바는 JVM이, 자바스크립트는 자바스크립트 엔진이 관리)나, 객체의 생성 방식, 상속의 주체 여부에 따라 달라질 수 있습니다.

이러한 차이점을 살펴보기에 앞서, 이번 섹션에서는 기본적으로 자바에서의 참조 데이터 타입의 종류 및 특징, 사용법에 대해서 알아보겠습니다.

1. 배열(array) 타입

자바에서도 자바스크립트와 마찬가지로 배열 타입또한 존재하는데요. 차이점이라고 한다면 데이터 타입의 구분 없이 저장이 가능한 자바스크립트와는 반대로, 통일된 데이터 타입으로 배열 데이터를 구성해야 한다는 것과, 대괄호를 사용하는 자바스크립트와는 반대로 중괄호로 데이터의 목록을 나열하여 배열 변수에 할당한다는 점, 배열의 내용을 바로 확인할 수 있는 자바스크립트에 반해, print 메서드로는 배열의 내용을 직접적으로 확인하는 것이 어려우므로 Arrays 클래스의 toString 메서드를 이용해야 배열의 실질적인 내용 확인이 가능하다는 점을 꼽을 수 있겠습니다.

  1. 자바스크립트에서의 배열 생성
let arr = [false, true, `2`, 3, 16/4, 5.0]
console.log(arr) // [false, true, "2", 3, 16/4, 5.0] 출력
  1. 자바에서의 배열 생성
// 배열 생성시 new 키워드를 이용하거나, 직접 할당하는 것 또한 가능합니다.
int[] arr1 = {1, 2, 3, 4, 5};
// 이때 배열 기호는 데이터 타입 또는 변수명 중 한 곳에 접미사로 작성하면 됩니다.
String arr2[] = {"1", "2", "3", "4", "5"};
// new 키워드로도 배열의 생성이 가능하며, 이때의 배열 길이는 자바스크립트(소괄호)와는 다르게 대괄호([])를 사용합니다.
String[] arr3 = new String[3];
arr3[0] = "Apple"
arr3[1] = "Banana"
arr3[2] = "Orange"

// Arrays.toString 메서드를 이용해 직접 출력 가능
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));
System.out.println(Arrays.toString(arr3));
  1. 자바에서의 배열 할당
// 기본 타입으로 배열을 생성할 때 길이만 지정하면 각 자리에는 0이 할당됩니다.
int[] numArr = new int[3] ; // [0,0,0]
// 길이를 넣지 않으면 0이 할당됩니다.
int[] numArr = new int[] ; // [0]
// 참조 타입으로 배열을 생성할 때 길이만 지정하면 각 자리에는 null이 할당됩니다.
String[] stringArr = new String[3] ; [null, null, null]
// 길이를 넣지 않으면 null이 할당됩니다.
String[] stringArr = new String[] ; // [null]
  1. 자바에서의 다차원 배열 할당
// 기본 타입으로 배열을 생성할 때 길이만 지정하면 각 자리에는 0이 할당됩니다.
int[][] numArr = new int[3][2] ; // [[0,0],[0,0],[0,0]] 3행 2열의 2차원 배열 생성
// 참조 타입으로 배열을 생성할 때 길이만 지정하면 각 자리에는 null이 할당됩니다.
String[] stringArr = new String[3][] ; [[null],[null],[null]] 3null 행의 2차원 배열 생성

2. 열거(enom) 타입

공통적이고, 연속적인 값들의 집합체를 의미하는데요. 예를 들어 사계절(봄,여름,가을,겨울) 이라던지, 요일(월,화,수,목,금,토,일)등을 정의할 때 사용됩니다.

이렇게 정의된 열거 타입의 값들은 열거 상수라고 불립니다.

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Day today = Day.MONDAY;
System.out.println("Today is " + today); // 출력: Today is MONDAY

3. 클래스(class) 타입

클래스는 크게 사용자 정의 클래스와 기본 정의 클래스와 자바에서 제공하는 라이브러리 클래스로 나뉘는데요. 라이브러리 클래스의 세부 목록은 이후의 챕터에서 다루는 걸로 하고, 이번 섹션에서는 크게 두 가지 클래스의 정의 방식에 대해서 얘기해 보겠습니다.

  1. 사용자 정의 클래스

사용자가 직접 정의한 클래스이며, 해당 클래스를 이용해 객체(인스턴스)를 생성하는 것이 가능한데요. 사용자가 직접 정의하는 클래스이다보니 멤버 변수, 생성자, getter와 setter, 메서드를 직접 정의해야 하는 번거로움이 존재합니다. (물론 다른 클래스를 상속 받는다면 이 문제는 어느정도 해결됩니다.)

// 학생 클래스 정의
class Person {
    // 멤버 변수
    private String name;
    private int age;
    private boolean marriage;

    // 생성자
    public Student(String name, int age, boolean marriage) {
        this.name = name;
        this.age = age;
        this.marriage = marriage;
    }

    // Getter 메서드
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getMarriage() {
        return major;
    }

    // Setter 메서드
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setMarriage(String major) {
        this.major = major;
    }

    // 사람 정보 출력 메서드
    public void displayInfo() {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
        System.out.println("Marriage: " + marriage);
    }
}
  1. 라이브러리 클래스

자바는 JDK에서 제공하는 라이브러리를 이용해 미리 정의되어 있는 클래스를 사용하는 것이 가능한데요. 여기서는 대표되는 String 클래스에 대해서 살펴보겠습니다.

기본 데이텉 타입인 문자 타입 char와는 다르게 큰 따옴표("")를 감싼 데이터는 문자열 타입으로 간주됩니다.

해당 타입은 앞서 소개한 기본 타입들과 달리 참조 데이터 타입 의 특성을 가지는데요. 그 이유는 문자열 타입은 기본적으로 String 클래스에 의해 생성되는 객체 데이터 타입이되며 때문에 당연하게도 객체의 특성 중 하나인 불변 객체(immutable)로서의 특성을 지니기 때문입니다. 객체 타입의 특징에 대해서는 이곳을 참조하시면 되겠습니다.

아무튼 이러한 특성을 지닌 문자열은 기본적으로 한 줄로 취급되기 때문에, 여러 줄을 입력하고 싶다면 이스케이프 문자와의 조합으로 다양하게 표현이 가능한데요. Java 13부터 자바스크립트의 백틱 기능과 유사한 텍스트 블록 문법으로 이스케이프 문자를 사용하지 않고도 자유롭게 글 작성이 가능해 졌습니다.

이러한 String 객체를 생성하기 위해서는 기본적으로 리터럴 방식으로 생성하거나, new 키워드로 생성하거나, StringBuilder 또는 StringBuffer 클래스를 이용하여 생성하는 방식 등이 존재합니다.

String str1 = "Hello, world!"; // 기본적인 문자열 생성법
String str2 = "This is line 1.\n" +
              "This is line 2.\n" +
              "This is line 3."; // 이스케이프 문자를 활용한 문자 생성법
String str3 = """
              This is line 1.
              This is line 2.
              This is line 3.
              """; // 텍스트 블록을 이용한 문자 생성법
String str4 = new String("""
              This is line 1.
              This is line 2.
              This is line 3.
              """); // 텍스트 블록을 이용한 문자 생성법

4. Null 타입

Null 타입은 자바스크립트에서는 기본 타입이나, 자바에서는 참조 타입으로 간주됩니다.

하지만 사용 용도는 JS의 Null과 비슷한데요. 다만 자바에서의 Null은 기본 타입에는 할당하지 못하고, 참조 타입에 할당 및 초기화 용도로 사용되는데요. 객체 타입에 아직 값을 넣지 않았음을 의미할때, 혹은 선언만 했을 때, 상황에 따라 값을 비울 때 주로 이 Null이 사용됩니다.

char message = null; // 컴파일 에러 발생
String str1 = null; OK
string str2; // null로 자동 할당
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글