-
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보다 더 많은 숫자를 표현할 수 있는 넓은 범위를 가지고 있기 때문에 형변환이 가능한 것입니다.
실수에 범위에 대한 부분은 차후 추가하겠습니다.
평소에 변수를 할당할 때, 데이터와 메모리에 대한 생각을 하면서 조금 더 효율적인 방법을 찾아가야 될 듯합니다.
잘못된 부분이 있으면 피드백 주시면 감사합니다.
'프로그래밍 > Java' 카테고리의 다른 글
자바[Java] 접근 제어자[Access modifier] (0) 2021.07.31 자바(Java) 사용자 입/출력과 버퍼(butter) (0) 2021.07.23