(Java) 자바의 정석 3판 001일차 - 컴퓨터 이론, 리터럴 & 변수 & 변수
컴퓨터는 왜 2진수를 사용할까?
10진법이 익숙한 이유는 손가락이 10개이기 때문이지 않을까?
에니악은 10진법 체계였지만 전기회로는 전압이 불안정해서 전압을 10단계로 나누어 처리하는데 한계가 있음
에드박은 단 두가지 단계, 전기가 흐르면 1, 전기가 흐르지 않으면 0만으로 동작하게 설계되었다
따라서 컴퓨터와 같은 전기회로는 2진 체계를 사용하게 되었다.
그렇다면 8진수와 16진수는 왜 생겼을까?
2진수는 숫자를 표현하기 위해 상당히 많은 자릿수를 차지한다.
코딩할 때도 이렇게 많은 자릿수는 가독성을 해칠 수 있다.
따라서 이런 단점을 보완하기 위해 8진수와 16진수가 등장했다.
그렇다면 왜 8진수와 16진수일까?
2진수 2자리로는 4진수를
2진수 3자리로는 8진수를
2진수 4자리로는 16진수를 표현할 수 있다.
2진수 2자리는 그닥 많은 자릿수를 절약할 수 없어서 사용을 안 하게 된 게 아닐까 싶다…
8진수를 사용하는 대표적인 예는 리눅스나 FTP 등에서 파일이나 폴더에 관한 권한을 표현하기 위해 많이 쓰인다.
777 을 예로 들면
r 읽기 허용(4) w 쓰기 허용(2) x 실행 허용(1) 을 다 더하면 7이 나오고
u 사용자(소유자) g 그룹 o 기타(사용자와 그룹을 제외한 사람) 순서로 기술하면 된다.
16진수를 사용하는 대표적인 예는 rgb 컬러 코드(#ff00ff), 유니코드(\u0061, U+0061, 0x0061 등등)에서 쓰인다.
boolean은 1bit가 아닌 왜 1byte일까?
Why is a boolean 1 byte and not 1 bit of size?
CPU가 메모리(RAM)의 주소(address)에 접근해야하는데
하나의 메모리 주소가 가지는 데이터의 크기는 1byte(8bit)이다.
따라서 CPU가 메모리 주소에 접근해서 사용할 수 있는 최소한의 단위는 1byte가 된다.
따라서 boolean은 1bit가 아니라 1byte가 된 것이다.
1byte는 왜 8bit일까?
아스키(Ascii)
메모리 하나당 차지하는 바이트 수에 대해 궁금한 점이 있습니다.
메모리 주소당 데이터용량이 1바이트인 이유가 먼가요??
1바이트는 왜 8비트일까?
과거에는 1byte가 7bit, 9bit 등등이던 시절이 있다고 하지만 현재는 8비트로 거의 표준이 된 것 같다.
이에 대한 이유로 내 나름대로 결론을 내린 것은 미국에서 컴퓨터를 개발했기 때문이라고 본다.
미국에서 문자를 사용하기 위한 코드로 ascii 코드(7bit)가 있는데
왜 7bit가 아닌 8bit가 1byte가 되었을까?
내 나름대로 추측을 해보자면
- 데이터 송수신의 오류를 검출하기 위한 패리티 비트로 1비트가 추가됐다.
- 유럽권을 고려해서 확장 아스키 코드를 베이스로 정했다.
정확히 뭔지는 모르겠으나 ascii 코드를 베이스로 1byte의 bit수가 정해진 것에는 틀림이 없는 것 같다.
리터럴, 변수, 상수
- 리터럴 - 짧게 얘기하면 변하지 않는 값
길게 얘기하면 우리는 변하지 않는 값을 일상생활에서는 상수라고 불렀다.
하지만 상수는 프로그래밍 세계에서는 좀 다른 뜻으로 불리기 때문에
그와 차별성을 부여하기 위해 리터럴이라고 붙였다.
“ch”, ‘c’, 123, 123.55 등등 모두 리터럴이다. - 변수 - 짧게 얘기하면 변하는 수
길게 얘기하면 단 하나의 값을 저장할 수 있는 메모리 상의 공간.
int num = 2;
int num;
까지만 하면 램(RAM, Random Access Memory)에서
사용 중이지 않은 주소 4개를 랜덤하게 접근해서 공간 확보만 함.
램은 여러 프로그램이 공유하는 자원이므로 이전에 다른 프로그램에 의해 저장된 값이 남아있을 수 있음.
그 다른 프로그램에 의해 저장된 알 수 없는 값을 쓰레기값(garbage value)이라고 함. - 상수 - 짧게 얘기하면 변하지 않는 수
길게 얘기하면 단 하나의 변하지 않는 값을 저장할 수 있는 메모리 상의 공간.
상수가 필요한 이유는 리터럴에 의미있는 이름을 붙여서 가독성을 높이기 위함이다.1
2
3
4
5
6
7
8
9
10
11
12
13
14// 상수를 사용하지 않음.
public class test {
public static void main(String[] args) {
int triangleArea = 20 * 10 / 2;
}
}
// 상수를 사용함.
public class test {
public static void main(String[] args) {
final int WIDTH = 20;
final int HEIGHT = 10;
int triangleArea = WIDTH * HEIGHT / 2;
}
}