[윤성우의 열혈 Java 프로그래밍] Chapter 02 - 변수와 자료형

Update:     Updated:

카테고리:

태그:

02-1. 변수의 이해와 활용

- 메모리 공간의 활용을 위해 필요한 변수

데이터의 저장과 참조를 위해 ‘할당된 메모리 공간’에 붙인 이름을 ‘변수’라 한다.

그렇다면 메모리 공간을 어떻게 할당받아야 할까?
할당받은 메모리 공간은 어떻게 사용할까? 즉, 어떻게 접근해야 할까?

두 질문에 대한 답은 ‘변수’ 하나로 정리된다.

- 변수(Variable)는 메모리 공간에 붙여진 이름

그렇다면 메모리 공간을 어떻게 할당받아야 할까? -> 코드상에서 변수라는 것을 선언하면 된다.
할당받은 메모리 공간은 어떻게 사용할까? 즉, 어떻게 접근해야 할까? -> 변수의 이름을 통해서 메모리 공간에 접근할 수 있다.

class UseVariable{
    public static void main(String[] args){
        int num1;
        num1 = 10;  // 변수 선언 == 메모리 공간 할당받음

        int num2 = 20;
        int num3 = num1 + num2; // 변수의 이름으로 메모리 공간에 접근

        System.out.println(num1 + " + "+ num2 +" = " + num3);
    }
}

- 자료형의 종류와 구분

키워드: 자바 문법을 구성하는 식별자
자료형: 변수에 저장할 데이터의 유형을 알리기 위한 키워드

image
위의 표에서 정리한 자료형을 가리켜 ‘기본 자료형(Primitive Data Type)’이라고 한다.

- 변수의 이름을 짓는 방법

변수의 이름을 짓는데에는 몇몇 제약 사항들이 존재한다.

  1. 변수의 이름은 숫자로 시작할 수 없다.
  2. $과 _ 이외의 다른 특수문자는 변수의 이름에 사용할 수 없다.
  3. 키워드는 변수의 이름으로 사용할 수 없다.

02-2. 정수의 표현 방식 이해하기

- 컴퓨터가 정수를 표현하는 방식

먼저, 몇 바이트로 정수를 표현할 것인가 를 결정해야한다.
다음의 예시는 1바이트를 기준으로 정수의 표현 방식을 설명한다.

image
가장 왼쪽에 위치한 비트는 부호를 나타낸다.
이렇게 부호를 결정짓는 가장 왼쪽에 위치한 비트를 가리켜 MSB(Most Significant Bit)라 한다.
이 비트가 0이면 양수를, 1이면 음수를 의미한다.
나머지 일곱 비트는 데이터의 양적인 크기를 의미한다.

- 음의 정수를 표현하는 방식이 이게 맞아?

그렇다면, 단순히 MSB 비트를 1로 바꾸면 음수를 만들 수 있는 것 아닌가? 한 번 확인해보자.
image

연산을 해보니 0이 나오질 않는다. 그렇다면 음수의 표현은 어떻게 할까?

양의 정수의 이진수 표현에 2의 보수를 취한 결과를 음의 정수로 표현한다.

- 2의 보수를 구하는 방법

image

  1. 1의 보수를 구하고(각 비트 별로 1은 0으로, 0은 1로 변경하여 얻는다.),
  2. 1을 더한다.

image
컴퓨터는 n바이트 덧셈 연산을 할 경우 그 결과도 n바이트로 만들어낸다.
따라서 올림 수(Carry) 보정을 하지 않으면 덧셈 과정에서 발생하는 올림 수는 그냥 버려진다.

02-3. 실수의 표현 방식 이해하기

- 실수의 표현 방식은 고민거리였습니다.

1과 2 사이에 존재하는 실수의 개수는 몇 개인가?

이처럼 소수점 이하 자릿수까지 표현해야 하는 실수를 컴퓨터로 표현하는 데는 한계가 있다.

- 그래서 정밀도를 낮추고 근사치의 값을 찾아서 표현하기로 결정하였습니다.

오차를 혀용하지 않으면서 그 광대한 실수를 표현하는 것은 불가능하다.
따라서 다음과 같은 결론에 도달하게 된다.

정밀도를 낮추고 대신에 표현할 수 있는 값의 범위를 넓히자.

image

02-4. 자바의 기본 자료형

- 정수 자료형: byte, short, int, long

이 자료형으로 할당된 메모리 공간에는 ‘정수’의 표현 방식을 기준으로 값을 저장 및 참조하게 된다.
네 자료형이 같는 차이점은 정수의 표현에 사용되는 메모리 공간의 크기에 있다.

