HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

자바 자료형 정리(Java Data Type)

기초를 탄탄히 하자는 마음으로 이번 포스팅은 자바 자료형Java Data Type에 대한것을 다뤄봅니다.

Java Data Type

자바에는 기본형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
    ㄴ Interface Type
    ㄴ Array Type
    ㄴ Enum Type
    ㄴ etc.

Primitive Type

기본형은 다음과 같은 특징을 가집니다.

  • 자바에서 기본 자료형은 반드시 사용하기 전에 선언Declared되어야 합니다.
  • OS에 따라 자료형의 길이가 변하지 않습니다.
  • 비객체 타입입니다. 따라서 null 값을 가질 수 없습니다.

또한 이러한 기본 자료형은 아래와 같은 것들이 존재합니다.

Type        Bits      Range of Values
----------------------------------------------------------------------------------------
byte         8bits    -2^7 ~ 2^7-1 (-128 ~ 127)
short       16bits    -2^15 ~ 2^15-1 (-32768 ~ 32767)
int         32bits    -2^31 ~ 2^31-1 (-2147483648 ~ 2147483647)
long        64bits    -2^63 ~ 2^63-1 (-9223372036854775808 ~ 9223372036854775807)
float       32bits    0x0.000002P-126f ~ 0x1.fffffeP+127f
double      64bits    0x0.0000000000001P-1022 ~ 0x1.fffffffffffffP+1023  
char        16bits    \u0000 ~ \uffff (0 ~ 2^15-1) * 자바에서 unsgined로 동작하는 자료형
boolean      1bit     true, false

BigInteger

생각해보니 long타입을 사용한다 하더라도 가장 큰값은 9223372036854775807입니다. 큰 것같지만 크지 않은듯한 이 느낌. 혹시라도 정말 큰 숫자가 필요하다면 BigInteger를 기억하세요. 하지만 일반적인 오퍼레이터 연산자는 사용할 수 없습니다. 대신 .add(), .subtract(), .multiply(), .divide() 메소드가 제공이 되고 매개변수 또한 BigInteger를 받습니다.

Reference Type

참조형은 기본적으로 java.lang.Object를 상속 받으면 참조형이 됩니다. 또한 선언한 자료형이 기본형이 아닌 경우 참조형이 된다고 보면 됩니다. 참조형에는 클래스형Class Type, 인터페이스형Interface Type, 배열형Array Type이 있는데 하나씩 알아봅시다.

Class Type

클래스형은 기본형과 다르게 객체를 참조하는 형태입니다. 따라서 다음과 같은 코드가 가능합니다.

class MyObject{
    private int index;
    MyObject(int index) {
        this.index = index;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    }
}
public class ClassType {
    public static void main(String[] args) {
        MyObject a = new MyObject(2);
        MyObject b = new MyObject(4);
        System.out.println(a.getIndex()); // "a" result is 2.
        a = b;
        System.out.println(a.getIndex()); // "a" result is 4.
        b.setIndex(6);
        System.out.println(a.getIndex()); // "a" result is 6.
    }
}

b 객체의 멤버 변수 값을 바꿨지만 a 객체도 같은 객체를 참조하기 때문에 동일한 값을 출력하는 것을 볼 수 있습니다.

약간의 언어 혼동이 올 수 있는데 위 코드에서 a와 b라는 변수가 가지는 것은 실제 객체가 아닌 객체의 주소를 가진다고 생각하면 됩니다. a와 b는 같은 객체의 주소를 가지고 있기 때문에 어느 한쪽이 변하더라도 값이 동일한 것입니다. a와 b의 연결고리를 끊고 싶다면 어느 하나의 변수에 null 이나 new MyObject()를 통해 객체의 주소를 지워버리거나 새로운 객체를 가리키게 하면 됩니다.

String Class

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

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

Wrapper Class

기본형은 앞쪽에서 서술한대로 비객체이기 때문에 null을 넣을 수 없다고 했습니다. 하지만 방법은 존재하는법이죠. 기본형에 null을 넣고 싶다면 래퍼 클래스Wrapper Class를 활용하면 됩니다. 래퍼 클래스는 기본형을 클래스로 감싼 형태입니다. 다음처럼 사용합니다.

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

참고하세요. void의 래퍼 클래스인 Void도 존재합니다. 또한 래퍼 클래스들은 내부에 멤버 변수(기본자료형)가 final 선언이 되어 있습니다.

Interface Type

일반적으로 인터페이스라고 한다면 추상 클래스abstract class와 많이 비교 되곤 합니다. 하지만 이 포스트는 순수한 자료형태에 대해서 다뤄보도록 합니다.

아래처럼 인터페이스를 만듭니다. T는 제너릭 타입으로 옵션입니다.

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

인터페이스를 만들게 되면 새로운 참조 자료형Reference Data Type을 만드는 것과 같습니다. 참고로 기존에 있는 자료형의 이름도 만들 수 있습니다(ex:Long). 그리고 인터페이스도 자료형이기 때문에 자료형으로써 자신을 구현한 객체의 주소를 가질 수 있습니다. 하지만 인터페이스에 정의된 메소드만 사용할 수 있겠죠.

Array Type

배열형은 기본형으로도 만들 수 있고 참조형으로도 만들 수 있습니다. 다음의 코드를 봅시다.

public class ArrayType {
    public static void main(String[] args) {
        int [] i = new int[2];
        Long [] l = new Long[2];
        Object[][] o = null;
    }
}

자료형에 대해 []를 선언함으로 배열을 지정할 수 있습니다. 참고로 배열형 변수 또한 배열의 주소를 가지고 있는 것이기 때문에 클래스형의 특징과 일치합니다. 같은 객체의 주소를 바라보게 만들면 동일한 배열을 가리키게 됩니다.

그리고 위 코드의 마지막 라인처럼 [][]등으로 중첩 괄호를 사용하게 된다면 다중 배열로 사용할 수 있습니다.

Enum Type

Java enum Examples를 참조하세요.

Summary

간단하게 자바 자료형에 대해 알아봤습니다. 각 자료형별 자세한 사용법은 검색(?)을 통해 자세히 알아볼 수 있습니다. 혹은 시간이 된다면 하나씩 포스트를 만들어서 풀어보는 것으로 하고 이만 줄입니다. :3

추신. 내용에 오류가 있다면 댓글이나 메일 아시죠~?