본문 바로가기
JAVA/이재환의 자바 프로그래밍 입문

[Java] Ch.3 변수, 상수, 자료형의 형변환

by ♡˖GYURI˖♡ 2023. 10. 13.
728x90

변수

변수의 이해

int num = 1;
  1. 자료형이 int이니 메모리에 주소 네 개를 확보해서 공간을 비워둠
  2. 십진수 1을 이진수로 변경해서 이 공간에 저장
  3. 이 공간(주소)을 변수 num에 기억시킴
System.out.println(num);
  1. num 변수의 값의 위치를 찾음
  2. 찾아낸 메모리의 시작 위치로 찾아감
  3. num 변수는 int형이니까 4바이트를 읽음
  4. int형이니까 10진수로 바꿔서 숫자로 알려줌
    • char형이면 유니코드표를 보고 디코딩해서 문자로 알려줌

 

변수명을 짓는 방법

  • 변수의 이름은 숫자로 시작할 수 없음
  • $와 _ 이외의 다른 특수문자는 사용할 수 없음
  • 키워드는 변수의 이름으로 사용할 수 없음

 

권장 사항

  • 소문자로 시작
    • 클래스 이름이 대문자로 시작하는 것과 구별됨
  • 변수에 사용되는 데이터를 유추할 수 이쓴 이름으로 만듦
    • 카멜 표기법 이용

 

상수

리터럴(literal)

  • 문자 그대로의 값
  • 문자 자체에 의미가 있어 누구나 공통으로 그 의미를 알고 의미를 변경할 수 없음
  • 숫자, 문자, 논리값(true, false) 등
  • 프로그램 시작 시 특정 메모리 공간인 상수 풀(constant pool)에 자동으로 로딩 됨

 

final 상수

final double PI = 3.14;
final int MAX_SIZE = 100;
  • final 상수 이름은 대문자를 이용하여 만듦
  • 카멜 표기법을 사용할 수 없기에 언더바를 이용 (스네이크 표기법)
  • 다른 값을 대입받아 바꿀 수 없음 = '이 값이 최종이다'
public class Ex01_FinalUse
{
    public static void main(String[] args)
    {
        final int MAX_NUM = 100;     // 선언과 동시에 초기화
        final int MIN_NUM;           // 선언만
        
        MIN_NUM = 60;                // 나중에 초기화. 딱 한 번 가능.
        
        // final 상수를 사용하는 이유
        int myScore = 40;

        if (myScore < MIN_NUM) 
        {
            System.out.println("당신의 등급은 F입니다.");
        }
    }
}

 

자료형의 형변환

상수값 대입 시 형변환

public class Ex02_TypeChange1
{
    public static void main(String[] args)
    {
    	int num1 = 1;			// (1)
        byte num2 = 1;			// (2)
        byte num3 = 127; 		
        byte num4 = 128;		// (3)
        
        short num5 = 1;

        num2 = num5;			// (4)
        num2 = (byte)num5;		// (5)
    }
}

(1) : OK

(2) : 자동 형변환, 자바 컴파일러가 리터럴 상수의 값을 알고 있으므로 앞부분을 자라서 넣어줌 (int → byte)

(3) : ERROR, 상수가 변수에 저장할 수 있는 범위의 값보다 큰 값이면 에러 발생

(4) : ERROR, 타입 비교 후 에러 처리

(5) : OK, 프로그래머가 자기가 책임지겠다고 명시적으로 표시

 

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

 

자동 형변환의 방향

public class Ex03_TypeChange2
{
    public static void main(String[] args)
    {
        int num1 = 2147483647;		// (1) OK
        int num2 = 2147483648;		// (2) ERROR
        long num3 = 2147483648;	// (3) ERROR
        long num4 = 2147483648L;	// (4) OK : L을 뒤에 붙여서 '이 숫자는 long형으로 형변환 한 것임'이라고 알려줌
        
        float num5 = 1.0;		// (5) ERROR : 자바에서 실수는 기본으로 double형
        float num6 = 1.0F;		// (6) OK : F를 뒤에 붙여서 '이 값은 float형으로 형변환 한 것임'이라고 알려줌
        
        double num7 = 30;    		// (7) int -> double 자동 형변환
    }
}

 

 

연산 시 형변환

public class Ex04_Calculation1
{
    public static void main(String[] args)
    {
        byte num11 = 1;
        byte num12 = 2;
        byte result1 = num11 + num12;			// (1) ERROR
        
        short num21 = 1;
        short num22 = 2;
        short result21 = num21 + num22;		// (2) ERROR
        
        short result22 = (short)(num21 + num22); 	// (3) 강제 형변환
    }
}

(1) : num11 + num12 연산 시 각각 int로 형변환 된 후 더하기 연산 수행, byte타입 result1에 대입 불가

(2) : num21 + num22 연산 시 각각 int로 형변환 된 후 더하기 연산 수행, short타입 result2에 대입 불가

(3) : num21 + num22 연산 시 각각 int로 형변환 된 후 더하기 연산 수행, 결과를 강제 형변환하여 short타입으로 만듦

 

public class Ex05_Calculation2
{
    public static void main(String[] args)
    {
        int num31 = 1;
        int num32 = 2;
        int result3 = num31 + num32;		// (1) OK
        
        long num41 = 1;
        long num42 = 2;
        long result4 = num41 + num42;		// (2) OK
        
        long result5 = num31 + num41;		// (3) OK : 자동 형변환
        
        float num61 = 1.0f;			// (4) f 접미사
        float num62 = 2.0f;					
        float result6 = num61 + num62;		// (5) OK
        
        double num71 = 1.0;
        double num72 = 2.0;
        double result7 = num71 + num72;	// (6) OK
        
        double result8 = num61 + num71;	// (7) OK : 자동 형변환
    }
}

(3) num31 + num41 연산 시 num31이 long형으로 형변환 후 계산

(7) num61 + num71 연산 시 num61이 double형으로 형변환 후 계산

'JAVA > 이재환의 자바 프로그래밍 입문' 카테고리의 다른 글

[Java] Ch.6 제어문  (1) 2023.10.16
[Java] Ch.5 콘솔 출력과 입력  (1) 2023.10.13
[Java] Ch. 4 연산자  (1) 2023.10.13
[Java] Ch.2 자료형  (0) 2023.10.13
[Java] Ch.1 Hello Java World  (0) 2023.10.13