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

…준비중…

형변환(Casting)

묵시적 형 변환(Wide type convert)

int i = 10;
double d = i;
long l = i;
float f = 3.14f;
d = f;

명시적 형 변환

int a;
byte b;
b = (byte) a;