티스토리 뷰

변수, 상수, 리터럴

  • 변수(variable) - 하나의 값을 저장하기 위한 공간
  • 상수(constant) - 한 번만 값을 저장 가능한 변수
  • 리터럴(literal) - 그 자체로 값을 의미하는 것
더보기

변수(variable) - 하나의 값을 저장하기 위한 공간

상수(constant) - 한 번만 값을 저장 가능한 변수

리터럴(literal) - 그 자체로 값을 의미하는 것

기존의 '상수'와 완벽히 동의어. Java에서 상수를 '한 번만 값을 저장 가능한 변수'로 정의했기 때문에 상수와 리터럴의 개념을 구분했다.

 

예제VarEx3

  • 코드
더보기

Problem Description | Cannot assign a value to final variable 'score'

 해석 : 상수 'score'에 값을 (재)할당할 수 없다.

public class VarEx3 {
    public static void main(String[] args) {
        final int score = 100;
        score = 200;

        System.out.println(score);
    }
}

Problem Description | Variable 'score' might not have been initialized

 해석 : 변수 'score'가 초기화되지 않았다.

public class VarEx3 {
    public static void main(String[] args) {
        final int score; // = 100;
        // score = 200;

        System.out.println(score);
    }
}

지역변수(lv)는 사용 전에 반드시 ‘수동 초기화’해야 한다.(복습)

 

리터럴의 접두사와 접미사

더보기

리터럴의 접두사와 접미사

접미사는 정수형 접미사 L과 실수형 접미사 f만 신경써서 알아두자.

| 참고 | 접미사는 대소문자 구별하지 않는다.

 

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

  1. 범위가 '변수 > 리터럴'인 경우, OK
  2. 범위가 '변수 < 리터럴'인 경우, 에러
  3. byte, short 변수에 int리터럴 저장 가능
더보기

1. 범위가 '변수 > 리터럴'인 경우, OK

int i = 'A';       // int > char
long l = 123;      // long > int
double d = 3.14f;  // double > float

2. 범위가 '변수 < 리터럴'인 경우, 에러

int i = 3_0000_0000;  // int의 범위(±20억) 벗어남
long l = 3.14f;       //  long < float
float f = 3.14;       // float < double

3. byte, short 변수에 int리터럴 저장 가능

단, 변수의 타입의 범위 이내이어야 함

byte b = 100;  // OK.  byte의 범위(-128~127)에 속함
byte b = 128;  // 에러. byte의 범위를 벗어남

 

예제VarEx3

  • 코드
더보기

Problem Description | Incompatible types. Found: 'int', required: 'boolean'

해석 : 발견된 int 타입과 요구되는 boolean 타입은 상호호환되지 않는다.

public class VarEx3 {
    public static void main(String[] args) {
        final int score = 100;
        // score = 200;
        boolean power = 0;
        System.out.println(score);
    }
}

Problem Description | java : incompatible types: possible lossy conversion from int to byte

해석 : int형을 byte형으로 형변환 시 lossy할 수 있기 때문에 자바는 허용하지 않는다.

package ch02;

public class VarEx3 {
    public static void main(String[] args) {
        final int score = 100;
        // score = 200;
        byte b = 128;  // 에러. -128~127

        int oct = 010;  // 8진수, 10진수로 8
        int hex = 0x10; // 16진수, 10진수로 16
        // System.out.println(score);
        long l = 10_000_000_000L;

        float f = 3.14;  // 에러. 접미사 f를 생략하면 컴파일러는 d로 해석한다.
        double d =3.14;
        System.out.println(oct);
        System.out.println(hex);
        System.out.println(10.);
        System.out.println(.10);
        System.out.println(10f);
        System.out.println(1e3);
    }
}

 

값의 분류

더보기

값의 분류

▲ 그림 2-1 값의 분류

변수의 타입 - 기본형(primitive type)

  • 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
  • 계산을 위한 실제 값을 저장한다.

 

변수의 타입 - 참조형(reference type)

  • 객체의 주소를 저장한다.
  • 8개의 기본형을 제외한 나머지 타입
더보기
▲ 표2-2 기본형의 종류

상수와 리터럴

상수

  • 값을 한번만 저장할 수 있는 공간

변수와 마찬가지로 ‘값을 저장할 수 있는 공간'이지만, 변수와 달리 한 번 값을 저장하면 다른 값으로 변경할 수 없다.

final int MAX_SPEED = 10;

리터럴

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

상수가 필요한 이유

final WIDTH = 20;      // 폭
final int HEIGHT = 10; // 높이

int triangleArea = (WIDTH * HEIGHT) / 2;  // 삼각형의 면적을 구하는 공식
int rectangleArea = (WIDTH * HEIGHT);     // 사각형의 면적을 구하는 공식

상수를 이용해서 기존의 코드를 변경한 것인데, 이전 코드에 비해 면적을 구하는 공식의 의미가 명확해졌다. 그리고 다른 값으로 계산할 때도 여러 곳을 수정할 필요없이 상수의 초기화만 다른 값으로 해주면 된다. 이처럼 상수는 리터럴에 있는 ‘의미있는 이름'을 붙여서 코드의 이해와 수정을 쉽게 만든다.

 

n 비트로 표현할 수 있는 10진수

  • 값의 개수: 2ⁿ
  • 값의 범위: 0 ~ 2ⁿ - 1

예시. byte타입 

  • 8 비트로 표현할 수 있는 10진수
  • 값의 개수 : 2^7 = 128
  • 값의 범위 : -128 ~ 127

'Java의 정석_기초편' 카테고리의 다른 글

화면으로부터 입력받기  (0) 2022.10.17
문자열 결합  (0) 2022.10.17
JVM & JDK  (0) 2022.10.17
자바의 특징  (0) 2022.10.17
상속(Inheritance)  (0) 2022.10.13
댓글
공지사항