Java 데이터 유형(Data type)

Java 언어 데이터 유형

각 변수들은 그들이 가질 있는 자료형에 따라 다양한 형태으로 분류될 수 있다.

기존 자료형(Data type)에는 정수, 실수, 문자, 논리값 등과 같은 자료형이 있으며, 참조 자료형에는 배열, 클래스, 인터페이스 등이 있다. 기본 자료형 변수는 그것이 나타내고자 하는 기본 자료형의 값을 가지고 있는 반면, 참조 자료형 변수는 값이 그에 대한 참조 즉 메모리 주소를 가지고 있다. 이러한 차이는 다른 객체의 메소를 호출할 때 나타난다.

  • 상수(Constant) : 항상 일정한 값을 유지하는 데이터이다.
  • 변수(Variable) : 특정 상황에 따라 값이 변하는 데이터이다.
  • 자료형(Data Type) : 상수나 변수를 유동적인 데이터를 저장하기 위해 지성는 데이터의 형태를 말한다. 자료형은 그 종류에 따라서 각각 다른 메모리의 크기를 갖는다.

자료형 분류

Java의 데이터 유형은 8종류의 기본형(primitive type)과 참조형(reference type)으로 구성되어 있다.

분류를 하자면 아래와 같다.

  • Java Data Type
    • Primitive Type
      • Boolean Type(boolean)
      • Numeric Type
        • Integral Type
          • Integer Type(short, int, long)
          • Floating Point Type(float, double)
        • Character Type(char)
    • Reference Type
      • Class Type
        • String Type
        • Wrapper Class
      • Interface Type
      • Array Type
      • Enum Type

기본 자료형: Primitive Type

기본형은 다음과 같은 특징이 있다.

  • 기본 자료형은 반듯시 사용하기 전에 선언이 되어야 한다.
  • OS에 따라 자료형의 길이가 변하지 않는다.
  • 객체가 아니기 때문에 null을 가질 수 없다.

자바 기본 자료형의 크기와 범위는 아래와 같다.

타입 설명 크기(bit) 범위
char 16비트 유니코드(Unicode) 문자 데이터 16 ‘\u0000’ ~ ‘\uFFFF’
boolean 참/거짓 값 8 true 또는 false
byte 부호를 가진 8비트 정수 8 -128 ~ +127
short 부호를 가진 16비트 정수 16 -32,768 ~ +32,767
int 부호를 가진 32비트 정수 32 -2,147,483,638~+2,147,483,647
long 부호를 가진 64비트 정수 64 -9223372036854775808~+9223372036854775807
float 부호를 가진 32비트 부동 소수점 32 -3.402932347e+38~+3.40292347e+38
double 부호를 가진 64비트 부동 소수점 64 -179769313486231570e+308~1.79769313486231570e+08
  • 문자형: char
  • 논리형: boolean
  • 정수형: byte, short, int, long
  • 부동 소수점형: float, double

BigInteger

long 타입을 사용을 한다면 가장 큰값은 9223372036854775807이다. 이보다 정말 큰 숫자가 필요하다면 BigInteger을 사용해야 된다.
BigInteger는 일반적인 오퍼레이터 연산자는 사용할 수 없고, .add(), .subtract(), .multiply(), .divide() 메소드가 제공이 되고, 매개변수 또한 BigInteger를 받는다.

참조형: Reference Type

참조형은 기본형 8종류를 제외한 모든 데이터 유형이고, 기본적으로 java.lang.Object를 상속 받는다.
참조 유형의 변수는 데이터를 그대로 저장하지 않고 데이터를 저장하는 메모리의 주소만 저장한다. 즉, 참조형의 변수는 데이터를 다른 영역에 저장하고 그 주소만을 이용한다.

Class Type

클래스형은 기본형과 다르게 객체를 참조하는 형태이다.

예제를 통해서 알아보자.

아래 객체는 단순히 str 변수를 갖은 클래스이다.

package com.devkuma.basic.datatype.ex1;

class MyObject {
    private String str;

