하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름
자바의 변수는 한번에 한가지 타입의 데이터만 저장이 가능하다.
변수를 사용하기 위해서는 변수를 먼저 선언해줘야 한다.
int age;
double pi;
변수 선언은 저장되는 값의 타입과 이름만 결정한 것이다.
변수에 최초로 값이 대입될 때 메모리가 할당 되고, 해당 메모리에 값이 저장된다. 따라서 변수를 사용하기 위해서는 반드시 초기화 작업을 진행해줘야 한다.

자바에서는 변수의 위치에 따라 초기화 규칙이 조금 다르다.
컴파일러 언어에서는 개발자가 변수를 선언할 때, 개발자가 어떤 타입인지 명확하게 정해줘야 한다. 그 타입에 따라 얼마만큼의 메모리를 쓸지 컴파일러가 결정하게 된다.
| 값의 분류 | 기본 타입 |
|---|---|
| 정수 | byte, char, short, int, long |
| 실수 | float, double |
| 논리(true/false) | boolean |
primitive type은 해당 타입명에 크기가 고정돼있다.
변수는 선언할 때 데이터를 저장할 수 있는 해당 타입에 따라 메모리가 확보된다.
| 타입 | 메모리 크기 |
|---|---|
byte | 1byte |
short | 2byte |
char | 2byte |
int | 4byte |
long | 8byte |
int는 총 20억개의 데이터를 저장할 수 있다. 최상위 비트는 부호 bit로 사용되고, 나머지 bit는 값의 범위를 결정한다.
최상위 비트가 0이면 양수, 1이면 음수이다.
byte = 128로 설정하면 byte가 표현할 수 있는 범위를 넘어서기 때문에 오류가 발생한다. 자바에서 byte 타입은 128부터 127까지만 표현 가능하다.
기본적으로 컴파일러는 정수 리터럴을 int 타입 값으로 간주하기 때문에 long은 숫자 뒤에 L(l)을 붙여줘서 해당 숫자가 long 타입임을 컴파일러에게 알려줘야 한다. long var4 = 1000000000000**L**;, long 타입은 은행이나 과학 분야에서 많이 사용된다.
따로 설정을 해주지 않고, println에서 출력하면 10진수로 인식하여 출력하게 된다.
하나의 문자를 작은따옴표(
’)로 감싼 것
컴퓨너는 기계이기 때문에 숫자만 다룰 수 있다. 그렇다면 문자는 어떻게 인식할 것인가?
1byte로 표현할 수 있는 문자의 갯수는 256개이다. 한글로 표현할 수 있는 글자수(초성중성종성)는 7천개가 넘기 때문에 한글은 2byte로 보통 처리한다. 이외에도 언어가 섞이면 2byte로도 부족하기 때문에 unicode(3byte) 체계를 사용하기 시작했다. char 타입은 해당 유니코드를 한글자씩 저장한다.
char는 또 다르게 말하면 숫자를 사람이 알아보기 쉽게 변환하여 보여주는 것이기 때문에 실제 타입은 정수 타입에 속한다. 그래서 char타입에 유니코드를 직접 저장해도 문제없이 저장이 된다.
자바는 기본적으로 utf-8을 이용해서 문자를 처리한다.
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 타입의 변수를 초기화할 목적으로 ‘’을 대입하면 컴파일 에러가 발생한다. char타입의 변수를 초기화할 때는 ‘ ‘의 공백 하나를 포함해서 초기화 해줘야 한다.
| 타입 | 메모리 크기 | 구성 |
|---|---|---|
float | 4byte(32bit) | 부호(1bit)+지수(8bit)+가수(23bit) |
double | 8byte(64bit) | 부호(1bit)+지수(11bit)+가수(52bit) |
double x = 0.25;
double y = 0.12E-2; //0.12*10^(-2)=0.0012
실수에서는 가수(유효숫자)의 부분이 얼마나 정밀하냐가 중요하다. 실수의 정밀성이 가장 중요시 되기 때문에 더 정밀하게 표현할 수 있는 double이 실수의 표준으로 사용하고 있다. double 타입은 float 타입보다 약 2배의 유효 자릿수를 가져서 더 정확한 데이터의 표현이 가능한 것이다.
표준이 double이기 때문에 float을 나타낼 때는 리터럴 뒤에 f(F)를 붙여서 컴파일러가 float 타입임을 알 수 있게 해준다.
참과 거짓을 의미하는
true와false로 구성
작은따옴표(’)로 감싼 한 개의 문자는 char 타입이지만, 큰따옴표(”)로 감싼 여러 개의 문자들은 유니코드로 변환되지 않는다.
큰따옴표로 감싼 문자들
문자열을 변수에 저장하고 싶다면 다음과 같이 String 타입을 사용해야 한다. String은 참조타입이다.
| 이스케이프 문자 | 출력 |
|---|---|
| \” | “문자 포함 |
| \’ | '문자 포함 |
| \ | \문자 포함 |
| \u16진수 | 16진수 유니코드에 해당하는 문자 포함 |
| \t | 출력 시 탭만큼 띄움 |
| \n | 출력 시 줄바꿈 |
| \r | 출력 시 캐리지 리턴 |
큰따옴표 3개로 감싸면 이스케이프하거나 라인피드를 할 필요가 없이 작성된 그대로 문자열로 저장된다.
String str1 = "" +
"{\n" +
"\t\"id\":\"winter\",\n" +
"\t\"name\":\"눈송이\"\n" +
"}";
String str2 = """
{
"id":"winter",
"name":"눈송이"
}
""";
값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다.
byte byteValue = 10;
int intValue = byteValue; //자동 타입 변환
이 부분은 개발자가 따로 처리해줄 부분 없이 자바가 자동으로 처리 한다.
int→longlong→floatlong→double허용 범위가 큰 타입에서 허용 범위가 작은 타입으로 자동 타입 변환 될 수는 없다.
큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장하는 것을 강제 타입 변환이라고 한다.
작은허용범위타입 = (작은허용범위타입) 큰허용범위타입


