[윤성우의 열혈 Java 프로그래밍] Chapter 03 - 상수와 형 변환

Update:     Updated:

카테고리:

태그:

03-1. 상수(Constants)

- 자바의 일반적인 상수

상수는 ‘값이 변하지 않는 수’를 말한다.
자바에서는 ‘한 번 그 값이 정해지면 이후로는 변경이 불가능한 변수’도 상수라 한다.
상수는 두 가지 특징을 지니게된다.

  1. 값을 딱 한 번만 할당할 수 있다.
  2. 한 번 할당된 값은 변경이 불가능하다.
public class Constant {
    public static void main(String[] args) {
        final int MAX_SIZE = 100;
        final char CONST_CHAR = '상';
        final int CONST_ASSIGNED;

        CONST_ASSIGNED = 12;

        // CONST_CHAR = '하' // 컴파일 에러: 상수는 중간에 변경 불가

        System.out.println("상수1 : " + MAX_SIZE);
        System.out.println("상수2 : " + CONST_CHAR);
        System.out.println("상수3 : " + CONST_ASSIGNED);
    }
}

관례상 상수의 이름은 다음 두 가지 사항을 지켜서 짓는다.

  1. 상수의 이름은 모두 대문자로 짓는다.
  2. 이름 둘 이상의 단어로 이뤄질 경우 단어 사이에 언더바를 넣는다.

- 리터럴(Literals)에 대한 이해

int num1 = 157; // 숫자 157은 리터럴 상수
long num2 = 3147483647; // 컴파일 오류 발생: integer number too large

숫자를 접했을 때 이를 ‘무엇으로 인식할지에 대한 일종의 약속’이 필요하고,
이 약속에 근거하여 표현된 숫자를 가리켜 ‘리터럴’ 또는 ‘리터럴 상수’라 한다.

long형 변수는 그 표현범위를 생각해보면 충분히 담을 수 있는데도 변수 num2에서 에러를 뱉는다.
즉, 왼편에 있는 변수의 자료형에 상관없이 정수는 int형으로 표현하기로 약속되어 있다.

- 정수형 상수의 표현 방법

public class IntegerLiterals {
    public static void main(String[] args) {
        int num1 = 3;
        
        byte num2 = 4;  // byte와 short형 정수의 표현 방법을 별도로 제공하지 않기 때문에 다음과 같은 초기화를 허용한다.
        short num3 = 5;
        
        long num4 = 3417483647L;    // 반면 long형 정수의 표현 방법은 별도로 제공한다. 숫자 끝에 문자 L또는 l을 붙여야한다.

        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
        System.out.println(num4);
    }
}

- 정수형 상수 관련 추가로 가능한 것들

자바에서는 단위가 큰 수의 표현 및 인식에 도움을 주기 위해 다음과 같이 중간에 언더바를 넣는 것도 허용하고 있다.

int num = 100_000_000;

- 실수형 상수

실수형 상수는 double형으로 인식된다.
명시하고 싶다면 double형의 경우 끝에 D나 d를 붙이고, float형은 F나 f를 붙인다.

System.out.println(3.0004999D + 2.0004999d)
System.out.println(3.0004999F + 2.0004999f)

- 이스케이프 시퀀스(escape sequences)

image

03-2. 형 변환

- 자료형의 변환이 의미하는 것은?

데이터의 표현 방법에 따라서 연산 방법이 달라진다.
때문에 다음과 같은 문장이 있다면, 컴파일러는 두 변수 num1과 num2의 자료형이 동일할 것을 기대한다.

int num1 = 50;
long num2 = 3123235234L;

System.out.println(num1 + num2);    // num1, num2의 자료형이 다름

데이터의 손실 없이 연산하려면 자료형의 크기가 작은 쪽에서 큰 쪽으로 형 변화가 일어나야한다.

  1. 변수 num1에 저장된 값을 long형으로 변환하여 메모리에 임시 저장한다.
  2. 이어서 이 변환된 값과 num2에 저장된 값을 대상으로 덧셈을 진행한다.

- 자동 형 변환(Implicit Conversion)

프로그래머가 명시한 형 변환이 아닌 필요한 상황에서 자동으로 형 변환이 일어나는 경우를 자동 형 변환이라고 한다.

규칙 1) 자료형의 크기가 큰 방향으로 형 변환이 일어난다.
규칙 2) 자료형의 크기에 상관없이 정수 자료형보다 실수 자료형이 우선한다.(정수형에 비해 실수형이 값의 표현 범위가 넓기 때문)

image

- 명시적 형 변환(Explicit Conversion)

자동 형 변환이 진행되지 않는 상황에서도 필요하다면 ‘명시적 형 변환’을 통해 형 변환이 이뤄지도록 문장을 구성할 수 있다.

long num1 = 3000000000007L;
int num2 = (int)num1;

크기가 큰 정수 자료형에서 작은 크기의 정수 자료형으로 형 변환을 진행하는 경우에는 상위 바이트가 잘려 나간다.
즉, num1의 상위 4바이트를 제외한 나머지 4바이트만 num2에 저장된다.

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

댓글 남기기