본문 바로가기
JAVA

생각해보게 되는 bit, Byte, int, long 등의 이야기

by 지금갑시다 2024. 2. 17.

 

JAVA는 C++와 같이 변수에 타입을 명시해 주어야 한다. (파이썬의 경우 예외)

 

가벼운 개발을 하게되면, 타입 명시를 하지 않는 것이 더 편한데 왜 타입 명시를 하지 않아도 되는 언어가 보편적으로 쓰이지 않을까?

 

 

이를 위해 타입 명시 언어의 장점을 살펴보자!

1. 타입을 명시해줌으로써 컴파일 타임에 예기치 못한 오류를 잡을 수 있는 큰 장점이 있고,

2. 타입의 활용을 통해 메모리의 사용 최적화 역시 가능해 진다.

 

 

1의 경우 코딩을 하다가 빨간색 줄로 그어지며 잘못된 타입을 넣고 있다~ 라는 경고메시지가 이것이고

2의 경우는 조금 더 살펴보자!

 

메모리 최적화를 한다는 의미는 뭘까?

이는 곧 적은 메모리를 사용해서 프로그램을 작성한다. 라는 말과 동의어로 쓰이는 것 같다. 

추가로 자주 사용되는 컴포넌트 및 데이터들은 재사용성이 있게 작성한다. 로도 통용되는 것 같다.

 

최근 유튜브에서 보았던 예시를 빌려오면, 첫 슈퍼마리오의 팩 총 용량이 20KB였다며

"여러 레벨의 여러 스텝이 있는 게임이 어떻게 그 용량만으로 커버가 가능했나?" 라고 놀라는 의미와도 동일해 보인다.

 

 

각설하고, 타입은 왜 쓰이나?

먼저 컴퓨터가 코드를 이해하는 방식을 생각해보면 된다.

 

컴퓨터는 아주 단순하게 0과 1만으로 이뤄진 아주 긴 숫자를 빠른 연산을 통해 결과를 내는 기계이다. 

이 과정에서 반도체와 이를 구성하는 회로의 개입이 있는 것이다.

 

이는 곧 우리가 인텔리제이 혹은 VSCode로 작성한 텍스트가 0과 1로 변환이 되어야 한다는 것을 의미한다.

 

이 글에서는 0과 1로 변환되는 과정에 집중하기 보다는

자바에서 int a = 1; 물리적으로는 어떻게 저장되나?에 집중해보자

배경 지식으로는 코드를 실행하면 메모리에 그 코드의 실행 내용이 적재됨을 알고 있으면 된다

 

 

0 혹은 1을 나타내는 것은 컴퓨터의 단위에서 1bit라고 표현한다.

 

예시를 1인 값으로 가정하자

그럼 1은

1 이라고 표현될 것이다.

 

1bit가 8개 모이면 1Byte라고 표현한다.

1을 표현해보면

00000001 이렇게 표현된다.

 

자바에서는 int 가 4Byte를 차지하는데

이 역시 1을 표현하자면,

00000000 00000000 00000000 00000001 이렇게 표현될 것이다.

 

long 타입도 있으니 long도 보자, long은  8Byte이다.

즉, 1을 표현하면

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001

 

이제 뭔가 위에서 말한 메모리의 최적화라는 표현이 와닿을 만하다.

실질적으로 작은 값을 다루는데에는 long의 타입으로 선언해둔다면 메모리의 소모가 생각보다 클 것이기에 좋은 선택은 아니라는 것이다.

 

 

위의 내용을 정리해보면,

int a = 1;

이라는 코드는 메모리 상에서 4Byte의 크기를 차지하고 있고, 이는 곧 32bit와 동일하다 는 것이다.

long a = 1;

이라는 코드는 메모리 상에 8Byte의 크기를 갖고, 이는 곧 64bit와 동일하다.

 

 

이러한 내용을 기술하면 자동으로 따라오는 고려사항이 있다.

int와 long의 표현 가능 범위는 어떻게 되는가?

 

int는 32비트이기에, 2^32 의 숫자를 표현할 수 있다. 43억개 정도의 숫자이다.

그러면 +43억까지 표현할 수 있나? 그건 아니다.

 

숫자는 음수가 존재하기에, 절반씩 나누고 0도 포함해야 함으로 실제로는

"-2^31 ~ +2^31 - 1" 이 그 범위가 된다.

양수 부분에 -1 이 붙은 이유는 컴퓨터 계산법인 2의 보수법을 간단하게 표현하기 위함이기도 하고,

동시에 0을 양수로 생각하면 절반이 나누어 떨어진다고 생각할 수도 있다.

 

long은? 64비트니까

"-2^63 ~ +2^63 - 1" 이 그 범위가 될 것이다. 너무 커서 몇개인지 세기 어렵다.

 

 

결국 이러한 타입의 유용성이 있어 타입 명시 언어가

코드의 퍼포먼스에도 영향을 미치고 실행 속도에도 큰 영향을 미칠 수 있어

JAVA, C++과 같은 타입 명시 언어의 유용성이 Python, javascript와 같은 언어와 차이가 날 수 있는 것이다.

 

 

이처럼 기본적으로 내가 지정한 타입들에 대해서 물리적으로는 어떻게 돌아가는지 생각하며 개발에 접근하면

조금 더 큰 생각으로 나아갈 수 있을 것이라 생각한다 ㅎ (내가 그랬으면 좋겠다는 거다!!)

 

끘!

'JAVA' 카테고리의 다른 글

[JAVA] equals 와 == 의 차이(근데 좀 재밌게..)  (1) 2024.02.10