만약 int의 값이 1byte를 넘어간 값이라면 원래 int값은 보장되지 않는다. int→byte에서 보장할 수 있는 값은 -128~127이다.
// int -> byte
int intValue = 10;
byte byteValue = (byte) intValue;
// long -> int
long longValue = 300;
int intValue = (int) longValue;
// int -> char
int intValue = 65;
char charValue = (char) intValue;
// 실수 -> 정수
double doubleValue = 3.14;
int intValue = (int) doubleValue;
int 타입의 자동 변환: 정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입 변수는 int 타입으로 자동 변환되어 연산이 수행된다.byte x = 10;
byte y = 20;
// byte result = x+y; //컴파일 에러
int result = x+y;long 타입의 자동 변환: 다른 타입의 피연산자들이 long 타입으로 변환되어 계산된다.float만 있는 경우 float로 계산한다double이 있는 경우 모두 double로 자동 변환 후 계산한다int 타입과 double 타입이 연산에 있는 경우 double 타입으로 자동 변환 된다. 정수 타입으로 계산을 원하는 경우에는 강제 형변환을 해줘야 한다.int 연산자를 실수 연산을 원한다면 피연산자 중 최소 하나를 double로 강제 형변환해줘야 한다.+연산자는 피연산자가 모두 숫자일 때 덧셈 연산을 수행하는 역할을 하지만, 피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환하고, 문자열 결합 연산을 수행하는 역할도 한다.
int value = 3+7; //10
String str = "3"+7; //"37"
프로그램에서 문자열로 입력을 받았지만, 연산은 숫자로 진행해야 하는 경우가 있다. 이때 문자열을 기본 타입으로 변환한 후 연산 작업을 진행해줘야 한다.
| 변환 타입 | 사용 예 |
|---|---|
String→byte | byte value=Byte.parseByte(str); |
String→short | short value=Short.parseShort(str); |
String→int | int value=Integer.parseInt(str); |
String→long | long value=Long.parseLong(str); |
String→float | float value=Float.parseFloat(str); |
String→double | double value=Double.parseDouble(str); |
String→boolean | boolean value=Boolean.parseBoolean(str); |
중괄호 {} 블록 내에서 선언된 변수는 해당 중괄호 {} 블록 내에서만 사용이 가능하고 밖에서는 사용할 수 없다.
| 메소드 | 의미 |
|---|---|
println(내용); | 괄호 안의 내용을 출력하고 행을 바꿔라 |
print(내용); | 괄호 안의 내용을 출력하고 행은 바꾸지 말아라 |
printf(”형식문자열”, 값1,값2); | 형식 문자열에 맞추어 뒤의 값을 출력해라 |
형식 문자열 형식: %[argument_index$][flags] [width][.precision] conversion
%d: 정수(123)%6d: 6자리 정수, 왼쪽 빈자리 공백( 123)%-6d: 6자리 정수, 오른쪽 빈자리 공백(123 )%06d: 6자리 정수, 왼쪽 빈자리 0 채움(000123)Scanner 타입 변수를 선언한다.
대인 연산자 =를 사용해서 new 연산자로 생성한 Scanner 객체를 변수에 대입한다.
Scanner sc = new Scanner(System.in);
sc.nextLine()을 실행하면 키보드로 입력된 내용을 문자열로 읽고 좌측 String 변수에 저장한다.
String inputData = sc.nextLine();