December 26, 2020
소설같은 자바
를 읽으면서 새삼 새로웠던 부분이 데이터 타입과 관련된 부분이다.
파이썬 같은 동적 타입 언어 이외의 언어는 많이 다뤄보질 않아서 더욱이 생각해보지 못했던 질문인데, 그것은 바로 왜! 변수 앞에 자료형을 명시하느냐! 하는 것이다. 그냥 이 변수가 어떤 자료형인지 알려주기 위해서? 정도로 생각했는데 더욱 중요한 이유가 있었다.
간단히 말하면 데이터 타입은 메모리를 생성하기 위한 도구
이며 자바에서 메모리를 생성하는 방법은 오로지 데이터 타입을 이용하는 것밖에 없다(왜 “자바에서”라는 말이 들어가는지는 모르겠는데 책에 그렇게 적혀있다;;).
만약 프로그래밍을 하는데 4 바이트의 메모리를 얻어내는 일이 매우 빈번하게 일어난다면 4 바이트의 메모리를 얻는 일반적인 방법이 필요할 것이다. 이를 위해 메모리의 크기를 컴파일러가 미리 지정해둔 것이 데이터 타입이다.
int a;
여기서 int는 4 바이트의 크기를 의미한다. a는 int로 생성한 메모리 공간의 주소를 연결해주는 이름, 곧 변수명이다.
어셈블리에서 C로 발전하면서 달라진 것은 다양한 데이터 타입과 함수의 편리한 사용이다.
C에서 C++ 계 언어로 발전하면서 데이터 타입은 클래스로 발전하게 된다. 그 이유를 이해하는 것이 C++ 계 언어를 이해하는 것의 핵심이다.
일반적으로 많이 사용하는 데이터 타입은 컴파일러 차원에서 미리 제공한다. 이러한 데이터 타입을 원시 자료형(primitive data type)이라고 한다. 자바에는 8가지 원시 자료형이 있다. (괄호 안은 바이트 크기)
byte(1)
, short(2)
, int(4)
, long(8)
, float(4)
, double(8)
, char(2)
, boolean(1)
데이터 타입이 메모리의 크기를 의미한다면, int(4)
와 float(4)
는 메모리의 크기가 같은데 왜 다른 데이터 타입으로 표현할까?
그 이유는 데이터 타입은 메모리의 크기를 지정함과 동시에 메모리의 형태를 지정하기 때문이다.
정수형 자료형과 실수형 자료형은 메모리에 적재될 때 전혀 다른 형태로 적재된다. 이때 메모리의 형태란 비트의 조합을 의미한다. (실수를 메모리에 어떻게 저장하는지는 추후에 다시 정리)
즉 데이터 타입의 최종적인 정의는 메모리의 크기와 메모리의 형태를 지정하기 위한 도구이다.
메모리의 크기와 형태를 얻어왔다면, 이 메모리를 어떻게 사용할 수 있을까? 기본적으로 메모리의 주소를 이용하는 방법을 떠올릴 수 있을 것이다. 하지만 프로그래머가 메모리의 주소를 모두 기억하고 사용할 수 없기 때문에 메모리 주소에 매핑되는 심볼을 이용하여 메모리를 조작한다. 이 심볼이 변수이다.
int a; // 정수형의 메모리 4 바이트를 생성하고 이를 a라는 변수에 연결
a = 5; // a를 이용하여 메모리에 값 삽입
자료형이 발전한 것이 구조체이고, 구조체가 발전한 것이 클래스이다. 자바는 클래스로 시작해서 클래스로 끝나는 언어이다. 따라서 자바를 완벽하게 이해하기 위해서는 자료형부터 완벽하게 이해해야 한다.