[JAVA] 변수, 상수, 자료형의 형변환

Oayenn·2023년 3월 4일
0

Java

목록 보기
3/3
post-thumbnail

🔦 본 포스트는 도서 '이재환의 자바 프로그래밍 입문'을 기반으로 함을 알립니다.

📢 핵심 요약

  • 변수는 메모리 공간을 기억하는 용도로 사용된다.
  • 자바의 상수에는 리터럴 상수와 final 상수가 있다.
  • 자바 컴파일러는 정수형 리터럴 상수를 int형으로 처리한다.
  • 자바 컴파일러는 실수형 리터럴 상수를 double형으로 처리 한다.
  • 변수에 데이터를 대입할 때와 데이터끼리의 산술 연산을 할 때 형변환이 일어난다.

1. 변수

변수란?

  • 값이 변하는 수.
  • 메모리 공간을 기억하는 용도로 사용된다.

2. 상수

상수란?

  • 변하지 않는 값.
  • 자바에서는 리터럴 상수와 final 상수가 있다.

1) 리터럴 상수

  • literal. ‘1’, ‘A’와 같은 문자 그대로의 값
  • 프로그램이 시작할 때 특정 메모리 공간인 **상수 풀**(constant pool)에 자동으로 로딩된다.
  • 이후 변수에 값을 대입하면 상수 풀에서 해당 값을 복사하여 변수에 대입해준다.
    • 예를 들어 int num = 1; 이라는 코드를 작성하면 상수 풀에서 1을 복사하여 num 변수에 대입해준다.

2) final 상수

  • final 키워드를 사용하면 프로그래머가 상수를 임의로 만들 수도 있다.
    final double PI = 3.14;
    final int MAX_SIZE = 100;
  • final 상수 이름은 대문자를 이용하여 만든다 → 카멜 표기법을 사용할 수 없으므로, 단어 단위를 읽기 쉽게 언더바(_)로 단어를 구분한다.

3. 자료형의 형변환

자바에서의 형변환은 변환을 주최하는 것이 컴파일러냐, 프로그래머냐에 따라 두 가지로 구분된다. 다음은 형변환을 말하는 다양한 표현이다.

주최용어 1용어 2
컴파일러(가 자동으로)자동 형변환묵시적(암묵적) 형변환
프로그래머(가 직접)강제 형변환명시적 형변환

자동 형변환과 강제 형변환의 예시는 아래 코드를 통해 이해할 수 있다.

public class EX02_TypeChange1
{
		public class void main(String[] args)
		{
			int num1 = 1; // 1) int형 리터럴 상수 1을 int형 변수 num1에 대입
			byte num2 = 1; // 2) 자동 형번환. int -> byte
			byte num3 = 127; // 2)
			byte num4 = 128; // 3) error. 2)의 경우와 달리, 원래 값이 훼손되기 때문에 컴퓨터가 임의로 앞부분을 잘라낼 수 없다.

			short num5 = 1; // 2)
	
			num2 = num5; // 4) error. 변수일 경우 작은 값일 수도 있지만 큰 값이 들어올 수도 있으므로, 타입만 비교하고 에러 처리를 한다. 
			num2 = (byte)num5; // 5) 강제 형번환(명시적 형변환). 변수 안의 값을 알고 있으니 줄여도 된다고 명시적으로 표시한 것.
		}
}
  • 산술 연산에서 자동 형변환은 자료형 크기가 큰 쪽으로 일어나거나 (byte → short/char → int → long), 정수형에서 실수형으로 일어난다. (=컴파일러가 책임지지 않아도 되는 방향)
  • 리터럴 1을 byte형 변수에 대입할 때는 자동 형변환이 큰 쪽에서 작은 쪽으로도 이루어졌지만, 역시 책임지지 않는 선까지만 동작한다.

다음은 정수→실수 의 형변환 예제이다.

public class Ex_TypeChange2 {
    public static void main(String[] args) {
        int num1 = 2147483647; // OK
        int num2 = 2147483648; // error. int형에서 최대로 표현할 수 있는 값은 2,147,483,647 이다.
        long num3 = 2147483648; // error. 자바 컴파일러가 2147483648을 int형으로 인식했기 때문에 에러가 난다.
        long num4 = 2147483648L; // OK

        float num5 = 1.0; // error. 자바에서 사용하는 실수는 double형이 기본이다.
        float num5 = 1.0F; // 명시적 형변환. double -> float

        double num7 = 30; // 자동 형변환. int형의 상수 30이 상수 30.0으로 형변환된 후 가장 근사치 값을 계산해 doubl형의 변수에 대입해준다.
    }
}

4. 연산 시 형변환

연산을 담당하는 CPU에는 기본 자료형의 수를 계산하는 연산 장치가 있다. 이 장치는 다음과 같이 계산을 한다.

입력 1입력 2결과
intintint
longlonglong
floatfloatfloat
doubledoubledouble
  • 입력 1과 입력 2에 크기가 다른 자료형이 입력될 경우, 큰 쪽에 맞추어 형변환을 한 후 계산한다.
  • byte와 short는 모두 작으므로 int로 형변환 후 계산한다.
    public class Ex04_Calculation1
    {
    		public static void main(String[] args)
    		{
    				byte num11 = 1;
    				byte num12 = 2;
    				byte result1 = num11 + num12; // error. num11 + num12는 먼저 각각 int로형변환된 후 연산하게 된다.
    
    				short num21 = 1;
    				short num22 = 2;
    				short result21 = num21 + num22; // error. 위의 경우와 동일
    
    				short result22 = (short)(num21 + num22); // 강제 형변환(=명시적 형변환)
profile
차근차근 쌓아올리기

0개의 댓글