자바의 변수는 다양한 타입의 값을 저장할 수 없다. 즉, 정수형 변수에는 정수값만 저장할 수 있고, 실수형 변수에는 실수값만 저장할 수 있다.
int A;
// int는 타입 A는 변수 이름
// 정수(int) 값을 저장할 수 읶는 A변수 선언
double B;
// double은 타입 B는 변수 이름
// 실수(double) 값을 저장할 수 읶는 B변수 선언
Java의 변수는 캐멀 스타일로 작성하는 것이 관례이다.
int A;
A = 100; //대입 연산자 '='를 사용하여 저장
변수선언은 저장되는 값의 타입과 이름만 결정한 것이지 메모리에 할당된 것은 아니다. 변수에 최초로 값이 대입될 때 메모리에 할당되고. 해당 메모리에 값이 저장된다.
int C = 100;
초기화 되지 않은 변수는 메모리에 할당되지 않았기 때문에 변수를 통해 메모리 값을 읽을 수 없다.
int value;
int result = value + 10;
변수 value가 선언 되었지만, 초기화하지 않았기 때문에 value + 10에서 value 변수값은 읽어올 수 없다.
수정코드
int value = 30;
int result = value + 10;
변수는 선언될 때의 타입에 따라 저장할 수 있는 값의 종류와 허용 범위가 달라진다. 자바는 정수,실수,논리값을 저장할 수 있는 기본 타입 8개를 제공한다.
정수: byte, char, short, int, long
실수: float, double
논리(true/false): boolean
정수타입 메모리 사용 크기순
타입 | 메모리 크기 | 저장되는 값의 허용 범위 | ||
byte | 1byte | 8bit | -2^7 ~ (2^7-1) | -128 ~ 127 |
short | 2byte | 16bit | -2^15 ~ (2^15 -1) | -32,768 ~ 32,767 |
char | 2byte | 16bit | 0 ~ (2^16-1) | 0 ~ 65535(유니코드) |
int | 4byte | 32bit | -2^31 ~(2^31-1) | -2,147,483,648 ~ 2,147,483,647 |
long | 8byte | 64bit | -2^63 ~(2^63-1) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
정수 타입 메모리 할당 크기
종류 | byte | short | int | long |
---|---|---|---|---|
메모리 사용 크기(단위 bit) | 8 | 16 | 32 | 64 |
하나의 문자를 작은따옴표로(') 감싼 것을 문자 리터럴이라고 한다. 문자 리터럴은 유니코드로 변환되어 저장된다. 자바는 이러한 유니코드를 저장할 수 있도록 char 타입을 제공한다.
char c1 = 'A'; //'A' 문자와 메핑되는 숫자: 65로 대입
char c3 = '가'; //'가' 문자와 매핑되는 숫자: 44032로 대입
package hello;
public class hello {
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 타입의 변수에 어떤 문자도 대입하지 않고 단순히 초기화를 할 목적으로 작은 따옴표 두 개를 연달아 붙인 빈(empty) 문자를 대입하면 컴파일 에러가 생긴다. 이 경우에는 공백 하나를 포함하여 초기화 해야한다.
실수 타입에는 float과 double이 있으며 다음과 같이 메모리 할당 크기와 저장되는 값의 범위를 가지고 있다.
최상위 1bit는 양수 및 음수를 결정짓는 부호 bit로 0이면 양수, 1이면 음수가 된다. 지누는 float 타입은 8bit, double타입은 11bit로 표현하고 나머지 bit는 모두 기수를 표현하는데 사용된다.
double은 float보다 지수와 가수 부분의 bit수가 크기 때문에 더 크고 정밀한 실수를 저장할 수 있다.
코드에서 실수 리터럴
double x = 0.25;
double y = -3.14;
double x = -3.14
double y = 0.12E-2
기본 타입이 double이기 때문에 double 타입 변수에 대입해야 한다. float 타입에 대입하고 싶다면 리터럴 뒤에 소문자'f'나 대문자 'F'를 붙여야 한다.
double var = 3.14;
double var = 314e-2
float var = 3.14f;
float var = 3E6F;
float과 double 타입의 소수 이하 유효 자릿수 확인
, 10의 거듭제곱 리터럴 대입 출력 예제
package hello;
public class FloatDoubleExample {
public static void main(String[] args) {
float var1 = 0.123456789123456789f;
double var2 = 0.123456789123456789f;
System.out.println("var1: " + var1); // var1: 0.12345679
System.out.println("var2: " + var2); // var2: 0.12345679104328156
double var3 = 3e6;
float var4 = 3e6F;
double var5 = 2e-3;
System.out.println("var3: " + var3); // var3: 3000000.0
System.out.println("var4: " + var4); // var4: 3000000.0
System.out.println("var5: " + var5); // var5: 0.002
}
}
참과 거짓을 의미하는 논리 리터럴은 true 와 false이다.
논리 리터럴은 boolean 타입 변수에 다음과 같이 대입할 수 있다.
boolean stop = true;
boolean stop = false;
boolean 타입 변수는 주로 두 가지 상태 값을 저장할 필요가 있을 경우 사용되며, 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 사용된다.
int x = 10;
boolean result = (x == 20);
boolean result = (x != 20);
boolean result = (x > 20);
boolean result = (0 < x && x < 20);
boolean result = (x < 0 || x > 200);
stop 변수값에 따라 if,else 중 하나를 실행하고 연산식 결과를 boolean 변수에 저장
package hello;
public class BooleanExample {
public static void main(String[] args) {
boolean stop = true;
if(!stop) {
System.out.println("중지합니다");
} else {
System.out.println("시작합니다");
}
int x = 10;
boolean result1 = (x == 20);
boolean result2 = (x != 20);
System.out.println("result1: "+ result1);
System.out.println("result2: "+ result2);
}
}
작은따옴표(')로 감싼 한 개의 문자는 char 타입이지만, 큰따옴표(")로 감싼 여러 개의 문자들은 유니코드로 변환되지 않는다.
char var1 = "A"; // 컴파일 에러
char var2 = "홍길동"; // 컴파일 에러
큰따옴표로 감싼 문자들을 문자열이라고 부른다. 문자열을 변수에 저장하고 싶다면 String 타입을 사용하여야 한다.
String var1 = "A";
String var2 = "홍길동";
문자열 내부에 사용하는 역슬래쉬()가 붙은 문자를 이스케이프 문자라고 하고, 이스케이프 문자를 사용하면 특정문자를 포함할 수 있고, 출력에 영향을 미치기도 한다.
이스케이프 문자 | |
---|---|
\" | " 문자 포함 |
\' | ' 문자 포함 |
\\ | \\ 문자 포함 |
u16진수 | 16진수 유니코드애 해당하는 문자 포함 |
\t | 출력 시 탭만큼 띄움 |
\n | 출력 시 줄바꿈 (라인피드) |
\r | 출력 시 캐리지 리턴 |
package hello;
public class StringExample {
public static void main(String[] args) {
String name = "홍길동";
String job= "프로그래머";
System.out.println(name); //홍길동
System.out.println(job); //프로그래머
String str = "나는 \"자바\"를 배웁니다";
System.out.println(str); // 나는 "자바"를 배웁니다
str = "번호\t이름\t직업 ";
System.out.println(str); // 번호 이름 직업
System.out.println("나는\n");
System.out.println("자바\n");
System.out.println("배웁니다\n");
// 나는
자바를
배웁니다
}
}
텍스트 블럭 문법
큰따옴표 3개로 감싸면 이스케이프, 라인 피드 등 상관없이 작성된 문자열 그대로를 보여준다.
String str = """
...
""";
package hello;
public class TextBlockExample {
public static void main(String[] args) {
String str1 = "" +
"{\n" +
"\t\"id\": \"winter\",\n" +
"\t\"name\": \"눈송이\"\n" +
"}";
String str2 = """
{
"id": "winter",
"name": "눈송이"
}
""";
System.out.println(str1);
System.out.println("---------------------------------");
System.out.println(str2);
System.out.println("---------------------------------");
String str = """
나는 자바를 \
학습니다.
나는 자바 고수가 될 겁니.
""";
// 줄바꿈 하지 않고 출력하고 싶을경우 \역래쉬를 입력하면 한줄에 출력된다.
System.out.println(str);
}
}
//result
{
"id": "winter",
"name": "눈송이"
}
---------------------------------
{
"id": "winter",
"name": "눈송이"
}
---------------------------------
나는 자바를 학습니다.
나는 자바를 공부합니다.
\가 없을 경우
나는 자바를
학습니다.
str1과 str2는 동일한 문자열이 저장된다.