리터럴 (literal) : 변하지 않는 데이터 그 자체
상수와 혼동할 수 있지만,
int age = 20; // 20은 리터럴이다.
final int MAX_AGE = 100; // 100은 리터럴이다. (MAX_AGE는 상수이다.)
String str = "java" // "text"는 리터럴이다.
| 종류 | 예시 | 접두사, 접미사 |
|---|---|---|
| 논리형 | false, true | - |
| 정수형 | 100, 0b0011, 077, 0xFF, 12L | L (long 타입은 L을 접미사로 사용한다. / l은 1과 헷갈릴 수 있어서 대문자로 쓴다)0 (8진수는 리터럴 앞에 접두사 0을 쓴다) / 0x (16진수는 리터럴 앞에 접두사 ‘0x’ 또는 ‘0X’를 쓴다) |
| 실수형 | 3.14, 12.0e8, 7.7f | f (float는 접미사 ‘f’, ‘F’를 쓴다) / d (double 타입은 ‘d’, ‘D’를 쓴다. 실수형은 double이 기본 자료형이므로 생략도 가능하다.) |
| 문자형 | ‘O’, ‘1’, ‘\n’ | - |
| 문자열 | “OHGIRAFFERS”, “100”, “false” | - |
리터럴의 활용은 이전 게시글에서 다뤘기 때문에 변수에 대해 알아보자.
변수 : 데이터를 저장하기 위해 할당 받은 메모리 공간을 의미한다.
전역 변수, 지역 변수 중 일단은 지역 변수에 대해 다뤄본다.
- 변수 선언 후 변수에 값을 대입하는 방법 -> 선언 후 초기화
- 동시에 작성하는 방법 -> 선언과 동시에 초기화
// 변수의 선언 예시
int age;
// 선언한 변수에 값 대입 예시
age = 20;
age = age;
// 선언과 동시에 초기화 예시
int point = 100;
/* 1-1. 동일한 범위 내에서 동일한 변수명을 가질 수 없다. */
int age = 20;
//int age = 20; //동일한 변수명을 가지므로 에러 발생함
/* 1-2. 예약어는 사용이 불가능하다. */
//int true = 1; //예약어 사용 불가
//int for = 20; //예약어 사용 불가
/* 1-3. 변수명은 대소문자를 구분한다. */
int Age = 20; //위에서 만든 age와 다른 것으로 취급한다.
int True = 10; //예약어 True와 다른 것으로 취급한다.
/* 1-4. 변수명은 숫자로 시작할 수 없다. */
//int 1age = 20; //숫자로 시작해서 에러 발생
int age1 = 20; //숫자가 처음에 시작하지 않으면 섞어서 사용도 가능함
/* 1-5. 특수기호는 '-'와 '$'만 사용 가능하다. */
//int sh@rp = 20; //사용 가능한 특수문자 외에는 사용 불가능
int _age = 20; //언더스코어는 사용 가능함. 처음도 가능하고 중간이나 끝에도 가능함
int $harp = 20; //$도 사용 가능함. 처음도 가능하고 중간이나 끝에도 가능함
/* 2-1. 변수명의 길이 제한은 없다. */
int sadjfsadkjhfkjsadhfkjhsafkjhsdfjkhsafkjhsdjkfhsdajkfhdsakjfhsdakjfhasdjkfhsdafkjhfsdakj;
/* 2-2. 변수명이 합성어로 이루어진 경우 첫 단어는 소문자, 두 번째 시작 단어는 대문자로 시작한다. */
/* 자바에서는 클래스명만 유일하게 대문자로 시작한다. */
int maxAge = 20;
int minAge = 10;
/* 2-3. 단어와 단어 사이의 연결을 언더스코어(_)로 하지 않는다. */
String user_name; //에러가 발생하지 않지만 이렇게 하면 안된다.
String userName; //이게 올바른 표현이다.
/* 2-4. 한글로 변수명을 짓는 것이 가능하지만, 권장하지 않는다. */
int 나이; //가능하지만 권장하지 않음
/* 2-5. 변수 안에 저장된 값이 어떤 의미를 가지는지 명확하게 표현하도록 한다. */
String s; //변수가 어떤 의미인지 파악하기 힘들다.
String name; //문자열 형태의 이름이 저장되겠구나 하는 의도가 파악이 된다.
/* 2-6. 전형적인 변수 이름이 있다면 가급적 사용하도록 한다. */
int sum = 0;
int max = 10;
int min = 0;
int count = 1;
/* 2-7. 명사형으로 작성할 수 있도록 한다. */
String goHome; //가능하긴 하지만 가급적 명사형으로 짓는다.
String home;
/* 2-8. boolean 형은 의문문으로 가급적 긍정형태로 네이밍한다. */
boolean isAlive = true;
boolean isDead = false; //부정형보다는 긍정형이 더 나은 방식이다.
/* 목차 1. 값에 의미를 부여하기 위한 목적 (가독성) */
/* 아래 처럼 작성하면 어느 값이 급여인지 어느 값이 보너스 금액인지 알 수 없다. */
System.out.println("== 값에 의미 부여 테스트 ==");
System.out.println("보너스를 포함한 급여 : " + (1000000 + 200000) + "원");
/* 아래 처럼 의미를 부여하게 되면 어느 값이 급여인지, 보너스인지를 명확하게 알 수 있게 한다. */
int salary = 1000000;
int bonus = 200000;
System.out.println("보너스를 포함한 급여 : " + (salary + bonus) + "원");
그냥 숫자보다 훨씬 의미가 부각돼 다른 사람이 봐도 알 수 있다.
/* 목차 2. 한 번 저장해둔 값을 재사용하기 위한 목적 */
System.out.println("== 변수에 저장한 값 재사용 테스트 ==");
System.out.println("1번 고객에게 포인트를 100포인트 지급하였습니다.");
System.out.println("2번 고객에게 포인트를 100포인트 지급하였습니다.");
System.out.println("3번 고객에게 포인트를 100포인트 지급하였습니다.");
System.out.println("4번 고객에게 포인트를 100포인트 지급하였습니다.");
System.out.println("5번 고객에게 포인트를 100포인트 지급하였습니다.");
System.out.println("6번 고객에게 포인트를 100포인트 지급하였습니다.");
System.out.println("7번 고객에게 포인트를 100포인트 지급하였습니다.");
System.out.println("8번 고객에게 포인트를 100포인트 지급하였습니다.");
System.out.println("9번 고객에게 포인트를 100포인트 지급하였습니다.");
System.out.println("10번 고객에게 포인트를 100포인트 지급하였습니다.");
System.out.println();
int point = 100;
System.out.println("1번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
System.out.println("2번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
System.out.println("3번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
System.out.println("4번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
System.out.println("5번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
System.out.println("6번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
System.out.println("7번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
System.out.println("8번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
System.out.println("9번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
System.out.println("10번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
똑같이 출력되지만 변수로 재사용 가능하다.
/* 목차 3. 시간에 따라 변하는 값을 저장하고 사용할 목적 */
System.out.println("=== 변수에 저장된 값 변경 테스트 ===");
int sum = 0;
sum = sum + 10;
System.out.println("sum에 10을 더하면 현재 sum의 값은? : " + sum);
sum = sum + 10;
System.out.println("sum에 10이 있었으니 10을 추가로 더하면? " + sum);
sum = sum + 10;
System.out.println("sum에 20이 있었는데 추가로 10을 더 더하면? " + sum);
0
10
20
30
변하는 값을 저장하고 사용할 수 있다.
다양한 값의 형태별로 어느 정도의 크기를 하나의 값으로 취급할 것인지 미리 Compiler와 약속한 키워드이다.

char형의 변수를 cNum -> ch 로 변경
기본자료형(Primary type)과 참조자료형(Reference type)으로 나누어진다.
Primary type)| 타입 | 할당되는 메모리 크기 | 데이터 표현 범위 |
|---|---|---|
| byte | 1 바이트 | ~ |
| short | 2 바이트 | ~ |
| int | 4 바이트 | ~ |
| long | 8 바이트 | ~ |
int를 대표자료형으로 여기고, 특수한 경우가 아닌 이상 byte, short는 잘 사용하지 않는다.
| 타입 | 할당되는 메모리 크기 | 데이터 표현 범위 |
|---|---|---|
| float | 4 바이트 | ~ |
| double | 8 바이트 | ~ |
double을 대표 자료형으로 여기고, float는 특수한 목적이 있는 경우에만 사용하게 된다.
정수형과 실수형 둘 다 맨 앞 비트를
부호비트로 둔다.
| 타입 | 할당되는 메모리 크기 | 데이터 표현 범위 |
|---|---|---|
| char | 2 바이트 | ~ |
short와 동일하게 2바이트지만, 부호 비트 없이 16개의 비트를 모두 값 비트로 활용
| 타입 | 할당되는 메모리 크기 | 데이터 표현 범위 |
|---|---|---|
| boolean | 1 바이트 | true 혹은 false |
실제 사용하는 비트가 8비트 중 가장 오른쪽 1비트만 이용을 하지만 실제 할당되는 크기는 1바이트를 할당한다.
bNum = 1;
sNum = 2;
iNum = 4;
lNum = 6; // lNum은 long 자료형이지만, 자바는 6을 보고 int로 본다.
// long 형이지만, lNum = 2200000000 (22억) 으로 실행하면 에러가 생긴다. -> int로 보는데 넘어가니까.
// lNum = 2200000000; <- 오류 생김
lNum = 2200000000L; // 이것처럼 꼭 붙여야 한다.
fNum = 3.14f; // double형으로 인식되는 실수를 float에 담을 때는 f를 붙여야 한다.
dNum = 3.555;
ch = 'a';
ch = 97;
isTrue = true;
/*
## 설명. 변수를 활용한 합계 (sum), 평균 (avg) 출력*/
int kor = 90;
int math = 80;
int eng = 75;
int sum = kor + math + eng;
System.out.println("합계 : " + sum);
// int avg = sum / 3; // 정수 나누기 정수를 하면 소수점이 날아가기 때문에
double avg = sum / 3.0f; // 나눗셈은 일반적으로 실수 결과가 나오기에 double형
System.out.println("평균 = " + avg);