JAVA Primitive Type

자료형

Java 자료형은 기본타입(Primitive)과 참조타입(Reference)이 존재한다. 기본 타입은 숫자형(Numeric)과 논리형(Boolean)으로 나뉘며, 숫자형은 정수형(Integral)과 실수형(Float-point)으로 나뉜다.

기본 자료형의 변수는 선언되면 Java의 메모리 영역중 Stack 영역에 저장된다.

정수형문자형실수형논리형
1바이트byte--boolean
2바이트shortchar--
4바이트int-float-
8바이트long-double-

정수형

컴퓨터 내부적으로 정수를 표현할때는 2진수를 처리하여 표현한다.

  • byte (-128 ~ 127)
    바이트 단위의 정보를 저장하거나 통신할 때 주로 사용됨.

  • short (-32,768 ~ 32,767)

  • int (-2,147,483,648 ~ 2,147,483,647)
    정수를 표현할 때 가장 많이 사용하는 자료형이다. 컴퓨터에서 정수로 연산할때 4바이트 단위로 처리하는것이 가장 효율적이기 때문에 Java 컴파일러는 기본적으로 모든 숫자를 int형으로 변환하여 처리하고, 그 다음에 다시 선언된 자료형으로 복원시키는 작업을 한다.

  • long (-9,233,372,036,854,775,808 ~ 9,233,372,036,854,775,807)
    정수를 int형으로 처리하는 Java컴파일러의 특징 때문에 int범위를 넘어가는 숫자를 long형에 넣을 때 오류가 발생한다. 컴파일러에게 이 숫자를 long으로 처리하라는 것을 알려줘야 오류가 발생하지 않고, 숫자 뒤에 L을 붙여서 해결한다.


long num1 = 2147483700; // 오류
long num1 = 2147483700L;
  • char (0 ~ 65535)
    char는 주로 문자를 표현하기 위해 사용되는 자료형으로 유니코드에 대응되어 인코딩 된다.

C에서는 char 형은 ASCII 코드와 대응되어 인코딩 된다. 이때 char 형의 묶음, 그러니까 char 형의 포인터를 문자열로 처리하는데 Java에서도 그렇게 처리할 수 있을까?

public class Main {
    public static void main(String[] args) {
        char[] charArr = {'a', 'b', 'c', 'd', 'e'};

        for(char x : charArr) {
            System.out.print(x);
        }
        System.out.println();
        
        String str = "abcde";
        System.out.print(str);
    }
}

할수는 있지만 Java에서는 String 이라는 자료형을 제공한다. 이 자료형은 참조으로, 나중에 더 자세히 다룬다.

실수형

컴퓨터 내부적으로 실수를 표현할때는 정수를 표현할때와는 다른 부동소수점 방식을 이용한다. 정수를 표현하는 방식과 비슷하게 메모리를 3분할(부호, 정수, 소수) 할 경우 표현할 수 있는 수의 범위가 작아지는 단점이 있기 때문이다.

부동 소수점 방식

위는 부동소수점 방식으로 실수 값 0.1을 표현하는 방식이다. 이렇게 가수, 지수 부분을 나누어 실수 값을 표현하는 것을 부동 소수점 방식이라고 한다.

컴퓨터는 2진수를 사용하므로 밑수는 2가 될 것이고 가수는 정규화라는 과정을 통해서 1.n 형식이 된다. 부동 소수점 방식은 ±(1.가수부)×2^(지수부-127) 형식으로 표현한다.

가령, 실수 값 0.4 값을 표현하기 위해서 컴퓨터는 내부적으로 0.2를 표현하기려면 1.6 * 2 ^(-3) 과 같은 부동소수점 표현식이 만들어지는 것이다.

부동소수점 방식과 오차

2를 밑수로한 부동소수점으로 표현된 소수를 10진수로 변환할때 오차를 발생하는데, 그 때문에 컴퓨터에서 표현하는 소수는 근사치일 뿐, 정확한 값이라고 생각해서는 안된다.

public class Main {
    public static void main(String[] args) {
        double num = 0.1;
        for(int i = 0; i < 1000; i++) {
            num += 0.1;
        }
        System.out.print(num);
    }
}
// 100.09999999999859

따라서 부동 소수점으로 표현한 0.1은 10진수의 0.1과 동일하지 않다.

그러면 메모리 상에서는 어떻게 저장되는 걸까?

  • double

  • float

    Java에서는 기본적으로 소수형 데이터는 모두 double로 입력된다고 인식한다. 따라서 flaot형 변수에 소수를 입력하면 오류가 발생하는데, 이는 long 타입을 처리했던것과 같이 소수 뒤에 f를 붙여주면 해결된다.

Default Value

어떤 경우에는 변수를 초기화하지 않았음에도 자동으로 초기화되어있는 경우가 있는데, 이때 자동으로 초기화되는 값이 Default Value 이다.

  • byte, short, int, long 타입은 0으로
  • char 타입은 \u0000, 즉 "0" 으로
  • float, double 타입은 0.0으로
  • boolean 타입은 false 로

좋은 웹페이지 즐겨찾기