[Java 00] 변수와 타입

변수

  • 자료를 저장하기 위한 메모리 공간
  • 타입에 따라 크기가 달라짐
  • 메모리 공간에 값을 할당 후 사용

타입

✔️ 기본형(primitive type)

  • 미리 정해진 크기의 memory size로 표현
  • 변수 자체에 저장
  • 모든 값 타입은 메모리의 스택(stack)에 저장
  • ex) int, double, char 등

✔️ 참조형(reference type)

  • 크기가 미리 정해질 수 없는 데이터의 표현
  • 변수에는 실제 값을 참조할 수 있는 주소만 저장
  • 메모리의 힙(heap)실제 값저장하고, 그 참조값(주소값)을 갖는 변수는 스택에 저장

 

기본형(Primitive Type)의 크기

* 실수(부동 소수점)의  연산은 정확하지 않다. 유효 자릿수를 활용하여 반올림처리하기

 

 

형변환

❓ 변수의 타입을 다른 타입으로 변환하는 것

  • primitive는 primitive 끼리, reference는 reference 끼리 형 변환 가능
    • boolean은 다른 기본 타입과 호환되지 않음.
    • 기본 타입과 참조형의 형 변환을 위해 Wrapper 클래스 사용

 

형 변환 방법

  • 형 변환 연산자(괄호) 사용
double d = 1.3;
int result = (int)d;

 

기본형의 형 변환

구분 이동 방향 값 손실 예시
묵시적 형 변환 작은 집 → 큰 집 없음 byte b = 10;
int i2 = b;
명시적 형 변환 큰 집 → 작은 집 있을 수 있음 int i = 200;
byte b = (byte) i;

✔️ 묵시적 형 변환

  • 타입의 표현 범위가 커지는 방향으로 할당한 경우 발생
  • 자료의 손실 걱정이 없으므로 JVM이 해줌.

✔️ 명시적 형 변환

  • 값 손실이 발생할 수 있으므로 프로그래머 책임하에 진행

 

  | 기본형 타입의 표현 범위 (오름차순)

 ✔️ 형 변환 예시

int a = Integer.MAX_VALUE;
int b = a + 1; // 오버플로우 발생
System.out.println(b); // -2147483648

long l1 = a + 1; // 오버플로우 발생, int + 1 한 후에 long에 넣어주기 때문
System.out.println(l1); // -2147483648

long l2 = (long) (a + 1); // 이것도 l1과 같다.
System.out.println(l2); // -2147483648

long l3 = (long)a + 1; // long으로 형 변환 후 연산해서 ㄱㅊ
System.out.println(l3); // 2147483648

int c = 1000000 * 1000000 / 1000000; // 1000000* 1000000 에서 이미 오버플로우 발생
int d = 1000000 / 1000000 * 1000000; 
System.out.println(c + " : " + d); // -7273 : 1000000