    public MyObject(String str) {
        this.str = str;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
}

아래 객체는 MyObject를 활용하여 str 값을 표시해 주고 있다.

package com.devkuma.basic.datatype.ex1;

public class MyObjectMain {
    public static void main(String[] args) {
        MyObject a = new MyObject("a");
        MyObject b = new MyObject("b");

        // 초기값 표시
        System.out.println(a.getStr()); // a
        System.out.println(b.getStr()); // b

        // a를 b에 대입
        a = b;
        System.out.println(a.getStr()); // b

        // b의 str에 값 "c"를 대입
        b.setStr("c");
        System.out.println(a.getStr()); // c
    }
}

실행 결과:

a
b
b
c

처음 객체 b를 a에 대입하고, a를 표시하면 “b"가 표시되는 것을 확인 할 수 있다. 그러고, b의 str 변수에 값 “c"를 대입해서 a를 표시하니 “c"가 표시되었다.

이는 객체 a와 b라는 변수가 가지는 것은 실제 객체가 아닌 객체의 주소를 갖기 때문이다. a와 b는 같은 객체의 주소를 가지고 있기 때문에 어느 한쪽이 변하더라도 값이 동일한 것이다.

String Type

클래스형에서도 String 클래스는 조금 특별하다. 이 클래스는 참조형에 속하지만 기본적인 사용은 기본형처럼 사용한다. 그리고 불변(immutable) 객체이다.
String 클래스에는 값을 변경해주는 메소드들이 존재하지만, 해당 메소드를 통해 데이터를 변경한다면 새로운 String 클래스 객체를 만들어내는 것이다.

일반적으로 기본형 비교는 == 연산자를 사용하지만 String 객체간의 비교는 .equals() 메소드를 사용해야 한다.

Wrapper Class

기본형은 앞에서 언급했듯이 객체가 아니기 때문에 null을 넣을 수 없지만, Wrapper Class를 사용하면 null을 넣어야 있게 된다. 이를 래퍼 클래스는 기본형을 클래스로 감싼 형태의 객체이기에 null이 선언할 수 있게 된다.

기본형 래퍼 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Char
boolean Boolean

Interface Type

아래처럼 인터페이스를 만들어 보자. 여기서 T는 제내릭 타입으로 옵션이다.

interface MyInterface<T> {
    void add(T value);
}

인터페이스를 만들게 되면 새로운 참조 자료형을 만드는 것과 같다. 그리고 인터페이스도 자료형이기 때문에 자료형으로써 자신을 구현한 객체의 주소를 가질 수 있다. 다만, 인터페이스에 정의된 메소드만 사용할 수 있게 된다.

Array Type: 배열형

배열형은 기본형으로도 만들 수 있고 참조형으로도 만들 수 있다.

int[] num1 = new int[2];
Integer[] num2 = new Integer[3];

자료형에 대해 []를 선언함으로 배열을 지정할 수 있다. 배열형 변수 또한 배열의 주소를 가지고 있는 것이기 때문에 클래스형의 특징과 동일하다. 그래서 같은 객체의 주소를 참조하게 되면 동일한 배열을 가리키게 된다.

그리고 아래 코드처럼 [][]등으로 중첩 괄호를 사용하게 된다면 다중 배열로 사용할 수 있다.

Object[][] obj = new Object[2][3];

Enum Type: 열거형

enum(열거형)이란, 복수의 정수를 한꺼번에 다루기 위한 데이터 형이다.

enum(열거형) 정의

[modifier] enum name {
  member, ...
}
  modifier: 한정자(`public`, `strictfp`)
  name: 열거형의 이름
  member: 열거 상수

열거형의 선언에는 enum 키워드를 사용한다. enum 블록 아래에 이름(열거 상수)을 쉼표로 구분하여 나열한다. 상수와 같이 다루므로 이름은 언더스코어(_) 형식(모두 대문자, 단어의 단락은 언더스코어)로 정하는 것이 일반적이다.

예를 들어, 다음은 요일을 나타내는 WeekdayEnum 열거형을 정의하는 예제이다.

public enum WeekdayEnum {
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Tursday,
    Friday,
    Saturday
}

정의한 열거형에는 Weekday.Sunday와 같이 형명.상수의 형식으로 액세스 할 수 있다.

enum(열거형) 메서드

열거형은 암묵적으로 Enum 클래스(java.lang 패키지)를 상속한 클래스의 일종이다. 그리고 열거 상수를 참조한 “Weekday.Sunday"는 Enum 객체이다. Enum 객체에서는 다음과 같은 메서드를 사용할 수 있다.

Enum 클래스의 메서드

메서드 개요
String name() 열거 상수의 이름을 반환
int ordinal() 열거 상수의 순서를 반환(0 시작)
toString() 열거 상수의 이름을 반환
E[] values() 열거형에 포함되는 모든 열거 정수를 반환

예를 들어, 다음 예제는 Weekday 열거형에 정의된 열거 상수의 이름을 나열한다.

for (WeekdayEnum w : WeekdayEnum.values()) {
  System.out.println(w.name());
}

생성자/필드/메소드 정의

열거형도 클래스의 일종이기 때문에 부하에 생성자나 필드/메소드를 정의하는 것도 가능하다.

public enum WeekdayEnum {
    Sunday("sun"),
    Monday("mon"),
    Tuesday("tue"),
    Wednesday("wed"),
    Thursday("thu"),
    Friday("fri"),
    Saturday("sat");
 
    // 필드
    private String name;
 
    // 생성자
    private WeekdayEnum(String name) {
        this.name = name;
    }
 
    // 메서드
    @Override
    public String toString() {
        return this.name;
    }
}

열거값에  자신의 식별자와는 별도로 (예를 들어) 표시를 위한 값을 갖게 하고 싶은 경우에는  예제와 같이 필드(속성) 선언한다.  예제에서는 요일의 단축 이름을 `name` 필드에 갖는다.
필드는 일반적인 클래스와 같이 생성자로 초기화할  있다. 구문은 기본적으로 클래스와 동일하지만, 접근 제한자는 `private` 고정이 되는 점에 주의하여라(따라서, 샘플의 코드에도 `private` 생략해도 의미는 같다).  

생성자를 정의한 후에는 열거 상수도 이에 따라 열거 상수(인수, ...) 형식으로 선언해야 한다. 열거 정의 마지막에는 "`;`" 세미콜론을 넣는다.  

마지막으로 메소드의 정의이다. 여기서는 name 필드의 값을 검색할  있도록 `toString` 메서드를 정의한다. 구문은 클래스와 동일하다.

이것으로 정의한 열거형은 아래와 같이 이용할  있다.
```java
System.out.println(WeekdayEnum.Monday.toString());  // 결과 : mon



최종 수정 : 2022-09-04