- short형 변수를 선언할까요? int형 변수를 선언할까요?

효율적인 메모리의 관리를 위해 적은 바이트로 선언할 수 있다면 short형 변수를 선언하는 것이 좋지 않을까..?

다음 코드를 보면 컴파일 오류가 발생하는 것을 알 수 있다.

public class OperatePromotion {
    public static void main(String[] args) {
        short num1 = 11;
        short num2 = 22;
        
        short result = num1 + num2; // 컴파일 오류 발생

        System.out.println(result);
    }
}

자바는 정수형 연산을 int형으로 진행한다.

연산 수행 시 byte형 변수나 short형 변수에 저장된 값을 먼저 int형 값으로 변경해 버린다.
result는 short형 변수인데, 연산이 진행된 결과는 int형이므로 에러가 난다.

정리하면, 연산을 동반하는 상황에서는 변수를 byte, short로 선언해도 생각만큼 메모리가 절약되지 않고
오히려 데이터의 변환 과정만 추가될 뿐이니, 이때는 int로 선언하자. (참고) long형에서 int형으로의 변환은 일어나지 않는다. 8바이트를 4바이트로 변환하면 데이터 손실이 발행하기 때문이다.

Q) 그렇다면 byte나 short형은 불필요한가?
A) 아니다.
프로그램상에서 표현하는 데이터 중에는 잦은 연산이 필요한 데이터도 있지만 그렇지 않은 경우도 있다.
예를 들면 게임의 지형, 캐릭터 등을 그리기 위한 그래픽 정보나 음원 정보 등이 있다.
이러한 경우에는 int형보다 작은 byte형 또는 short형으로 데이터를 저장하는 것이 의미가 있다.

- 실수 자료형: float, double

이들은 모두 정밀도를 포기하고 표현의 범위를 넓힌 자료형 들이기 때문에 float와 double의 선택 기준은 ‘값의 표현 범위’에 있지 않다.
그렇다면 float과 double의 선택 기준은 어디에 있을까?

답은 정밀도이다. 실수의 표현에 사용되는 바이트 수가 크면 오차의 크기는 작아진다.

실제로 float은 6자리의 정밀도를 갖고, double은 15자리의 정밀도를 갖는다.
다시 말해 float는 소수점 이하 6자리까지는 오차가 발생하지 않고 double은 소수점 이하 15자리까지 오차가 발생하지 않는다.

(참고)
double형 데이터 하나만 놓고 보면 소수점 이하 15자리까지는 오차가 발생하지 않는다.
하지만 그 이하부터는 오차가 발생하기 때문에, 오차가 존재하는 double형 데이터 둘 이상을 더하다 보면, 소수점 이하 셋째 자리에서 오차가 발견될 수도 있다.
따라서 실수의 계산은 기본적으로 오차가 존재한다고 가정해야 한다.

- 문자 자료형: char

수를 인식하고 표현하는 장치인 하드웨어에서 문자를 어떻게 표현해야할까?

문자 하나하나에 숫자를 부여하는 방식으로 표현한다.

이러한 ‘문자의 표현에 대한 약속’을 가리켜 ‘문자 셋(Character Set)’이라 하고,
전 세계적으로 사용할 수 있는 문자 셋을 설계하게 되었는데, 이를 가리켜 ‘유니코드(Unicode)’라 한다.

public class CharTypeUnicode {
    public static void main(String[] args) {
        char ch1 = '헐';
        char ch2 = '확';
        char ch3 = 54736;   // 문자 '헐'의 유니코드 값
        char ch4 = 54869;   // 문자 '확'의 유니코드 값
        char ch5 = 0xD5D0;
        char ch6 = 0xD655;

        System.out.println(ch1 + " "+ch2);
        System.out.println(ch3 + " "+ch4);
        System.out.println(ch5 + " "+ch6);
    }
}

자바의 char는 문자의 저장을 위한 자료형이다. 자바는 유니코드를 기반으로 문자를 처리한다.
정리하자면

  1. 자바 프로그램 내에서 문자는 작은따옴표로 묶어서 표현한다.
  2. 문자를 char형 변수에 저장할 때 실제 저장되는 것은 해당 문자의 유니코드 값이다.

- 논리 자료형: boolean

자바에는 ‘참’과 ‘거짓’의 표현을 목적으로 하는 ‘논리 자료형’이라는 것이 존재한다.
이 두 상태의 표현을 위해 다음 두 개의 키워드를 정의하고 있다.

boolean isBlue = true;  // '참'을 의미하는 값
boolean isRed = false;  // '거짓'을 의미하는 값

Java lang 카테고리 내 다른 글 보러가기

댓글 남기기