thumbnail
자바의 정석 2장 학습 내용 정리
Java / Study
2023.09.08.

해당 글은 남궁성님의 저서 ‘자바의 정석 3판’을 공부하며 개인적으로 복습해야 하거나 중요한 내용이라고 생각하는 부분을 정리한 글 입니다. 해당 책에서 제가 기존에 알고있거나 별도의 기록이나 복습 없이 이해가 가능한 부분은 생략되어 있습니다.

변수의 타입

  • 리터럴의 타입과 접미사

    종류 리터럴 접미사
    논리형 false, true 없음
    정수형 123L, 0b0101 L
    실수형 3.14f, 3.0e8 f, d
    문자형 ‘A’, ‘1’ 없음
    문자열 “ABC”, “123” 없음
    public class Test {
    		public static void main(String[] args) {
    				float pi = 3.13f;
    				double rate = 1.618d;
    				long tmp = 100000L;
    
    				int octNum = 010;   // 8진수 10, 10진수로 8
    				int hexNum = 0x10;  // 16진수 10, 10진수로 16
    				int binNum = 0b10;  // 2진수 10, 10진수로 2
    		}
    }
    • Scanner는 느리니까 사용 지양 - BufferedReader 사용

진법

비트와 바이트

  • 1byte = 8bit
  • 1word = 4byte(x86 CPU), 8byte(AMD64 CPU)

8진법과 16진법

  • 제일 헷갈리는 거 - 16진수는 0 부터 F 까지

실수의 진법변환

  • 10진 소수점수를 2진 소수점수로 변환

    1. 10진 소수 x2

      0.625×2=1.250.625 \times 2 = 1.25

    2. 위의 결과에서 소수부만 가져다가 다시 x2

      0.25×2=0.50.25 \times 2 = 0.5

    3. 1과 2의 과정을 소수부가 0이 될 때까지 반복

      0.5×2=1.00.5 \times 2 = 1.0

    4. 위의 결과에서 정수부만 위에서 아래로 순서대로 적고 앞에 0. 붙이기

      0.101

    10진 소수를 10진 소수로 변환: 2대신 10을 곱하면 됨

  • 2진 소수점수를 10진 소수점수로 변환

    0.101(2)=1×21+0×22+1×23=0.5+0+0.125=0.6250.101_{(2)} = 1 \times 2^{-1} + 0 \times 2^{-2} + 1 \times 2^{-3} = 0.5 + 0 + 0.125 = 0.625

음수의 2진 표현 - 2의 보수법

  • 2의 보수법을 이용한 음수의 2진 표현

    2진수 부호있는 10진수
    0000 0
    0001 1
    0010 2
    0011 3
    0100 4
    0101 5
    0110 6
    0111 7
    1000 -8
    1001 -7
    1010 -6
    1011 -5
    1100 -4
    1101 -3
    1110 -2
    1111 -1
  • 2의 보수법

    • 어떤 수의 n의 보수는 더했을 때 n이 되는 수
      • 3과 7은 10의 보수의 관계

      • 2의 보수 관계 → 더했을 때 2가 되는 수의 관계 → 2진수로 10은 자리올림이 발생하고 0이 되는 수

        → ‘2의 보수 관계’에 있는 두 2진수를 더하면 (자리올림이 발생하고) 0이 된다.

    • 2의 보수를 구하는 방법
      • 2의 보수 = 1의 보수 + 1

기본형 (Primitive Type)

실수형의 범위와 정밀도

타입 저장 가능한 값의 범위(양수) 정밀도 크기
float 1.4×1045 3.4×10381.4 \times 10^{-45} ~ 3.4 \times 10^{38} 7자리 32bit / 4byte
double 4.9×10324 1.8×103084.9 \times 10^{-324} ~ 1.8 \times 10^{308} 15자리 64bit / 8byte
  • 크기가 4byte인 정수형 int는 ±2×109\pm 2 \times 10^{9}밖에 저장 못함, 하지만 크기가 동일한 실수형 float는 ±3.4×1038\pm 3.4 \times 10^{38}과 같이 큰 수 표현 가능

    Why? 값을 저장하는 형식의 차이

    expression [그림1] int타입과 float타입의 표현방식


    실수형 float는 2의 제곱을 곱한 형태(±M×2E\pm M \times 2^{E})로 저장 → 큰 범위의 값 저장 가능

  • 정수형과 달리 실수형은 오차가 발생할 수 있음 → 표현할 수 있는 값의 범위 + 정밀도 고려해야 함

실수형의 저장형식

expression [그림2] float와 double의 표현방식


기호 의미 설명
S 부호 (Sign bit) 0이면 양수, 1이면 음수
E 지수 (Exponent) 부호있는 정수, 지수의 범위는 -127 ~ 128 (float), -1023 ~ 1024 (double)
M 가수 (Mantissa) 실제값을 저장하는 부분 10진수로 7자리(float), 15자리(double)의 정밀도로 저장 가능

부동소수점의 오차

  • 2진수로는 10진 소수를 정확히 표현하기 어렵기 때문에 10진 유한소수가 2진수로 변환하면 무한소수가 될 수도 있다.

    ex) 9.1234567(10)1001.000111111001101011011011...(2)9.1234567_{(10)} \rightarrow 1001.000111111001101011011011..._{(2)}

  • 정규화: 2진수로 변환된 실수를 저장할 때 1.xxx×2n1. \mathsf{xxx} \times 2^{n}의 형태로 변환하는 과정

    ex) 1001.000111111001101011001111...1.001000111111001101011011011...×231001.000111111001101011001111... \rightarrow 1.001000111111001101011011011... \times 2^{3}

    • ‘1.’을 제외한 23자리의 2진수가 mantissa에 저장
    • 지수는 기저법으로 저장 → 지수인 3에 127을 더한 130이 2진수로 변환되어 exponent에 저장됨
  • 정규화 과정에서 잘려나간 값 들에 의해 발생할 수 있는 최대오차는 약 2232^{-23}, 이 값은 mantissa의 마지막 비트의 단위와 같다.

    2232^{-23}은 10진수로 0.0000001192(약 10710^{-7}) → float의 정밀도는 7자리


형변환

실수형 간의 형변환

  • float형과 double형은 정밀도가 다르므로 같은 값을 저장하더라도 출력 결과는 다를 수 있다.
  • 또한 float를 double로 캐스팅해도 기존에 float에 값을 저장할 때 값이 버려졌기 때문에 값이 변하지는 않는다.

정수형과 실수형 간의 형변환

  • 정수형 → 실수형
    • 실수형은 정수형보다 저장범위가 크기 때문에 아래 한 가지를 제외하고는 고려할 부분 없음

      int의 최대값은 약 20억 → 최대 10자리의 정밀도를 요구 → float의 정밀도는 약7자리

    • 결론. 10진수로 8자리 이상의 값을 실수형으로 변환할 때는 float대신 double사용

      이지만… 하드웨어 성능의 비약적인 증가했으므로 웬만해서는 float 대신 double을 사용하자

    • 위와 같이 생각한 이유?

      애초에 자바는 제한된 자원을 가진 임베디드 시스템이 아닌 서버에서 동작하는 애플리케이션을 만드는 경우가 대부분이기 때문이다. 물론, 요구사항에 해당 부분 관련해서 제약이 있다면 거기 맞춰서 개발해야겠지만…

  • 실수형 → 정수형
    • 실수형의 소수점이하 값은 버려진다.

Reference

Thank You for Visiting My Blog, I hope you have a nice Day!
© 2023 Developer Yeong Ryeol Kim, Powered By Gatsby.