변수variable
- 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름
변수 선언
- 어떤 타입의 데이터를 저장할 것인지, 변수 이름이 무엇인지 결정하는 것
변수 초기화
- 변수에 최초로 값을 대입하는 행위
- 이때의 값을 초기값이라고 한다.
컴퓨터 메모리(RAM)은 수많은 번지들로 구성된 데이터 저장 공간이다.
자바의 변수는 다양한 타입의 값을 저장할 수 없다.
- 정수형 변수에는 정수값만 저장 가능
변수 이름 규칙
캐멀 스타일(camel case)
- 자바 소스 파일명(클래스명)은 대문자로 시작 ex) MemberGrade.java
- 변수명은 소문자로 시작 ex) mathScore
변수에 최초로 값이 대입될 때 메모리에 할당되며, 해당 메모리에 값이 저장된다.
변수 선언만으로는 메모리에 할당되지 않는다.
초기화되지 않은 변수는 메모리에 할당되지 않는다.
초기화되지 않은 변수를 연산식에 사용할 경우 컴파일 에러 발생
int value;
int result = value + 25; // --> 컴파일 에러 발생 !
변수는 또 다른 변수에 대입되어 메모리 간에 값을 복사할 수 있다.
두 변수의 값을 교환하는 방법
int x = 5;
int y = 10;
int temp = x;
x = y;
y = temp;
변수는 선언될 때의 타입에 따라 저장할 수 있는 값의 종류와 허용 범위가 달라진다.
자바가 제공하는 기본primitive 타입 8개
정수 타입은 총 5개이다.

허용 범위를 초과한 값을 대입했을 경우 컴파일 오류 발생
long타입은 수치가 큰 데이터를 다루는 프로그램에서 사용
- byte, short, int, long은 모두 부호 있는(signed) 정수타입
- 최상위 bit는 부호 bit로 사용되고, 나머지 bit는 값의 범위를 결정
리터럴literal: 코드에서 프로그래머가 직접 입력한 값
| 진수 | 작성법 |
|---|---|
| `2진수 | 0b 또는 0B로 시작, 0과 1로 작성 |
8진수 | 0으로 시작, 0~7 숫자로 작성 |
10진수 | 소수점이 없는 0~9숫자로 작성 |
16진수 | 0x 또는 0X로 시작, 0~9숫자 또는 A~F, a~f로 작성 |
문자 리터럴
- 하나의 문자를 작은따옴표로 감싼 것
- 유니코드로 변환되어 저장된다.
- 이러한 유니코드를 저장할 수 있도록 char 타입 제공
'' 대입 시 컴파일 에러, 이 경우 공백 하나를 포함해서 초기화해야 한다. -> ' ' or 32
double 타입이 float타입보다 큰 실수를 저장할 수 있고, 정밀도 또한 높다.
두 타입의 값을 부동 소수점 방식으로 메모리에 저장한다.

최상위 1bit는 양수 및 음수를 결정짓는 부호
int x = 10;
boolean result = (x == 20); // false
boolean result = (x != 20); // true
boolean result = (x > 20); // false
boolean result = (0 < x && x < 20); // true
boolean result = (x < 0 || x > 200); // false
문자열
- 큰따옴표로 감싼 여러 개의 문자들
- 이는 유니코드로 변환되지 않는다.
- 문자열을 변수에 저장하고 싶다면 String 타입을 사용해야 한다.
이스케이프 문자
- 문자열 내부에 역슬래쉬(\)가 붙은 문자
- 이를 사용하면 문자열에 특정 문자를 포함할 수 있고, 출력에 영향을 미치기도 한다.
System.out.println("나는 \"자바\"를 배웁니다.");
텍스트 블록 문법(java 13부터)
- 작성된 그대로 문자열로 저장된다.
String str = """
{
"id" : "winter",
"name" : "눈송이"
}
나는 자바를 \
학습합니다. // -> 나는 자바를 학습합니다.
""";
byte < short, char < int < long < float < double
byte byteValue = 10;
int intValue = byteValue;

long longValue = 500000000000L;
float floatValue = longValue; // 5.0E9f로 저장됨
double doubleValue = floatValue; // 5.0E9로 저장됨
자동 타입 변환 예외
- char 타입보다 허용 범위가 작은 byte 타입은 char 타입으로 자동 변환될 수 없다.
- char 타입은 음수를 포함하지 않는데, byte 타입은 음수를 포함하기 때문
큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장하는 것
캐스팅 연산자로 괄호( )를 사용
강제 타입 변환의 목적은 원래 값이 유지되면서 타입만 바꾸는 것
byte result = 10 + 20 // 컴파일: byte result = 30
자바에서 정수 연산의 결과는 항상 정수가 된다.
int x = 1; int y = 2; double result = x / y; // 0.0
- 위 코드에서 x/y의 연산 결과는 0.5가 아닌 0이 된다. 0을 double 타입 변수에 저장하므로 결과는 0.0이 된다.
자바에서 + 연산자의 기능
- 피연산자가 모두 숫자일 경우, 덧셈 연산을 수행
- 피연산자 중 하나가 문자열일 경우, 나머지 피연산자도 문자열도 자동 변환되어 문자열 결합 연산을 수행
| 변환 타입 | 사용 예 |
|---|---|
| String -> byte | Byte.parseByte(str); |
| String -> short | Short.parseShort(str); |
| String -> int | Integer.parseInt(str); |
| String -> long | Long.parseLong(str); |
| String -> float | Float.parseFloat(str); |
| String -> double | Double.parseDouble(str); |
| String -> boolean | Boolean.parseBoolean(str); |
| 기본 타입 -> String | String.valueOf(primitive); |
System.out.printf("name: %s", "han");
System.out.printf("age: %d", 24);
// 형식 문자열에 포함될 값이 두 개 이상일 경우
System.out.printf("name: %1$s, age: %2$d", "han", 24);

Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();