1. 변수
변수
: 단 하나의 값을 저장할 수 있는 메모리 공간
- 가변적
- 메모리 공간은 1Byte로 구성
- 메모리 공간은 각각이 구분될 수 있도록 '메모리 주소'를 가짐
- 특정 메모리 영역에 이름을 붙이고 주소 대신 이름 사용
- 저장되는 값의 타입에 따라 메모리 공간 크기 결정
변수의 선언
- 메모리에 값을 저장할 공간을 할당받기 위해 선언
public class Variable1_1 {
boolean flag;
char grade;
byte val; // 1 byte = 8 bits
short sval; // 2bytes = 16 bits
int num; // 4 bytes = 32 bits
long price; // 8 bytes = 64 bits
float tax;
double score;
}
변수 생성 규칙
- 대소문자 구분
- 길이 제한 X
- 예약어 사용 불가
- 숫자로 시작 불가
- 특수문자 _와 $만 허용
변수의 여러가지 형태
- Camel case
- varTest
- Snake case
- var_test
- Pascal case
- VarTest
- 자바에는 클래스 명만 대문자로 시작하자는 암묵적이 룰이 있음
- Kebob case
- var-test
- 자바에서는 변수명에 - 기호 사용 불가
변수의 초기화
: 변수에 처음으로 값을 저장하는 것
public class Variable1_2 {
public static void main(String[] args) {
boolean flag = false;
char grade = 'A';
byte val = 127;
short sval = 128;
int num = 32768;
long price = 2_145_7_483_648L;
float tax = 3.14f;
double score = 3.14159265358979;
System.out.println("boolean = " + flag);
System.out.println("char = " + grade);
System.out.println("byte = " + val);
System.out.println("short = " + sval);
System.out.println("int = " + num);
System.out.println("long = " + price);
System.out.println("float = " + tax);
System.out.println("double = " + score);
}
}
변수의 종류
- 클래스, 인스턴스, 지역 변수
public class Variable1_4 {
static int classVal = 100; // 클래스 변수
int instanceVal = 200; // 인스턴스 변수
public static void main(String[] args) {
int num; // 지역 변수
// System.out.println(num); // 변수 초기화를 해주지 않았기 때문에 오류 발생.
num = 300;
System.out.println("int = " + num); // 300
// 인스턴스 변수
// System.out.println("instanceVal = " + instanceVal); // 객체를 생성해주지 않았기 때문에 에러 발생.
Variable1_4 instance = new Variable1_4(); // 인스턴스 변수 사용을 위해 객체 생성
System.out.println("instanceVal = " + instance.instanceVal); // 200
// 클래스 변수
// 같은 클래스 내부는 바로 접근 가능
System.out.println("classVal = " + classVal);
// 클래스명.클래스변수명 으로도 접근
System.out.println("Main.classVal = " + Variable1_4.classVal);
}
}
2. 상수와 리터럴
상수
: 값을 한 번만 저장할 수 있는 변수
- 불변적
- 코드 자체의 가독성을 늘리기 위해 사용
public class Variable2_1 {
public static void main(String[] args) {
int score = 100;
System.out.println("score = " + score);
score = 90; // score는 변수이므로 값 변경 가능
System.out.println("score = " + score);
final int finalScore = 100;
System.out.println("finalScore = " + finalScore);
// finalScore = 90; // 상수의 값을 바꾸려고 하면 에러 발생.
}
}
리터럴
: 그 자체로의 값
변수, 상수, 리터럴 구별
- score → 변수
- finalScore → 상수
- 100, 1000 → 리터럴
public class Variable2_2 {
public static void main(String[] args) {
int score = 100;
final int finalScore = 1000;
}
}
리터럴의 접두사와 접미사
- 정수형
- byte, short, int, long
- 정수형의 기본형 - int 이기 때문에
long 타입의 경우 구분을 위해 100L과 같이 리터럴 마지막에 접미사로 L을 붙임 - byte, short 타입은 연산에 이용하기보다는 저장 목적인 경우가 많아 Java의 내장 변환모듈이 자동으로 형 변환 시켜줌
- 실수형
- float, double
- float의 리터럴에는 f, double의 리터럴에는 d가 붙음
- double은 기본형이기 때문에 접미사 생략 가능
- 0b, 0x와 같은 진수를 나타내는 접두사는 대소문자 구별 X
public class Variable2_3 {
public static void main(String[] args) {
// boolean flag1 = 22; // 22는 정수이므로 Error 발생
boolean flag2 = false; // true, false 만 가능
// char grade1 = 'AA'; // char은 문자만 들어갈 수 있으므로 한 문자만 표현할 수 있음.
//char grade2 = "A"; // ""은 문자열을 의미하기 때문에 Error 발생
char grade3 = 'A'; // 한 문자만 가능
char ch = '\n'; // 개행문자(\n, \t 등) 가능
// String name1 = 'C'; // String은 문자열 타입이므로 ""로 선언해줘야 하기 떄문에 Error 발생
// String name2 = 'Choi';
// 문자열은 한 문자이든, 여러 문자이든 가능
String str = "C";
String name3 = "choi";
// byte val1 = 128; // 오버플로우
byte val2 = 127; // int 와 같은 리터럴로 저장하지만 범위가 지정되어 있음. -128 ~ 127
short sval = 128;
// int의 진수 표현
int ob = 0b0101; // 2진수, 접두사 0b
int i = 100; // 10진수
int oct = 0100; // 8진수, 접두사 0
int hex = 0x100;
long price = 2_147_483_648L; // _를 사용하여 숫자 표현 가능
// long l1 = 2_147_483_648; // int 범위가 넘었으므로 접미사 L 필수.
long l2 = 100; // int의 범위가 넘지 않았으므로 접미사 L 생략 가능
// float tax1 = 3.14;
float tax2 = 3.14f;
double score1 = 3.14159265358979; // d 생략 가능
double score2 = 3.14159265358979d;
float f1 = 10f; // 10.0f
double d1 = 10.; // 10.0
double d2 = .10; // 0.10
double d3 = 1e3; // 1000.0, e3 = 10의 3제곱
double d4 = -1e3; // -1000.0
}
}
변수와 리터럴의 타입 불일치
- 범위가 '변수 > 리터럴'인 경우: OK
- int i = 'A'; int > char, 'A' = 65
- long l = 123; long > int
- double l = 3.14f; double > float
- 범위가 '변수 < 리터럴'인 경우: Error
- int i = 30_0000_0000; int의 범위(대략 20억)를 넘음
- long l = 3.14f; long < float
- long(8byte)이 float(4byte)보다 바이트 수가 커서 가능할 것 같지만 실수형은 정수형보다 저장 범위가 훨씬 더 넓기 때문에 Error 발생
- float f = 3.14; float < double;
- byte, short 변수에 int 리터럴 저장 : OK
- 단, 변수 타입의 범위 이내
'내일배움캠프(Sparta) > Java Handbook' 카테고리의 다른 글
[Java Handbook] Part 2-2 (0) | 2023.09.12 |
---|---|
[Java Handbook] Part 2-1 (0) | 2023.09.12 |
[Java Handbook] Part 1-4 (0) | 2023.09.11 |
[Java Handbook] Part 1-2 (0) | 2023.09.11 |
[Java Handbook] Part 1-1 (0) | 2023.09.11 |