(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. 데이터 송수신의 오류를 검출하기 위한 패리티 비트로 1비트가 추가됐다.
  2. 유럽권을 고려해서 확장 아스키 코드를 베이스로 정했다.

정확히 뭔지는 모르겠으나 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;
    }
    }