5일 차 - 리터럴, 형 변환 (22.12.30)

yvonne·2022년 12월 30일
0

📂Java

목록 보기
5/51

1. 리터럴 (Literals)

  • 자료형을 기반으로 표현이 되는 상수

  • 정수는 무조건 int형으로 인식하기로 약속하기 때문에 int형 범위를 넘어가는 값들은 자료형을 반드시 지정해줘야함

      * '리터럴'이라는 표현은 '상수'라는 표현으로 대신하는 경우가 많다. 
      
  • 문자형 리터럴 : char ch = 'A' 의 A
  • 정수형 리터럴 : int num = 5 + 7;의 5와 7
  • 실수형 리터럴 : double num2 = 3.3 + 4.5;의 3.3과 4.5
ex) int num1 = 5+7
* 메모리를 거쳐서 cpu에 가서 연산 됨
* 메모리에 5와 7이 올라가는 곳은 컴파일러가 정해주고, 
  메모리 공간에 기록된 수는 바꿀 수 없다.

2. 아래의 내용이 에러가 나는 이유와 수정 방법

System.out.println(3147483647 + 3147483648);
컴파일시 Integer number too large 라는 오류 발생
  • 오류의 이유: 정수 리터럴은 기본적으로 int형 (4byte)인데 이미 연산 전의 정수 리터럴이 int의 범위를 초과
System.out.println(3147483647L + 3147483648L);
  • 해결방법: l 또는 L을 붙여서 long형 리터럴로 표현

  • 실수 리터럴: 기본적으로 double형으로 처리한다
    그래서 double형 범위를 넘어가는 값은 자료형(float)을 꼭 지정해줘야함


3. 자동 형 변환과 명시적 형 변환

  • 형 변환 (Casting)
    CPU가 연산 결과에 대한 응답을 할 때는 반드시 9개의 데이터 타입 중 한 개를 결정해서 그에 맞춘 응답을 주기 때문에 두 데이터 타입이 일치해야 한다.

  • ex 1)

int a = 21int b = 21int c = a+b

* 컴파일러는 에러가 안 나지만, 값이 나올 때 오류
  • ex 2)
int a = 10
long b = 21L
int c = a+b

* 에러이유: 결과 값이 long 타입으로 나오기 때문에
  • 피연산자의 자료형이 일치해야 동일한 방법을 적용하여 연산을 진행할 수 있다.
  • 피연산자의 자료형이 일치하지 않을 때 형(Type)의 변환을 통해 일치를 시키야 한다.



  • 자동 형 변환 (Implicit Conversion)

    • 1. 자료형의 크기가 큰 방향으로 형 변환이 일어난다.
    • 2. 자료형의 크기에 상관없이 정수 자료형보다 실수 자료형이 우선한다.

  • 명시적 형 변환 (Explicit Conversion)
    자동 형 변환 규칙에 부합하지는 않지만, 형 변환이 필요한 상황이면 명시적 형 변환을 진행한다.

  • ex 1)

double pi = 3.1415;
int wholeNumber = (int)pi;

// 출력: 3 -> 소수점을 없애고 출력됨
  • ex 2)
long num1 = 3000000007L;
int num2 = (int)num1;

// long은 int보다 할당된 공간이 크기 때문에 int의 공간에 다 할당되지 못한 숫자들은 출력이 안됨
  • ex3)
short num1 = 1;
short num2 = 2;
short num3 = (short)(num1 + num2); 

* 정수 자료형의 오류

public class OperatePromotion {
	public static void main(String[] args) {
		short num1 = 11;
		short num2 = 22;
		short result = num1 + num2;
		System.out.println(result);
	}
}
  • 오류원인 : cpu에서 메모리로 (정수의) 결과값을 보낼 때 32bit인 JVM과 2byte(16bit)인 short 자료형 사이에 오류가 생긴다.
  • 해결방법 : int 이상의 자료형으로 코드를 짜야한다.

4. 아래의 에러가 나는 이유를 설명하고 수정하시오.

	public static void main(String[] args) {
		int a = 4;
		int b = 3;
		double c = b / a;
		 
		System.out.println(c);
	}
}
  • 출력값: 0.0

    	* int인 b/a의 값은 (int)0.75 이기 때문에 
     소수점이 버려진 0.0으로 출력된다
  • 해결방법
    1) double c = (double)b / a;로 형 변환
    2) num1, num2의 자료형 중 하나는 double로 선언
    3) 연산전에 a,b 중 하나를 double형으로 명시적 형 변환

int a = 3;
int b = 4;

double result = b/ (double)a

5. 아래의 출력 결과를 확인하고, 130이 나오는 이유를 설명하시오.


System.out.println('A'); 
System.out.println('A' + 'A'); 
  • 출력결과

  • 이유 : 'A'는 문자 1개(2byte)인 Char형으로 인식하여 메모리에 65로 저장
    'A' + 'A'는 Char형으로 65를 메모리에 올리고 int형으로 자동 형 변환

profile
개발 연습장

0개의 댓글