상수와 리터럴

상수

  • 한 번만 값이 저장 가능한 변수

  • 선언 방법 : final 변수타입 변수이름;

  • 숫자에 의미있는 이름을 붙여 코드 자체의 가독성을 늘리기 위해 상수를 사용합니다. '시험의 만점은 100점이다.' 라는 예시를 들 수 있습니다.

class Variable2_1 {
    public static void main(String[] args) {
        int score = 100;
        System.out.println("score = " + score);
        score = 90;
        System.out.println("score = " + score);

        final int finalScore = 100;
        System.out.println("finalScore = " + finalScore);
//         finalScore = 90; // Error 발생
    }
}

리터럴

  • 그 자체로 값을 의미하는 것

  • 기존의 상수와 같은 의미입니다. 하지만 Java에서 상수를 '한 번만 값이 저장 가능한 변수' 라는 의미로 사용하기 때문에 이를 구별하기 위해 사용하는 용어입니다.

변수, 상수, 리터럴 구별하기

  • 아래 예제코드를 사용하여 변수, 상수, 리터럴을 구별해 보겠습니다.

  • score : 변수

  • finalScore : 상수

  • 100, 1000 : 리터럴

class Variable2_2 {
    public static void main(String[] args) {
        int score = 100;
        final int finalScore = 1000;
    }
}

리터럴의 접두사와 접미사

  • 위 이미지는 리터럴의 종류(타입)를 구분한 표입니다.

  • 정수형byte, short, int, long 타입으로 여러 개 존재합니다.

    • 정수형의 int, 실수형의 double은 기본형이기 때문에 접미사를 붙이지 않고, long 타입은 구분을 위해 100L 처럼 리터럴 마지막에 접미사로 L을 붙입니다.

    • byte, short 타입의 변수도 마찬가지로 리터럴 접미사가 존재하지 않고 int 타입과 똑같은 리터럴을 사용하여 저장합니다.

      • byte, short 타입은 연산에 이용하기보다는 저장 목적인 경우가 많아 Java 의 내장 변환모듈이 자동으로 형 변환시켜 줍니다.

  • 실수형 float, double 타입이 존재합니다.

    • float의 리터럴에는 f, double의 리터럴에는 d가 붙습니다.

    • 실수형은 2개 밖에 존재하지 않기 때문에 접미사 f를 사용하면 구분을 할 수 있어서 접미사 d는 생략을 허용합니다.

  • 따라서, 리터럴에 붙이는 접미사는 정수형의 L , 실수형의 f 만 주의하시면 됩니다.

    • 접미사는 대소문자를 구별하지 않지만 L 의 소문자 l 은 숫자 1 과 혼동되기 쉽기 때문에 대문자를 사용하는 것이 좋습니다.

    • 0b, 0x 와 같은 진수를 나타내는 접두사 또한 대소문자를 구별하지 않습니다.

  • 아래 예제코드를 통해 리터럴의 사용 방법을 학습하겠습니다.

class Variable2_3 {
    public static void main(String[] args) {
        // boolean flag1 = 22; // Error 발생
        boolean flag2 = false; // true, false 만 가능!
        
        // char grade1 = 'AA'; // Error 발생
        // char grade2 = "A"; // Error 발생
        char grade3 = 'A'; // char 타입은 이렇게 하나의 문자만 가능!
        char ch = '\n'; // 개행문자(\n, \t 등) 가능!
    
        // String name1 = 'C'; // Error 발생
        // String name2 = 'Choi'; // Error 발생
        String str = "C"; // 한 문자 가능! 문자가 하나여도 문자열로 인식!
        String name3 = "choi"; // 여러 문자 가능!
        
        // byte val1 = 128; // Error 발생
        byte val2 = 127; // int 와 같은 리터럴로 저장하지만 범위가 지정되어 있음! -128 ~ 127
        
        short sval = 128;
        
        // 리터럴 접두사 예제
        // int의 진수 표현
        int ob = 0b0101; // 2진수, 접두사 0b
        int i = 100; // 10진수
        int oct = 0100; // 8진수, 접두사 0
        int hex = 0x100; // 16진수, 접두사 0x
        
        long price = 2_147_483_648L; // _ 를 사용하여 숫자 표현 가능!
        // long l1 = 2_147_483_648; // Error 발생, int 범위를 넘었으니 L 접미사 필수!
        long l2 = 100; // int의 범위를 넘지 않으면 L 생략 가능! 
        
        // float tax1 = 3.14;
        float tax2 = 3.14f;
        
        double score1 = 3.14159265358979; // d 생략 가능!
        double score2 = 3.14159265358979d;
        
        float f1 = 10f; // 10.0f
        double d1 = 10.; // 10.0
        double d2 = .10; // 0.10
        double d3 = 1e3; // 1000.0 , e3 = 10의 3제곱
        double d4 = -1e3; // -1000.0
    }
}

변수와 리터럴의 타입 불일치

  • 범위가 '변수 > 리터럴' 인 경우 : OK

    • int i = 'A'; int > char, 'A' = 65

    • long l = 123; long > int

    • double l = 3.14f; double > float

  • 범위가 '변수 < 리터럴' 인 경우 : Error

    • int i = 30_0000_0000; int의 범위(대략 20억)를 넘습니다.

    • long l = 3.14f; long < float

      • long(8bye), float(4byte)라 가능할 것 같지만 실수형은 정수형 보다 저장 범위가 훨씬 넓기 때문에 Error가 발생합니다.

    • float f = 3.14; float < double;

  • byte, short 변수에 int 리터럴 저장 : OK

    • 단, 변수의 타입의 범위 이내여야 합니다.

Ref. Java의 정석 기초편 Chapter2(3, 4)

Ref. 상수와 리터럴, 리터럴 타입과 접미사

Last updated