1. 변수란 무엇일까?
변수(variable)는 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름으로 변수를 통해 프로그램은 메모리 번지에 값을 저장하고 읽을 수 있다. 변수가 존재하는 덕분에 데이터를 쉽게 저장하여 메모리 관리가 쉬워진다.
자바의 변수는 다양한 타입의 값을 저장할 수 없기 때문에 정수형 변수에는 정수값만 저장할 수 있고, 실수형 변수에는 실수값만 저장할 수 있다.
변수의 이름은 첫 번째 글자가 문자여야 하고, 중간부터는 문자, 숫자, $, _를 포함할 수 있다. 또한, 첫 문자를 소문자로 시작하되 캐멀 스타일로 작성하는 것이 관례라고도 한다.
캐멀(camel) 스타일: 여러 단어를 혼합하여 명명하는 경우, 대소문자가 섞여있도록 작성하는 스타일이다. 자바 소스 파일명과 변수명을 작성할 때 관례적으로 사용한다.
- 자바 소스 파일명(클래스명)은 대문자로 시작하는 것이 관례이다. ex)Week.java, MemberGrade.java
- 변수명은 소문자로 시작하는 것이 관례이다. ex) score, sportCar
2. 정수 타입
변수는 선언될 때의 타입에 따라 저장할 수 있는 값의 종류와 허용 범위가 달라진다. 자바의 경우 정수, 실수, 논리값을 저장할 수 있는 기본 타입 8개를 아래와 같이 제공한다.
값의 분류 | 기본 타입 |
정수 | byte, char, short, int, long |
실수 | float, double |
논리(True/False) | boolean |
정수 타입은 5개로, 아래와 같이 메모리 할당 크기와 저장되는 값 범위를 가지고 있다.
허용 범위를 정확하게 알 필요는 없지만 메모리 크기 정도는 알고있는 편이 좋다. 대신 허용 범위를 초과한 값을 대입할 경우 컴파일 오류가 발생하니 주의하자.
타입 | 메모리 크기 | 저장되는 값의 허용 범위 | ||
byte | 1byte | 8bit | -2⁷ ~ (2⁷ -1) | -128 ~ 127 |
short | 2byte | 16bit | -2¹⁵ ~ (2¹⁵ - 1) | -32,768 ~ 32,767 |
char | 2byte | 16bit | 0 ~ (2¹⁶ - 1) | 0 ~ 65535 (유니코드) |
int | 4byte | 32bit | -2³¹ ~ (2³¹ -1 ) | -2,147,483,648 ~ 2,147,483,647 |
long | 8byte | 64bit | -2⁶³ ~ (2⁶³ -1 ) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
또한 변수에 대입할 정수 리터럴은 진수에 따라 작성하는 방법이 다르다.
리터럴(literal): 프로그래머가 직접 입력한 값
package ch02.sec02;
public class IntegerLiteralExample {
public static void main(String[] args) {
int var1 = 0b1011; //2진수, 0b 또는 0B로 시작하고 0과 1로 작성
int var2 = 0206; //8진수, 0으로 시작하고 0~7 숫자로 작성
int var3 = 365; //10진수, 소수점이 없는 0~9 숫자로 작성
int var4 = 0xB3; //16진수, 0x 또는 0X로 시작하고 0~9숫자나 A~F 또는 a~f로 작성
System.out.println(var1);
System.out.println(var2);
System.out.println(var3);
System.out.println(var4);
}
}
long 타입은 수치가 큰 데이터를 다루는 프로그램에서 사용된다. 기본적으로 컴파일러는 정수 리터럴을 int 타입 값으로 간주하기 때문에 int 타입의 허용범위를 초과할 경우 소문자 'l'이나 대문자 'L'을 붙여 long 타입 값임을 컴파일러에게 알려주어야한다.
package ch02.sec02;
public class LongExample {
public static void main(String[] args) {
long var1 = 10;
long var2 = 20L;
long var3 = 10000000000; //컴파일러가 int로 간주하기 때문에 에러 발생
long var4 = 10000000000L;
System.out.println(var1);
System.out.println(var2);
System.out.println(var4);
}
}
3. 문자 타입
하나의 문자를 작은따옴표(')로 감싼 것을 문자 리터럴이라고 한다. 문자 리터럴은 유니코드로 변환되어 저장하며 유니코드를 저장할 수 있도록 char 타입을 제공한다.
유니코드가 정수이므로 char 타입도 정수 타입에 속하며 그렇기 때문에 char 변수에 작은따옴표로 감싼 문자가 아니라 유니코드 숫자를 직접 대입할 수도 있다.
package ch02.sec03;
public class CharExample {
public static void main(String[] args) {
char c1 = 'A'; //문자 저장
char c2 = 65; //유니코드 직접 저장
char c3 = '가';
char c4 = 44032;
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
}
}
//주의: 초기화만 할 목적으로 char c = ''과 같이 따옴표 두 개를 연달아 붙인 빈 문자를 대입하면 에러가 발생한다.
//이 경우에는 공백(유니코드:32) 하나를 포함해서 초기화해야 한다.
4. 실수 타입
실수 타입에는 float와 double이 있으며 아래와 같이 메모리 할당 크기와 저장되는 값 범위를 가진다.
타입 | 메모리 크기 | 저장되는 값의 허용 범위(양수 기준) | 유효 소수 이하 자리 | |
float | 4 byte | 32 bit | 1.4 x 10⁻⁴⁵ ~ 3.4 x 10³⁸ | 7자리 |
double | 8 byte | 64 bit | 4.9 x 10⁻³²⁴ ~ 1.8 x 10³⁰⁸ | 15자리 |
컴파일러는 실수 리터럴을 기본적으로 double 타입으로 해석하기 때문에 double 타입 변수에 대입해야 한다. float 타입에 대입하고 싶다면 리터럴 뒤에 소문자 'f'나 대문자 'F'를 붙여 컴파일러가 float 타입임을 알 수 있도록 해야 한다.
package ch02.sec04;
public class FloatDoubleExample {
public static void main(String[] args) {
/*
정밀도 확인
실수 리터럴을 기본적으로 double 타입으로 해석하기 때문에 double 타입 변수에 대입해야 한다.
float 타입에 대입하고 싶다면 리터럴 뒤에 소문자 'f'나 대문자 'F'를 부여 컴파일러에게
float 타입임을 알 수 있도록 해야한다.
*/
float var1 = 0.123456789123456789f;
double var2 = 0.123456789123456789;
//double 타입은 float 타입 보다 약 2배의 유효 자릿수를 가지고 있어 정확한 데이터 저장이 가능
System.out.println(var1);
System.out.println(var2);
//10의 거듭제곱 리터럴
double var3 = 3e6;
float var4 = 3e6F;
double var5 = 2e-3;
System.out.println("var3: " + var3);
System.out.println("var4: " + var4);
System.out.println("var5: " + var5);
}
}
var1과 var2를 비교해보면 double 타입이 float 타입보다 약 2배 정도의 유효 자릿수를 가지는걸 확인할 수 있다.
'Language > Java' 카테고리의 다른 글
[Java] 키보드 입력 데이터를 변수에 저장 (0) | 2022.10.04 |
---|---|
[Java] 변수 사용 범위와 콘솔로 변수값 출력 (0) | 2022.09.28 |
[Java] 타입 변환 (0) | 2022.09.27 |
[Java] 변수에 대한 이해_2 (논리, 문자열 타입) (1) | 2022.09.21 |
[Java] 자바 시작하기 (0) | 2022.09.14 |