자바의 변수와 자료형
목차
이번 포스팅은 자바의 변수와 자료형에 대하여 알아보겠습니다.
변수는 쉽게말해 변하는 수를 말합니다. 프로그램이란 데이터를 조작하여 원하는 결과를 얻는 자동화 기계입니다. 데이터에 이름을 붙이면 변수가 됩니다.
변수와 데이터(자료형)은 땔래야 땔수 없는 관계인데요. 변수는 데이터형이 지정되야 사용할 수 있습니다. 변수를 비트로 보면 PC에서는 최소 8비트부터 64비트 까지 변수가 있습니다. 데이터형에 따라 비트 수가 차이가 납니다.
자바는 C언어와 같이 정적인(static) 언어라고 합니다. 정적이라는 것은 변수의 데이터형에 엄격하다는 것을 의미합니다.
이와 반대되는 개념이 동적인(dynamic) 언어입니다. 자바스크립트, 파이썬, 루아 등이 동적인 언어이며 이들은 변수의 데이터형을 프로그래머가 지정하지 않습니다.
이것만 보면 자바는 어려운 언어입니다만 꼭 그렇지는 않습니다. 프로그래머가 자신이 사용할 데이터들의 속성에 대하여 명시적으로 설계한다는 것은 컴퓨터 내부의 동작에 대하여 더 깊이 있는 이해가 가능한 부분도 있습니다.
컴퓨터 공학에서 자료형(Data Type)의 문제는 모두가 귀찮아하지만 생각보다 중요한 주제라고 볼 수 있습니다. 어쨋든 자바는 정적인(static) 언어이기 때문에 자료형에 대한 숙지를 해야 변수를 사용할 수 있습니다.
변수와 자료형을 설명할 때는 보통 변수를 먼저 이야기 하는데 여기서는 반대로 보겠습니다. 먼저 자료형을 봅니다.
정수 자료형
자바 자료형의 종류는 byte, short, int long 의 정수 자료형과 char 의 문자 자료형 float, double의 실수 자료형(부동소수점) 그리고 참과 거짓을 표현하는 boolean 논리형이 있습니다.
다행히 자료형 종류가 많은 C언어보다는 간단합니다.
정수 자료형부터 알아보겠습니다. 정수자료형은 이진법과 2의 보수법을 사용합니다.
바이트(byte)
바이트는 1바이트를 의미하고 1바이트는 8비트를 말합니다.
아래와 같은 이진수가 8개 있는 저장공간입니다.
0000 0000 --> 0 0000 0001 --> 1 0000 0010 --> 2 0000 0011 --> 3
저장가능한 숫자의 범위는 2의8승 256개 입니다. 양수로 사용하면 0부터 255까지 음수까지 사용하면 -128 ~ 127 까지입니다. 자바의 바이트 범위는 음수를 포함한 -128 부터 127까지 입니다.
프로그래밍을 하다보면 256보다 작은 공간을 쓰고 싶을 때도 있는데요, 현대 PC에서는 메모리를 효율적으로 사용할 수 있는 8비트(1바이트)가 최소 단위입니다. 이보다 작은 자료형을 사용하고 싶으면 비트연산자도 사용할 수 있습니다. 메모리 용량이 높아진 현대에는 공간 절약의 큰 의미는 없습니다.
바이트로 뭘 할 수 있는지 한번쯤 생각해 볼 필요가 있습니다. 나이 같은 것도 괜찮습니다. 127세까지 사는 사람은 전세계에 한명 나올까 말까니까. 그런데 살아있는 사람이 아니라 출생기준으로 정리하면 오래전에 돌아가신 분들은 byte로 해결이 안되겠죠? 그런 경우 1바이트를 더 사용해야 합니다.
쇼트 (short)
쇼트 형은 16비트(2바이트)입니다.
아래와 같이 생겼습니다. 8비트의 두배입니다.
0000 0000 0000 0000 0000 0000 0000 0001 ...
경우의 수는 2의 16승으로 65336 개 범위를 저장할 수 있습니다. 자바에서는 음수범위까지 -2의15승~ 2의 15승-1 로 -32,768 ~ 32,767 까지의 정수를 저장할 수 있습니다.
자바 컴파일러는 자료형을 초과하는 변수할당에 대하여는 오류가 발생합니다. C언어가 오버플로우 시키는 것과 차이가 있습니다. 자바는 매니지드 언어기 때문에 C언어에 비해 엄격한 부분이 더 있습니다.
인트형 (int)
인트형은 모두가 가장 많이 사용하는 자료형입니다. 자바의 국민 자료형, 세계 자료형입니다. 32비트로 16비트의 두배입니다.
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 ...
이렇게 보니까 int 형과 short , byte 와의 차이가 크게 보입니다.
4,294,967,296 개 범위의 정수를 저장할 수 있습니다.(약 42억) 제곱단위로 자료형이 커지기 때문에 32비트 부터는 좀 숫자가 커집니다.
범위는 -2의31승 ~ 2의31승-1 (대략 -21억에서 21억까지로 보면 됩니다) 정수의 리터럴 (숫자)은 기본적으로 인트형입니다. 대부분의 컴퓨터들이 연산을 할 때는 32비트 단위가 가장 효율적입니다. 4바이트를 기본 단위로 사용하기 때문입니다.
CPU가 64비트로 넘어간지는 꽤 지났지만 대부분의 소프트웨어가 32비트 기준에서 작성되었기 때문에 최적화도 무시할 수 없는 부분이고요. 정수하나를 저장하는데 4바이트를 사용하는게 8바이트를 사용하는 것 보다 공간적인 절약도 있습니다.
컴파일러의 최적화 부분도 있어서 for 루프로 누적 연산을 하면 int 가 long 형보다 빠르게 계산하는 것으로 알고 있습니다. 자바는 아니지만 C로 테스트 해본 적이 있습니다.
그런 부분까지 고려하면 훨씬 복잡한 문제가 됩니다만, 기본적으로 32비트 숫자를 주력으로 사용하는 프로그램을 개발할 때는 int 형이 기본입니다.
프로그램을 작성할 때 기본 정수형 int 형을 사용하도록 하고 short 과 byte를 필요에 따라 섞어가며 사용하도록 합니다.
롱형 (long)
롱형은 64비트 정수 형입니다. 범위는 -2의63승 ~ 2의63승-1 로 과학적 표기법으로 1.8446744073709552E19 나 되는 큰 숫자 범위를 가집니다. int형을 넘는 숫자 리터럴을 사용하기 위해서는 숫자에게도 L을 붙여줘야 합니다.
예를 들어 int형 양수 최대치인 21억을 넘는다고 하면 아래와 같이 식별자인 L이나 l을 숫자의 끝에 붙여줍니다.
long myLong = 40000000000L;
64비트보다 큰 숫자를 사용할 필요가 있을 때는 기본 자료형이 아니라 별도의 클래스를 사용할 수 있습니다. 허나 속도적으로는 기본 자료형이 가장 빠르기 때문에 많이 쓰는 숫자는 이 안에서 최적화할 수 있도록 합니다.
64비트 정수는 상당히 큰 숫자를 표현할 수 있습니다. 컴퓨터의 초창기에는 8비트를 사용했기 때문에 숫자의 표현에 제약이 많았습니다. 16비트 32비트라고 해봤자 42억까지 표현할 정도였습니다. 이 정도 숫자는 일상에서 쓰는 숫자였죠.
컴퓨터의 구조도 64비트까지는 빠르게 발전했습니다. 32비트 구조에서는 4기가 밖에 인식을 못하는 메모리 문제도 있었기 때문입니다. 그런데 64비트부터는 매우 큰 숫자기 때문에 128비트 이상의 CPU가 일반에 보급되려면 조금 더 시간이 걸릴 것으로 예상됩니다.
요약
이번 포스팅에서 자바의 변수와 자료형에 대하여 알아봤습니다. 내용이 많기 때문에 변수의 개요와 정수 자료형까지 커버했습니다.
변수를 그냥 int myVariable 처럼 선언해서 사용할 수는 있습니다. 그러나 그렇게만 안다면 컴퓨터 내부에 대하여는 아무런 이해가 없는 상태입니다. 처음에 이해하지 못하면 뒤로 가서도 알 수 없습니다.
그러므로 자료형에 대하여 최소한의 기초지식이라도 쌓으며 학습을 하는 것이 좋습니다.
*컴퓨터의 자료형에 나오는 비트를 말할 때 조금 복잡한 개념을 담고 있습니다. 정확히는 CPU의 레지스터의 크기로 32비트, 64비트라고 말하는데 레지스터의 크기에 따라 할 수 있는 일이 달라지기 때문입니다.
*정수 자료형에 대하여 더 제대로 알고 싶다면 이진법과 2의 보수를 공부하면 됩니다.
외부참고문서
자바 튜토리얼 (2-1) 자바의 변수와 자료형 (정수형)