ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA 자료형에 대해 알아보자
    JAVA 2023. 2. 9. 21:23

     

    자바를 공부하기 시작하면 가장 먼저 보는 것이 자료형에 관한 것일 것이다. 자바는 많은 부분이 C언어와 유사하기 때문에 자료형도 많은 부분이 비슷하다. 자바는 기본적으로 8개의 자료형을 제공한다. 정수형 3개, 실수형 2개, 불리안 1개이다.

     

    정수 타입

    정수형은 byte, char, short, int, long 이렇게 5가지이다. 그런데 중간에 문자를 뜻하는 char가 껴있다. 처음에 이걸 보고 다소 이상하게 생각했지만 공부를 해 보니 왜 그런지 알 수 있었다.

    byte는 말 그대로 크기가 1바이트=8비트인 자료형이다. 자주 사용하지는 않지만 나는 아스키 코드를 다룰 때 강제 타입변환으로 사용한 기억이 있다. char을 제외한 숫자를 나타내는 자료형은 모두 signed(부호가 있는)이기 때문에 가장 앞의 비트는 부호를 판별하는 데 사용되고 음수는 2의 보수 형태로 저장된다. short는 2바이트의 크기를 가지고 int는 4바이트, long은 8바이트의 크기를 가진다.

    아마도 가장 많이 사용되는 것은 int일 것이라고 생각한다. 알고리즘 문제를 풀거나 프로그램을 작성할 때 int형의 범위를 넘어서는(약 2,100,000,000)값은 자주 등장하지 않기 때문이다. 그리고 자료형의 크기가 클수록 메모리 사용량도 늘어나 메모리 제한이 있는 문제를 풀 때는 주의해야 한다. 하지만 어려운 문제를 풀수록 알고리즘 중간에 사용되는 임시 변수에서 연산을 할 때 일시적으로 int형의 범위를 넘어서는 값이 들어오는 경우가 있다. 그러면 오버플로우가 발생하고 의도치 않은 값들이 튀어나온다. 특히 테스트 케이스들은 보통 숫자가 작기 때문에 직접 발견하기도 쉽지 않다. 이때는 long형을 사용해야만 한다. 어제 정답을 int로 했다가 계속 틀려서 2시간동안 오류찾았는데 알고 보니 long형으로 해야 하는 거였다... 따라서 배열같이 많은 수를 다루는게 아니라 하나의 변수만 사용한다면 미리 long으로 선언하는 습관을 들이는 것도 나쁘지 않다. 컴파일러는 정수를 기본적으로 int형으로 인식하기 때문에 만약 long을 사용하고 숫자를 대입한다면 숫자 뒤에 영어 L을 붙여줘야 한다. 소문자도 상관없지만 i랑 헷갈리니 대문자로 붙이자. 

     

    문자 타입

    자바에서 문자는 작은따옴표로 감싼 하나의 문자를 말한다. 하나의 문자가 아니라 여러개의 문자라면 큰 따옴표로 감싸야하고 문자가 아니라 문자열이라는 객체이다. 엄연히 다르므로 주의하자. char형은 조금 특이한데 자바에서는 문자를 유니코드 형태로 처리한다. 즉 문자도 숫자로 처리한다는 소리이다. 이때문에 char형이 정수형으로 들어가 있는 것이다. 그리고 유니코드에는 음수가 없다. 따라서 char형도 음수를 다룰 필요가 없어 양수만 처리하도록 되어있다.

    byte b = 0;
    short s = 1;
    int i = 2;
    long l = 123456789123456L;
    char c = 'a';

     

    실수 타입

    실수형은 4바이트 float과 8바이트 double이 있는데 float의 유효 소수 자리는 7자리이고 double은 15자리이다. 실수형도 처음 1비트는 부호를 저장하고 float은 가수를 32비트 지수를 8비트, double은 가수를 52비트 지수를 11비트로 저장한다. 여기서 가수와 지수란, 1.234X10^8 1.234가 가수이고 8이 지수이다. 실수도 컴파일러는 기본적으로 double로 인식한다. 따라서 float은 f나 F를 붙여주어야 한다. 그렇지만 보통은 전부 double을 사용하는 편이다.

     

    불리안(논리) 타입

    불리안은 true 또는 false만을 저장할 수 있는 형식이다. 주로 조건을 검사할 때 사용하거나 특정 조건을 한번이라도 만족하면 되는 로직에서 해당 조건이 일어났음을 표시하기 위해 사용하기도 한다. 조건문에서 보통 if(a>b) 이런 식으로 사용하지만 boolean b = true; 로 선언해 놨다면 if(b) 이렇게 바로 사용할 수 도 있다.

    float f = 1.246f;
    double d = 1.65e-10;
    boolean b = true;

     

    타입 변환

    이런 자료형들을 섞어서 사용하면 어떻게 될까? 자바는 똑똑해서 알아서 자료형을 바꿔서 사용한다. 한가지 자료형밖에 사용 못하는 거니 멍청한 건가 이것을 자동 타입 변환이라고 하는데 기준은 가장 자료형이 큰 수이다. 만약 int와 double을 같이 사용해 연산을 한다면 int는 자동으로 double로 바꿔진다. 물론 불리안은 숫자가 아니니 형변환을 할 수 없고 char형은 양수만을 처리하므로 byte에서 자동 변환되지 않는다. 애초에 char로 연산을 할 일이 거의 없긴 하다. 자동 타입변환 말고 강제 타입 변환도 할 수 있는데 큰 자료형을 강제로 작은 자료형으로 변환시키는 것이다. 이때 큰 자료형 앞에 (작은 타입)을 붙여주면 된다. 이것을 캐스팅이라고 한다. 주의할 점은 작은 자료형이 표현 가능한 범위를 넘어서는 수를 강제로 변환하면 데이터가 손실되며 숫자가 바뀐다는 것이다. 그리고 실수를 정수로 강제 변환하면 소수점 부분은 사라지고 정수 부분만 남는다.

    long i = 10;
    float d = (float)i;		//강제 타입 변환

    'JAVA' 카테고리의 다른 글

    JAVA 조건문과 반복문에 대해 알아보자  (0) 2023.03.19
    JAVA 연산자에 대해 알아보자  (0) 2023.03.07
Designed by Tistory.