ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0000~1111 자바(JAVA) 데이터 타입 크기와 형변환에 대해서...
    프로그래밍/Java 2021. 7. 21. 01:05

    자바는 왜 커피일까?

    최근에 자바(JAVA)를 배우고 있습니다.

     

    기계과를 전공하고 반도체 산업에서 일했었기 때문인지 기본 CS지식에 대해서 배울 때, 하드웨어와 관련된 부분이 상당히 흥미로웠습니다.

     

    하드웨어보다 소프트웨어가 하고싶어서 넘어왔는데 소프트웨어를 배우면서 하드웨어에 관심이 가는 심보란...

     

    ▶ 데이터 타입과 메모리

    대부분 비슷하겠지만 자바에서 숫자 데이터 타입은 정수와 실수로 나뉘는데 데이터 타입(메모리에 저장되는 크기)으로 표현하자면 아래와 같습니다.

     

    정수 타입 : byte(1 byte), char(2 byte), short(2 byte), int(4 byte), long(8 byte)

     

    실수 타입 : float(4 byte), double(8 byte)

     

    의미를 알아볼 때, 정수로 비교하면 이해하기가 쉽습니다.

     

    먼저 메모리에 저장되는 크기의 단위인 1byte = 8bit (메모리의 최소 단위)

     

    우리가 흔히 컴퓨터는 0과 1로 이루어진다라고 말하는데 정확히 말하면 컴퓨터의 동작은 상당수의 트랜지스터의 동작의 조합이기 때문입니다.

     

    간단하게 하나의 스위치는 on(1) / off(0) 2가지 동작을 하는데 컴퓨터는 이 스위치들의 조합으로 동작을 하기 때문입니다.

     

    흔히 우리가 아는 모스부호와 같습니다. 점과 선으로 이루어진 모스부호를 조합해서 다양한 단어를 만들어서 문장을 전송하는 것과 같습니다.

    모스부호

     

    다시 돌아와서 데이터 타입은 얼마만큼의 숫자를 표현할 수 있을까?

     

    먼저 간단한 정수형 타입인 byte (1byte)를 확인해 보겠습니다.

     

    byte 타입의 크기인 1byte는 bit로 표현하면 8bit가 됩니다.(1byte = 8 bit) 위에서 1bit는 0과 1을 표현하는 2가지 동작을할 수 있다고 했죠 그렇기에 1bit는 2^1개의 숫자를 표현할 수 있습니다.

     

    2bit는 몇 개의 숫자를 표현할 수 있을까요? 0과 1이 두 번 2x2 = 2^2 개를 표현할 수 있습니다.

    00 01 10 11

    즉, byte 타입의 데이터는 8bit => 2^8 = 256개의 숫자를 표현할 수 있습니다.

    0000 0000 0000 0001 0000 0010 ... 1111 11101 1111 1110 1111 1111

    byte :  -128 ~ 127까지 표현(음수를 포함해서 256개)

    (byte는 signed 타입 즉, 음수와 양수를 모두 갖는 형식)

     

    내가 JAVA에서 byte 타입 변수에 값을 할당할 때 -128 ~ 127까지는 오류 없이 저장할 수 있다는 의미입니다.

     

    그럼 우리가 보통 가장 많이 사용하는 int는 32bit => 2^32 = 약 ±2억 1천 정도로 상당히 큰 수까지 무리 없이 저장 가능하다는 의미입니다.

     

    ▶ 데이터 타입을 나누는 이유?

     int의 데이터가 많다면 굳이 데이터 타입을 나눌필요가  있을까? 그냥 int나 더 큰 것으로 사용하면 될 텐데?라는 의문이 들 수도 있는데 사실 반도체가 많이 발전한 지금은 많이 느슨해졌을지 모르지만, 산업기계에 포함되어있는 메모리는 그 크기가 아주 작아서 내장된 소프트웨어를 최대한 효율적으로 만들어야 하는 부분이 있습니다.

     

    즉, 메모리는 아낄수록 좋다. 용량 줄일 수 있으면 좋으니까...

     

    ▶ 자바에서의 형변환

     사실 개인적으로 이 부분이 상당히 재미있었습니다.

     

    변수를 선언했을 당시에 정의했던 데이터 타입을 중간에 "형 변환"이라는 툴을 이용해서 변화시킬 수 있었습니다.

    ex): byte 데이터 타입으로 선언한 변수 a의 범주를 벗어나는 값을 강제 형변환

    >>> byte a;

    >>> a = (int) 500;

    최대 127까지의 숫자만 담을 수 있었던 byte 변수가 강제 형 변환을 통해서 500 값을 가지게 되었습니다?

     

    사실 출력했을 때 엉뚱한 값이 나오게 됩니다.

    500은 byte 데이터 형식의 표현 범위를 벗어나는 값이기 때문에 더 큰 데이터 타입을 가져야 합니다.

     

    작은 틀에 큰 값 할당할 때 오류가 발생하는 것입니다.

    그럼 반대의 경우는?

     

    byte -> int처럼 작은 값을 큰 데이터 타입 형식의 틀에 담는 것은 오류 없이 진행됩니다.

     

    ▶ 정수 -> 실수

     

    실제 세상에서 사용되는 값은 정수보다 실수가 더 많은 비중을 차지하게 될 것입니다.

     

    그래서 우리는 간단하게 정수를 입력받고 실수로 반환해야 할 때가 많을 텐데 이때도 형 변환을 사용이 될 것 같습니다.

     

    >>> int height = 180;

    >>> int weigth = 75;

    >>> float rate = (float) height / weight;

     

    여기서 int (8 byte) -> float (4 byte)의 형 변환이 이뤄집니다.

     

    정수만 봤을 때, 더 큰 데이터 형식이 작은 데이터 형식으로 형 변환이 이뤄지는 것이 잘못된 것처럼 보일 수 있으나,

    실제로 데이터 타입의 메모리를 차지하는 크기가 아닌 숫자를 표현하는 범위가 중요합니다.

     

    float이 int보다 더 많은 숫자를 표현할 수 있는 넓은 범위를 가지고 있기 때문에 형변환이 가능한 것입니다.

     

    실수에 범위에 대한 부분은 차후 추가하겠습니다.

     

     

     

    평소에 변수를 할당할 때, 데이터와 메모리에 대한 생각을 하면서 조금 더 효율적인 방법을 찾아가야 될 듯합니다.


    잘못된 부분이 있으면 피드백 주시면 감사합니다.

    댓글

Space_Jin's blog