int number; //선언 = 타입 + 이름
//저장
int number = 10; //초기화 -> 선언과 동시에 값을 저장
number = 20; //덮어쓰기 -> 선언 이후 다른 값
final double pi = 3.141592...;
pi = 10 //값을 바꾸려고 하면 에러가 남.
여기서 잠깐!
float는 부동소수점 방식으로 4byte만 사용하는데도 long보다 넓은 범위를 표현할 수 있다.
부동소수점 방식 : 가수와 지수를 구분해서 저장하고 이값들을 곱한 값을 저장(표현)하는 방식
따라서 float가 long보다 넓은 범위를 표현해 자동 형변환이 안됨.
여기서 잠깐!
문자형과 문자열의 차이를 알아보자.
문자형은 1byte만 사용하기 때문에 데이터만 저장하며 뒤에 널값이 안들어가지만, 문자열은 몇 byte를 사용하는지 모르기 때문에 뒤에 널값이 들어간다.
또, 문자는 아스키 코드라는 규칙을 통해 저장(표현)하고 있다.
| 참조형 변수 | 기본형 변수 |
|---|---|
| 주소형변수 실제값이 아닌 원본값의 주소값을 저장 | 실제값을 저장하는 저장공간 |
| Heap(동적) 영역에 저장 | Stack(정적) 영역에 저장 |
| Stack영역에는 따로 저장해 둔 원본값의 Heap 영역 주소를 저장 |
여기서 잠깐!
동적과 정적이란?
동적 - 할당된 메모리영역의 크기를 알 수 없을 때, 계속 늘어날 수 있는 참조형 변수의 원본을 저장
정적 - 크기가 몇 byte인지 정해져있는 기본형 변수를 저장
(크기가 정해져있는 참조형 변수의 주소값도 저장)
기본형 변수를 클래스로 한번 랩핑한 변수
//박싱
int number = 21;
Integer num = new Integer(number);
int n = num. intValue(); //언박싱 메소드
여기서 잠깐!
래퍼 클래스를 쓰는 이유?
클래스는 객체지향 언어인 Java의 핵심 기능!
클래스로 변수를 관리하면 객체지향의 더 많은 기능을 사용할 수 있다.
형변환은 주로 기본형 변수인 정수 <-> 실수 <-> 문자 들 사이에서 일어난다.
1. 캐스팅
double doubleNumber = 10.101010;
float floatNumber = 10.1010
int intNumber;
intNumber = (int)doubleNumber; // double -> int 형변환
intNumber = (int)floatNumber; // float -> int 형변환
정리하자면 아래와 같다.
자동 형변환 vs 강제 형변환
작은 타입 > 큰 타입 형변환 시 (자동 형변환)큰 타입 > 작은 타입 형변환 시 (강제 형변환 = 캐스팅)