ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바의 정석 Chapter 2 - 기본형(primitive type)
    IT 공부 독서 정리/Java의 정석 2025. 7. 20. 14:36

    현재까지 자바에서 사용하는 변수의 형태에 대해서 간략적인 내용을 다루었다.

    변수의 어떤 형식들이 존재하고 어떻게 사용되는가에 대한 간략적인 내용이었다.

     

    다만, 자바 개발을 위해서는 이러한 기본형 변수에 대해서 자세한 내용들을 알고 있어야 한다.

    그 자세한 내용을 설명하는 파트가 기본형이라는 파트이다.

     

    이번 Chapter 2의 4장에서 다루는 내용에 대해서 정리하고자 한다.

     

    우선 각 형식에 대한 이름/정의/사용범위/크기에 대한 표이다.

    이름 정의 사용범위 크기
    boolean true 또는 false  하나의 값을 가지는 
    논리형 데이터
    ture / false 1byte
    char 하나의 유니코드 문자(2바이트)
    저장하는 문자형
    \u0000 (0) ~ \uffff (65,535) 2byte
    byte 정수 표현에 사용되는
    1바이트 정수형
    -128 ~ 127 1byte
    short 정수 표현에 사용되는
    2
    바이트 정수형
    -32,768 ~ 32,767 2byte
    int 가장 일반적인 정수형
    4바이트 정수형
    -2,147,483,648 ~ 2,147,483,647 4byte
    long 매우 큰 범위의 정수를 표현하는
    8바이트 정수형
    -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 8byte
    float 단정밀도 부동소수점 수를
    표현하는 실수형
    ±1.4E-45 ~ ±3.4028235E+38 4byte
    double 배정밀도 부동소수점 수를
    표현하는 실수형
    ±4.9E-324 ~ ±1.7976931348623157E+308 8byte

     

    4.1 논리형

    • 논리형을 표현하는 방식은 1가지만 가능하다.
    • true/false 중 하나의 값을 가지는 논리형 데이터이다.
    • 대답 (yes/no), 스위치(on/off)등 두 가지의 값으로 표현 가능한 것들에 대해서만 사용 가능하다.
    • 논리형의 데이터는 1bit로 표현이 가능하나, 자바의 기본 크기가 1byte이기 때문에 1byte 크기를 가진다.
    • 아래 코드는 boolean에 대한 선언에 대한 코드이다.
    boolean power = true;
    boolean cheked = False; // 에러. 대소문자 구분됨, true 또는 false만 가능

    4.2 문자형 - char

    • 문자형을 표현하는 방식도 1가지만 가능하다.
    • 문자 1글자의 값을 가지는 문자형 데이터이다.
    • 아래 코드는 char를 선언하고, 문자 'A'로 초기화한다.
    char ch = 'A'; // 문자 'A'를 char타입의 변수 ch에 저장

     

    • 위 코드를 보면 'A'값을 저장한 것으로 보인다.
    • 컴퓨터는 계산기로써, 숫자만을 표현하기에 문자를 숫자로 표현할 수 있는 유니코드라는 체계를 통해 저장한다.
    • 유니코드란, 특정 문자에 대해서 약속된 값을 의미한다.
    • 'A'의 경우 유니코드로 약속된 값은 65에 해당한다.
    • 따라서, 실제로 char ch에 저장된 값은 65이다.

    문자 A가 저장되는 과정

    • 아래는 문자를 저장하고 그에 해당하는 유니코드 값을 확인하는 코드이다.
    package org.example.ch2;
    
    import java.awt.*;
    
    public class CharToCode {
        public void CharToCode() {
            char ch = 'A';
            int code = (int) ch;
            System.out.printf("%c=%d(%#X)%n", ch, code, code);
            char hch = '가';
            System.out.printf("%c=%d(%#X)%n", hch, (int)hch, (int)hch);
        }
    }
    
    /* 결과
            A=65(0X41)
            가=44032(0XAC00)
    */

     

    • 문자들 중에는 한글 영어뿐 아니라 특수문자들도 존재한다.
    • 해당 특수문자들은 어떻게 저장하고 사용되는가에 대해서도 설명을 해주고 있다.
    • tab이나 backspace 등의 특수문자 표현방식은 아래와 같다.
    특수문자 문자 리터럴
    tab \t
    backspace \b
    form feed \f
    new line \n
    carriage return \r
    역슬래쉬 (\) \\
    작은다옴표 \'
    큰따옴표 \"
    유니코드(16진수)문자 \u 유니코드 (예 : char a = '\u0041')

     

    package org.example.ch2;
    
    public class SpecialCharEx {
        public void SpecialCharEx() {
            System.out.println('\'');		// '''처럼 할 수 없다.
            System.out.println("abc\t123\t456");	// \b에 의해 3이 지워진다.
            System.out.println('\n');		// 개행(new line)문자 출력하고 개행
            System.out.println("\"Hello\"");	// 큰따옴표를 출력하려면 이렇게 한다.
            System.out.println("c:\\");
        }
    }

    | 참고 | 한글 윈도에서는 역슬래쉬(back slash)가 '\' 대신 '₩'로 표시된다.

     

    • char타입의 크기는 2byte이므로, 16bit로 표현가능한 개수인 65536개의 코드를 사용한다.
    • 따라서, 'A'를 저장하면 실제로 저장되는 값을 아래처럼 저장된다.

    16비터 'A' 를 표로 그려보면 이미지와 같다.

    • 위에서 설명했지만, char값은 유니코드(정수)로 저장되기에, 표현형식도 정수형과 동일하다.
    • 다만, 문자형은 음수가 없기에 표현 범위는 0~65536이 된다.

    short와 char 범위 차이

    System.out.println(ch); // A가출력된다. 
    System.out.println(s); // 65가출력된다.

    다음과 같이 short와 char에 'A'와 65를 저장하면 동일하게 65로 저장된다.

     

    그러나 출력값은 위와 같이 다르게 출력된다.

    따라서, 동일한 값이 저장되었다고 해도, 어떤 변수냐에 따라서 출력되는 결과는 다르게 나올 수 있다.

    이 때문에 값을 어떻게 해석하느냐는 변수 타입을 확인하지 않으면 불가능하다.

    4.2.1 인코딩과 디코딩(encoding & deconding)

    컴퓨터는 숫자로만 표현되기에, 문자형 데이터를 특정 숫자로 대칭되는 구조를 구현해야 한다.

    이런 대칭 구조를 구현하기 위해 만든 기준을 유니코드라고 한다.

    즉, 각 문자(데이터)에 대해서 해당 문자에 해당하는 코드값을 부여한 것이다.

    따라서, 기계 내부적으로 문자↔숫자의 변환 과정을 인코딩과 디코딩이라고 부른다.

     

    인코딩 : 문자('A') -> 유니코드(65)
    디코딩 : 유니코드(65) -> 문자('A')

    4.2.2 아스키 (ASCII)

    • American Standard Code for Information Interchange (정보교환을 위한 미국 표준 코드)
    • 아스키코드는 영문자만 표현하기 위해 만든 코드이다.
    • 따라서, 128개의 문자 집합을 제공하는 7 bit 부호로 된 코드를 사용한다.
    • 처음 32개의 문자는 제어문자(탭, 개행 등등)로 구성되어 있다.
    • 그 이후, 0~9, 'a~z', 'A~Z'로 구성되어 있다.

    4.2.3 확장 아스키 (Extended ASCII)와 한글

    • 일반적인 데이터는 byte단위로 다뤄지는데, ASCIIsms 7bit로 1bit가 남는다.
    • 이 남은 1bit를 활용해서 문자를 추가로 정의한 것을 확장 ASCII라고 한다.
    • 다만 이 1bit를 어떻게 사용할 것인가는 여러 국가 및 기업에서 서로 필요에 따라 다르게 사용한다.
    • ISO에서 몇 가지 표준을 발표하기도 하고, 여러 기업에서 자기들에 맞게 사용도 한다.
      • iso 8859-1 / ISO Latin 1 등 여러 약속 존재

    4.2.4 코드페이지(code page, cp)

    • IBM이 자사의 PC에 '확장 아스키'를 도입할 때, 지역 및 국가에 따라 다른 버전이 필요했다.
    • IBM은 이런 국가 및 지역에 따른 확장아스키를 코드페이지라고 정의했다.
    • 'CP xxx'의 형식으로 사용하였고, MS와 같은 업체와 협력하여 코드페이지를 만들고 공유했다.
    • 한글 윈도는 'CP 949'로 인코딩 되어 저장된다.

    4.2.5 유니코드(UniCode)

    • 예전에는 같은 지역 내에서만 문서 교환이 주를 이루었다.
    • 인터넷 발달로 서로 다른 지역 및 다른 국가들과 문서교환이 활발해졌다.
    • 지역별 문자 자체 인코딩을 사용하고 있는 문제로, 인코딩/디코딩 변환을 늘 해야 했다.
    • 불필요한 인/디코딩을 줄이고자 통일된 문자 집합에 대한 필요성이 두드러졌다.
    • 그렇게 만들어진 코드가 유니코드이다. 
    • 기존엔 2byte(65536)로 표현하려고 진행을 하였다.
    • 그러나 실제 문자의 개수는 그 이상이었고, 그로 인해 21bit 체계를 구축하게 되었다.
      • 대략 200만 문자
    • UTF-8, UTF-16, UTF-32 등 여러 가지 종류가 있으며, 자바는 기본적으로 UTF-16이다.
    • 그러나 이 유니코드 형식을 어떤 것을 쓰느냐에 따라 문서의 크기가 결정된다.
    • 따라서, 메모리 효율을 위해 개발하는 프로젝트에 특성에 따라 맞춤형 코드를 사용한다.

    4.2.6 정수형 - byte, short, int, long

    • 정수형에는 모두 4개의 자료형이 있다.
    • 각 자료형이 저장할 수 있는 값의 범위가 각각 다르다.
    • 이렇게 다양한 정수형 타입이 존재하는 이유는 바로 가장 많이 쓰이는 형식이기 때문이다.
    • 아래 가장 기본 자료형은 int이다.

    정수형의 타입별 크기

    • 정수형은 부호가 있는 정수이므로 한 개의 비트는 부호비트로 사용한다.
    • 그리고 나머지 7비트로 숫자를 표현한다.
    • 아래는 그에 따른 값이 표현할 수 있는 개수이다.

    정수형 표현 방식의 값의 개수

    정수형의 표현형식

    • n 비트로 표현할 수 있는 정수의 개수 : 개(=개)
    • n 비트로 표현할 수 있는 부호 있는 정수의 범위 :  ~ 

    정수형 선택

    • byte/short보다는 int 사용, 그보다 큰 범위는 long
    • 자바의 경우 JVM의 피연산자 스택을 
    • JVM의 피연산자 스택을 사용한다.
      • 피연산자 스택이란, 값을 임시로 저장하는 공간을 의미한다
    • 보통 JVM은 기본값이 4Byte 체계로 되어 있다.
    • 그보다 작은 shor나 byte의 자료형을 사용해도 스택 공간은 4byte 단위로 사용된다.
    • 이런 변환과정이 1번 더 진행되어 int형에 비해 속도적인 차이가 발생한다.
    • 그래서, 보편적으로 int형을 기본으로 사용하는 것이 일반적이다.

    이후 정수형에 대한 표현 가능한 값의 범위를 다시 표로 보여주지만, 위에 해당 표를 작성하기에 생략함.

    4.2.7 정수형 선택 기준

    • 정수값의 범위에 따라 4개를 선택해서 사용하면 되겠지만, 되도록 int를 사용하자.
    • byte와 short의 경우 메모리 절약면에서는 좋지만, 오류 가능성이 높다는 단점이 있다.
    • 또한 속도면에서 불리한 점은 위에서 설명하였다.
    • 따라서, 4byte가 기본 크기인 int를 사용하는 것이 유리하다.
    • 결론적으로 -2147483648 ~ 2147483647 사이의 값은 int로 사용한다.
    • 그 범위가 넘어가는 경우가 발생하면 long를 사용하면 된다.

    4.2.8 정수형의 오버플로우

    • 정수형의 오버플로우란 원래 표현할 수 있는 범위를 넘어간 값이 해당 변수형에 저장된 것을 말한다.
    • 이때 발생하는 것은 최댓값을 넘어서면 최솟값으로 변환된다.
    • 그리고 최솟값보다 작아지면 최댓값으로 변환된다.

    오버 플로우에 대한 이미지 설명

    • 부호 있는 정수의 오버플로우
    • 부호 없는 정수와 부호 있는 정수의 오버플로우 시점은 다르다.
    • 최솟값 자체가 다르기 때문이다.
    • 부호 없는 정수는 0000이 될 때 발생하고, 부호 있는 정수는 부호비트가 변할 때 발생한다.

     

    이후 좀 더 자세하게 설명하고 있지만, 이 부분은 생략하고자 한다.

     

    4.2.9 실수형 - float, double

    • 실수를 표현하기 위한 타입으로 float와 double형 2가지가 존재한다.
    • 이 두 가지는 표현 가능한 범위에 따라 달라지며, 그 범위는 아래와 같다.
    타입 범위 정밀도 크기
    float  ~  ,  ~  7자리 32bit 4byte
    double  ~  ,  ~  15자리 65bit 8byte
    • double형은 정밀한 수치를 표현할 때 사용하고, float는 메모리 절약을 위해 보통 사용한다고 한다.

    4.2.10 언더플로우 & 오버플로우

    • 오버플로우 : 무한대가 됨
    • 언더플로우 : 0 (실수형으로 표현할 수 없는 아주 작은 값)

    4.2.11 값 저장 형식

    ☑️ 정수형

    S(1)  값(31bit)

     

    S : 부호

    ☑️ 실수형 : 부동소수점

    =$ \pm M \times 2^E $

    S(1) E(8) M(23)
    • S(부호) : 0(양수), 1(음수)
    • E(지수) : 부호있는 정수
      -127~128(float), -1023~1024(double)
      • -127, 128 : 숫자 아님(NaN), 양의 무한대, 음의 무한대
    • M(가수) : 실제값 저장
      • float : 2진수 23자리 == 10진수 7자리(float의 정밀도)
      • double : 2진수 52자리 (= float의 약 2배 높은 정밀도)
    • ex) 9.1234567
       = 
       = 
    • (1) 정규화 : 1.xxx  형태로 변환
      1001.000111111001101011011... -> 1.001000111111001101011011 
      (2) 지수 : 기저법(지수에 기저인 127을 더하여 2진수로 변환하여 저장)
      3+127 = 130 = 

    부동소수점의 오차

    1. 10진수로는 유한소수이지만 2진수로는 무한소수인 경우
      (ex. 9.1234567 = 1101.000111111001101011011... )
    1. 가수를 저장할 수 있는 자리수가 한정되어 있음(잘리는 부분이 생김)

      -> 최대 오차 : 약  (=가수의 마지막 비트의 단위)

      -> float의 정밀도가 7자리(=소수점이하 6자리)

    cf. 가수부분 저장시 잘려나가는 데이터가 있는 경우 반올림해서 저장됨

     


     

    솔직하게 이야기 하면.. 값저장방식에 대해 나오는 수식과 부동소수점에 대한 내용에 대해서는 머리로는 대충 이해를 했지만,

    실질적으로 내가 제대로 알고 이해했는가는 말 모르겠다. ㅎㅎ

    음.. 인강을 들어보니 뭔 말인지 알겠네.. 근데.. 이런 문제를 주면 못풀겠네??

    정도의 이해도가 현재의 이해도라고 이야기 하고 싶다.

     

    다만 속으로 코딩하는데 큰 문제는 없으니 뭐.. 라는 생각을 하고 있는 ㅋㅋ

     

     

    이것으로 이번 장의 책 정리를 마무리 하고자 한다.

     

     

Designed by Tistory.