이 문서의 내용
변수(Variable)란?
자바에서 변수는 값(Value)을 저장 할 수 있는 메모리 공간을 의미합니다.
변수를 선언하면 변수에 값을 담고, 변수에 담겨있는 값을 읽거나 다른 값을 다시 담을 수 있습니다.
int vi = 100;
float vf = 100.0f;
String vs = "string literal";
boolean vb = true;
변수와 반대되는 개념으로는 리터럴(Literal)이 있습니다.
리터럴은 상수(Constant)를 의미하며 정수 리터럴 실수 리터럴 문자(문자열) 리터럴 그리고 논리 리터럴로 구성됩니다.
예시에서 대입 연산자(=) 우측에 위치하는 상수를 리터럴이라고 부릅니다.
데이터 타입
모든 변수에는 타입(Type)이 있습니다. 변수의 각 타입에 따라서 입력 할 수 있는 값과 사용 할 수 있는 범위가 달라집니다.
변수 타입은 기본(Primitive-원시) 타입과 참조(Reference) 타입이 있습니다.
이중에서 Primitive 타입은 리터럴을 직접 저장하기 위한 데이터 타입을 의미합니다.
구분 | 타입 | 메모리 | 범위 |
1 Byte | true or false | ||
1 Byte | -128 ~ 127 | ||
2 Byte | -32,768 ~ 32,767 | ||
4 Byte | -2,147,483,648 ~ 2,147,483,647 | ||
8 Byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | ||
4 Byte | (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값 | ||
8 Byte | (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 | ||
2 Byte | 0 ~ 65,535(유니코드, \u0000 ~ \uFFFF) |
타입 변환
타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 과정입니다.
모든 데이터가 상호 간에 타입 변환을 수행 할 수 있는 것은 아닙니다. 타입 변환은 크게 자동 타입 변환(Promotion)과 강제 타입 변환(Casting)으로 구분 합니다.
자동 타입 변환
자동 타입 변환(Promotion)은 동일한 성격을 갖는 타입 간에 변환입니다.
기본적으로 더 큰 데이터 범위를 갖는 타입으로의 이동에서 발생합니다.
byte a = 100;
int b = a;
코드 | 비고 | |
1바이트 정수를 저장하는 |
프로모션은 저장 범위가 더 큰 컨테이너로 이동하므로 데이터 손실이 발생하지 않습니다.
따라서 컴파일 오류가 발생하지 않으며 묵시적 형 변환이라고도 부릅니다.
Reference 타입에서는 슈퍼 클래스(Super class)로의 형 변환 역시 묵시적 형 변환에 속합니다.
Class A { }
Class B extends A { }
B a = new B();
A b = a;
강제 타입 변환
강제 타입 변환(Casting)은 값이 손실될 수 있는 타입 변환입니다.
데이터 범위가 더 작은 타입으로 값을 이동하는 경우가 이에 속합니다.
int a = 100;
byte b = (int) a;
코드 | 비고 | |
4바이트 정수를 저장하는 |
캐스팅은 저장 범위가 더 작은 컨테이너로 이동하므로 데이터 손실이 발생 할 수 있습니다.
따라서 컴파일러는 컴파일 오류를 발생시켜 값이 손실 될 수 있음에 경고합니다.
데이터 손실 가능성을 명시적으로 동의하므로 서로 다른 데이터 타입 간에도 형 변환이 가능합니다.
float a = 10.4f;
int b = (int) a;
Wrapper 클래스
Primitive 타입에 상응하는 클래스(Reference 타입)를 제공하며 이를 래퍼(Wrapper) 클래스라고 부릅니다.
래퍼 클래스는 Reference 타입이기 때문에 Null을 처리 할 수 있고 여러가지 멤버 함수를 제공합니다.
자바에서는 각 Primitive 타입은 상응하는 래퍼 클래스를 제공합니다.
구분 | Primitive 타입 | Wrapper 타입 |
없음 |
래퍼 클래스는 언박싱하지 않으면 산술 연산이 불가능합니다.
Primitive 타입을 Wrapper 클래스로 변환 하는 것을 박싱(Boxing)이라고 부르며 그 반대를 언박싱(Unboxing)이라고 부릅니다.
다음 예시에서 int와 Integer 간의 산술 연산과 int와 float 간의 산술 연산에서는 형 변환이 필요 없습니다.
하지만 Integer와 float 간의 산수 연산에선는 캐스팅이 반드시 필요합니다.
int a = 100;
Integer b = 200;
float c = 100;
a += b;
a += c;
b += (int) c;
정리 및 복습
- 자바에서 변수는
값(Value)을 저장 할 수 있는 메모리 공간을 의미합니다. - 변수와 반대되는 개념으로는
리터럴(Literal)입니다. 예시에서대입 연산자(=)우측에 위치하는 상수를 리터럴이라고 부릅니다.
String vs = "string literal";
- 변수 타입은
기본(Primitive-원시) 타입과참조(Reference) 타입이 있습니다. Primitive 타입은 리터럴을 직접 저장하기 위한 데이터 타입을 의미합니다.- 타입 변환은 크게
자동 타입 변환(Promotion)과강제 타입 변환(Casting)으로 구분 합니다. 자동 타입 변환(Promotion)은 동일한 성격을 갖는 타입 간에 변환입니다. 기본적으로더 큰 데이터 범위를 갖는 타입으로의 이동에서 발생합니다.강제 타입 변환(Casting)은 값이 손실될 수 있는 타입 변환입니다.데이터 범위가 더 작은 타입으로 값을 이동하는 경우가 이에 속합니다.- Primitive 타입에 상응하는
클래스(Reference 타입)를 제공하며 이를래퍼(Wrapper) 클래스라고 부릅니다.
'Java > Java SE, EE' 카테고리의 다른 글
[Java/Java SE, EE] 증감(++, --) 연산자 (0) | 2022.01.10 |
---|---|
[Java/Java SE, EE] 산술 연산자 (0) | 2022.01.10 |
[Java/Java SE, EE] 연산자(Operator)와 피연산자(Operand) (0) | 2022.01.10 |
박싱(Boxing)과 언박싱(Unboxing), 래퍼 클래스(Wrapper class) (0) | 2022.01.10 |
[Java/Java SE, EE] Java 언어란? Java SE, JDK, JRE 그리고 Java EE 소개 (0) | 2022.01.04 |