자바/자바 기초

상수와 리터럴, 형 변환

UroJem 2023. 5. 31. 01:58

상수

상수(constant)는 변수와 마찬가지로 '값을 저장할 수 있는 공간'이지만, 변수와 달리 한번 값을 저장하면 다른 값으로 변경할 수 없다. 상수를 선언하는 방법은 변수와 동일하며, 단지 변수의 타입 앞에 키워드 'final'을 붙여주기만 하면 된다.

final int MAX_SPEED = 10;

 

 

상수(constant) 선언하기

  • 상수는 변하지 않는 수
  • 원주율 3.14, 1년 12개월 등
  • final 예약어를 사용하여 선언
  • 상수를 사용하면 변하지 않는 값을 반복하여 사용할 때 의미있는 문자로 인식하기 쉽고 혹, 변하더라도 선언한 부분만 변경하면 되므로 여러 부분을 수정할 필요가 없다.

 

일단 상수에 값이 저장된 후에는 상수의 값을 변경하는 것이 허용되지 않는다.

final int MAX_VALUE; // 정수형 상수 MAX_VALUE를 선언

system.out.println(MAX_VALUE); // 에러. 초기값 세팅하기 전 변수 참조 불가.

MAX_VALUE = 100; // 상수에 초기값 세팅

MAX_VALUE = 200; // 에러. 상수에 저장된 값을 변경할 수 없음

상수의 이름은 모두 대문자로 하는 것이 관례이며, 여러 단어로 이루어져 있는 경우 '_'로 구분한다.

 

 

리터럴(literal)

  • 프로그램에서 사용하는 숫자, 문자, 논리값을 뜻함
  • 리터럴은 상수 풀(constant pool)에 있음
  • 정수 리터럴은 int로 실수 리터럴은 double로 저장됨
  • 정수의 범위가 넘어가는 경우는 L,l을 float을 사용하는 경우는 F,f 식별자를 써줘야 한다.

*위의 이미지에서 2023이란 값은 이미 메모리 어딘가에 위치해 있고 해당 값을 year란 변수에 할당하며 값을 복사하게 된다. 리터럴은 상수 풀에 있다고 했는데 2023 리터럴 값은 언제 메모리에 잡히게 되는 것일까?

하드디스크에 프로그램이 있고 프로그램을 실행시키면 메모리로 load 되는데 load 되는 시점에 프로그램 자료중 일부는 메모리를 먼저 잡는다. 실행이 되면서 메모리를 할당받는 값들이 있고 실행과 상관없이 프로그램이 메모리에 얹어진 그 순간 메모리 공간을 할당받는 값들이 있다. 주로 상수, static 변수 등이 있다. 이러한 값들이 자리잡는 영역을 Data Area 혹은 constant pool이라 칭한다. 프로그램이 종료될 때 메모리에서 해제된다.

 

 

형변환 (type conversion)

  • 서로 다른 자료형 간에 연산등의 수행을 위해 하나의 자료형으로 통일하는 것
  • 묵시적 형 변환(implicit data type conversion)과 명시적 형 변환(explicit data type conversion)이 있다.
  • 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어진다.
  • 덜 정밀한 자료형(정수)에서 더 정밀한 자료형(실수)으로의 형 변환은 자동으로 이루어 진다.

 

묵시적 형변환

개발자가 별도로 조치를 안해도 자동으로 형 변환 되는 것.

작은 범위를 표현 할 수 있는 자료형에서 넓은 범위를 표현하는 자료형의 변환만 허용한다.

byte -> short, char -> int -> long -> float -> double

byte b1 = 100;

byte b2 = 20;

byte b3 = b1 + b2; 
// 피연산자가 데이터 타입의 연산일 경우 정수의 연산은 기본 int 타입으로 변환된다.
// byte형이 + 연산자를 만나며 int 형으로 변환되어 에러발생. 명시적 형변환 필요

byte b4 = 100 + 20; // 실행 가능

int i1 = b1 + b2; // 묵시적 형변환

double d1 = 100 + 0.5; 
// 100.5 출력. int와 double이 만나면 double이 더 큰 타입이라 묵시적 형변환

int i2 = 201 / 2; 
// 100 출력. 정수끼리의 연산이어서 int형이 맞으나 결과값이 실수라면 소수점을 버린 값이 담김

double d2 = 201 / 2; 
// 100.0 출력. 정수끼리의 연산이라 201 / 2가 먼저 계산되어 100이 나오고 double 데이터 타입으로 대입되며 100.0이 됨

 

명시적 형변환

자료형의 범위가 넓은 자료형에서 작은 자료형의 변환은 프로그래머가 강제로 변환한다.

형 변환시 큰 타입에서 작은 타입으로 형변환은 값 손실이 발생할 수 있어 에러가 뜨지만 명시적으로 변환시 프로그래머의 의도인 것으로 간주하고 에러가 뜨지 않는다.

byte b5 = (byte)(b1 + b2); // 120 출력

byte b6 = (byte) b1 + b2;
// 에러 발생. b1과 b2의 연산을 묶지 않으면 b2를 int로 인식 결국 int형의 계산이 된다.

byte b7 = (byte)(b1 + b6);
// -36 출력. 220이 출력되어야 하지만 byte의 저장 범위를 넘어서 쓰레기 값 출력

int i3 = 100 + 0.5;
// 에러 발생. 0.5가 실수라 int 타입으로 들어갈 수 없음

double d3 = (double) 201 / 2;
// 100.5 출력. (double) 201 에서 201.0으로 실수타입으로 변환되고 2로 나누며 연산시
// 더 큰 데이터형인 double로 변환되어 실수의 연산이 됨.

double d4 = (double) (201 / 2);
// 100.0 출력. 우선순위인 ()안에 정수 201 / 2 = 100이 먼저 계산되며 (double)로 형변환 되기 때문.

 

 

정보 출처

https://fastcampus.co.kr/dev_online_javaend