변수(variable)은 값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름이다. 프로그램은 변수를 통해 메모리의 특정 번지에 값을 저장하고 읽을 수 있다.
변수를 메모리의 어디에 저장하고 어떤 방식으로 저장할지는 프로그래밍 언어와 운영체제가 정하는데, 자바의 경우 JVM이 하게 된다.
자바의 변수는 다양한 타입의 값을 저장할 수 없다. (정수 타입에는 정수만, 실수 타입에는 실수만)
변수 선언
int age;
double value;
자바 변수 명명 규칙
자바에서는 변수에 값이 저장되지 않으면 변수가 생성되지 않는다. '선언'과 '생성'은 다른 이야기이다. 자바에서는 반드시 변수를 선언하고 초기화를 해 주어야 한다.
int score = 90;
변수는 선언 시에 사용한 타입의 값만 저장할 수 있다.
자바의 모든 변수는 중괄호 { } 블록 내에서 선언되고 사용된다. 메소드 블록 내에서 선언된 변수를 로컬 변수(local variable)
라고 부른다. 로컬 변수는 메소드 블록 내부에서만 사용되고 메소드 실행이 끝나면 메모리에서 자동으로 사라진다. -> 자신이 속한 블록 내부에서만 사용 가능
package sec01.exam04;
public class VariableScopeExample {
public static void main(String[] args) {
int v1 = 15;
if(v1>10) {
int v2;
v2 = v1 - 10;
}
// v2 때문에 에러 발생. 사용 불가능
int v3 = v1 + v2 + 5;
}
}
저장되는 값에 따른 분류 | 타입의 종류 |
---|---|
정수 타입 | byte, char, short, int, long |
실수 타입 | float, double |
논리 타입 | boolean |
타입 | 메모리 사용 크기(byte) | 메모리 사용 크기(bit) | 저장되는 값의 허용 범위 |
---|---|---|---|
byte | 1byte | 8bit | -128 ~ 127 |
short | 2byte | 16bit | -32,768 ~ 32,767 |
char | 2byte | 16bit | 0 ~ 65535(유니코드) |
int | 4byte | 32bit | -2,147,483,648~2,147,483,647 |
long | 8byte | 64bit | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
저장할 수 있는 값의 범위는 -2^(n-1) ~ (2^(n-1)-1)
이다.
long
타입을 사용하고자 할 때는 정수 리터럴 뒤에 L
을 붙여주면 된다.
long balance = 30000000000; (X)
long balance = 30000000000L; (O)
작은따옴표(')로 감싼 하나의 문자(문자 리터럴)를 저장하는 타입이다. 문자 리터럴은 유니코드로 변환되어 저장된다.
char var1 = 'A'; //유니코드: 65
char var2 = '가'; //유니코드: 44032
int var3 = 'A';
System.out.println(var1); //A 출력
System.out.println(var2); //65 출력
String 타입
유니코드로 변환되지 않는 큰따옴표(")로 감싼 문자열을 저장하는 타입이다.
String str = "나는 \"자바\"를 좋아합니다.";
System.out.println(str)
-> 나는 "자바"를 좋아합니다.
이스케이프 문자 | 출력 용도 |
---|---|
\t | 탭만큼 띄움 |
\n | 줄 바꿈 |
\r | 캐리지리턴 |
\" | " 출력 |
\' | ' 출력 |
\\ | \ 출력 |
\u16진수 | 16진수유니코드에 해당하는 문자 출력 |
타입 | 메모리 사용 크기(byte) | 저장되는 값의 허용 범위(양수) | 정밀도(소수점 이하 자리) |
---|---|---|---|
float | 4byte | ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) | 7자리 |
double | 8byte | ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) | 15자리 |
자바는 실수 리터럴을 기본적으로 double
타입으로 해석한다. 실수 리터럴을 float
타입으로 저장하고 싶다면 리터럴 뒤에 F
를 붙여주면 된다. 메모리에 여유가 있고 특별한 이유가 없다면 double
타입을 사용하는 것이 좋다.
float var = 3.14; (X)
float var = 3.14f;
float var = 3E6F;
1byte 크기이다.
boolean stop = true;
boolen state = false;
byte < short < int < long < float < double
작은 타입이 큰 타입으로 저장될 때는 자동으로 형변환된다.
double doubleValue = 3.14;
int intValue = (int) doubleValue; //정수 부분인 3만 저장
//byte, short 타입의 피연산자는 int 타입으로 변환된다
byte x = 10;
byte y = 20;
int result = x + y; //반드시 int 타입
//두 피연산자 중 큰 타입으로 변환된 후 연산 수행
int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue;
int result = intValue + (int) doubleValue; //꼭 int로 하려면!
int value = 3 + 7; //10
String str1 = "3" + 7; //"37"
String str2 = 1 + 2 + "3"; //"33"
// 문자열 -> 기본 타입
String str = "10";
byte value1 = Byte.parseByte(str);
short value2 = Short.parseShort(str);
int value3 = Integer.parseInt(str);
// 기본 타입 -> 문자열
String str = String.valueOf(기본타입값);
메소드 | 의미 |
---|---|
println(내용); | 괄호 안의 내용 출력 후 행을 바꿔라 |
printf(내용); | 괄호 안의 내용을 출력만 해라 |
printf("형식문자열", 값1, 값2,...); | 형식문자열대로 내용을 출력해라 |
//이름: 김자바
System.out.printf("이름: %s", "김자바");
//이름: 김자바, 나이: 25
System.out.printf("이름: %1$s, 나이: %2%d", "김자바", 25);
//키보드에서 키 하나 입력받아 출력하는 코드
int keyCode = System.in.read();
System.out.println("keyCode: " + keyCode);
import java.util.Scanner;
//시스템의 입력 장치로부터 읽는 Scanner 생성
Scanner scanner = new Scanner(System.in);
//Enter 입력되기 전까지의 내용을 읽음
String inputData = scanner.nextLine();