변수(Variable)
변수란 하나의 값을 저장할 수 있는 메모리 공간을 뜻한다.
변수의 타입에 따라서 값을 저장할 수 있는 메모리 공간의 범위가 달라진다.
변수의 선언
"변수타입 변수이름;"으로 선언을 해준다.
변수의 초기화
변수에 처음으로 값을 저장하는 것으로 "변수이름 = 값; "으로 초기화를 진행한다.
반드시 초기화를 할 필요는 없지만 만약 변수가 지역 변수라면 읽기 전에 꼭 초기화를 해야 한다.
해당 코드와 같이 같은 타입이라면 여러 개의 값을 동시에 초기화할 수 있다.
변수의 값을 읽어오기 위해서는 해당 값이 필요한 곳에서 변수의 이름을 적어준다.
변수의 타입
변수의 타입으로는 기본형과 참조형으로 나눠진다.
기본형 타입을 제외한 나머지 모든 타입은 다 참조형 타입이다. (값이 아닌 메모리 주소를 저장함)
표를 통해서 각각의 기본형 타입의 특징을 살펴보자
타입 | 저장공간(바이트) | 저장공간(비트) | 표현범위 | 리터럴 예시 |
boolean | 1byte | 8bit | true or false | true, false |
char | 2byte | 16bit | 0 ~ 65,535 | 'a', .... |
byte | 1byte | 8bit | -128 ~ 127 | (none) |
short | 2byte | 16bit | -32,768 ~ 32,767 | (none) |
int | 4byte | 32bit | -2,147,483,648 ~ 2,147,483,647 | -2, 0, 1, .... |
long | 8byte | 64bit | 약 - 400경 ~ 약 400경 | -2L, 0L, 1L, .... |
float | 4byte | 32bit | 1.4E-45 ~ 3.4E38 | 1f, 3.14F, .... |
double | 8byte | 64bit | 4.9E-324 ~ 1.8E308 | 1e1d, .... |
기본형 타입의 표현 범위를 알기 위해서는 해당 타입의 저장 공간을 알아야 한다.
타입의 저장 공간을 알고 있다면 아래의 수식에 대입해 보면 쉽게 표현 범위를 알 수 있다.
-2n ~ 2n - 1 // n은 비트 수
위의 표를 보면 알겠지만 int와 float 혹은 long과 double은 같은 저장 공간을 가지는데 표현 범위가 달라진다. 왜 그런 걸까?
그 이유로 실수형은 하나의 byte로 부호와, 지수, 가수를 다 표현하기 때문에 정부보다 훨씬 넓은 표현 범위를 가지게 된다.
하지만 반대로 실수형은 정수형과 다르게 오차가 생길 수 있다는 문제가 있어서 실수형은 정밀도가 중요하다.
정밀도는 소수점 몇 번째 자리까지 오차가 없는지를 뜻한다. (float는 7자리, double은 15자리까지 정밀도를 가지고 있다.)
float의 정밀도인 7자리는 그리 높은 것이 아니기 때문에 실수형의 기본 리터럴은 double이 된다.
상수와 리터럴
상수
final int b = 30; // b는 상수 30은 리터럴
// b = 40; // 값을 변경할 수 없음
상수의 큰 특징으로는 2가지를 들 수 있다.
1. 상수는 한 번만 값을 저장할 수 있다.
2. 한 번 정해진 값은 변경할 수 없다.
Java에서는 final을 사용하여 상수임을 표시해 주고 사용한다.
리터럴
int a = 10; // a는 변수 10은 리터럴
a = 20; // 값을 변경할 수 있음
리터럴은 그 자체로 값을 의미하는 것이다.
상수랑 같은 개념을 가지고 있어 구별을 위해 리터럴이라는 의미를 만든 것이다.
상수와는 다르게 값을 변경할 수 있다.
모든 리터럴에는 타입이 존재한다.
리터럴의 접두사와 접미사
정수형과 실수형을 보면 타입이 여러 개인 것을 확인할 수 있다. 따라서 접미사를 통해 어떤 타입의 값인지를 구분한다.
int c = 100;
int oct = 0100; // 접두사로 숫자 0을 사용해서 8진수를 표시할 수 있다.
int hex = 0x100; // 접두사로 0x를 사용해서 16진수를 표시할 수 있다.
long l = 10_000_000_000L; // 큰 숫자를 표현할 때 long 타입을 사용하고 접미사로 L을 사용한다.
float f = 3.14f; // float 타입을 사용할 때 접미사 f를 사용해야 한다. 안 붙이면 오류 발생
float f1 = 3.14F; // float 타입을 사용할 때 접미사 f를 사용해야 한다. 안 붙이면 오류 발생
double d = 3.14d; // double 타입을 사용할 때 접미사 d를 사용하지만 생략이 가능해서 붙이지 않아도 된다.
먼저 실수형을 확인해 보면 접미사를 통해 float 타입인지 double 타입인지를 구분해 준다. 여기서 확인할 점은 접미사는 대소문자 구분하지 않고 다 사용할 수 있다는 점이다.
위에서 기본형 타입을 설명했을 때 언급했던 것과 같이 정밀도를 고려하여 실수형 리터럴은 기본적으로 double형이 되게 된다. 따라서 접미사 d를 생략해도 괜찮지만 float로 사용하려면 접미사를 반드시 붙여야 한다.
그다음으로 정수형을 확인해 보면 접두사를 사용하여 8진수, 16진수를 표현해 줬다.
boolean a = true; // boolean 타입은 true와 false만 가능하다.
char ch = 'A'; // 문자형 타입은 작은 따옴표로 값을 저장한다. (개행 문자 \n도 문자로 취급)
다음 리터럴 타입으로 boolean은 true, false만 가능하고, 문자는 작은따옴표로 값을 저장해야 한다.
여기서 주의할 점으로는 개행 문자인 \n도 문자로 취급한다는 것을 조심해야 한다.
변수와 리터럴 타입의 불일치
변수의 기본형 타입과 리터럴의 타입이 불일치하더라도 사용할 수 있다. 대신 조건으로는
"변수의 기본형 타입 범위 > 리터럴"을 만족한다면 타입이 불일치하더라도 저장이 가능하다.
byte b = 127; // 리터럴 타입이 int지만 byte 타입에 저장할 수 있다.
byte b1 = 128;
해당 코드로 예시를 들어보면 byte 타입의 b에 대입되는 값으로 int형 리터럴 값이 저장되었다. 여기서는 리터럴 값이 int 타입의 127이지만 byte 타입의 표현 범위인 127을 넘지 않기 때문에 저장이 가능하다.
하지만 반대로 b1을 보면 byte의 표현 가능한 범위인 127을 넘어가는 값인 128이 들어왔기 때문에 에러가 발생하게 된다.
'자바' 카테고리의 다른 글
[Java] - 제어문 (0) | 2023.11.04 |
---|---|
[Java] - 연산자 (0) | 2023.11.02 |
객체 지향 프로그래밍 - 추상화 (0) | 2023.08.18 |
객체 지향 프로그래밍 - 인터페이스 (0) | 2023.08.18 |
객체 지향 프로그래밍 - 다형성 (0) | 2023.08.17 |