값에도 종류가 있어요
딱지 지도 — 지금 여기
- 변수를 선언하고, 값을 처음 넣고(초기화), 새 값으로 바꿔요(재대입).
- 다섯 가지 종류
int·double·char·boolean·String을 구별해요. - 작은따옴표
'A'와 큰따옴표"A"를 구별해요. - 값을 넣지 않은 칸은 읽을 수 없다는 것을 컴파일 메시지로 확인해요.
지난 강에서 오늘로
1강에서 따옴표 안은 글자 그대로, 따옴표 밖의 1 + 2는 계산한 값 3이 나오는 걸 봤어요. 따옴표 없이 안녕하세요를 쓰면 Java가 ‘그런 이름이 없어요’ 하고 멈췄지요. 기억나시죠?
오늘은 그 ‘이름’을 직접 만들어요. 값을 담아 두는 이름 붙은 칸, 변수예요. Java는 칸을 만들 때 어떤 종류의 값을 담을 칸인지를 꼭 먼저 정해요. 이 점이 오늘의 핵심이에요.
- 변수를 선언하고, 값을 처음 넣고(초기화), 새 값으로 바꿔요(재대입).
- 다섯 가지 종류
int·double·char·boolean·String을 구별해요. - 작은따옴표
'A'와 큰따옴표"A"를 구별해요. - 값을 넣지 않은 칸은 읽을 수 없다는 것을 컴파일 메시지로 확인해요.
오늘의 도착점: 코드를 보고 메모리 칸 그림을 그려요. 칸 이름, 종류, 지금 들어 있는 값을 적고, 실행 결과와 맞춰 봐요.
int age;int age = 15;age = 16;'A'true 또는 false 둘 중 하나"Java". 첫 글자 S가 대문자냉장고에 반찬통이 여러 개 있다고 생각해 볼게요. 통마다 이름 라벨이 붙어 있고, 통의 모양이 정해져 있어요. 국 통에는 국을, 김치 통에는 김치를 담지요.
| 반찬통에서 | Java에서 |
|---|---|
| 통에 붙인 이름 라벨 | 변수 이름(age) |
| 통의 모양(국 통, 양념 종지…) | 종류, 즉 타입(int, double …) |
| 통에 든 반찬 | 값(15) |
| 새 통을 꺼내 라벨 붙이기 | 선언 int age; |
| 처음 반찬 담기 | 초기화 = 15 |
| 반찬을 비우고 새로 담기 | 재대입 age = 16; |
Java의 칸은 모양이 깐깐해요. 정수 통에 소수 3.5를 담으려 하면 담기 전에 거절해요(컴파일 오류). 양념 종지(글자 한 개 char)에 반찬 한 줄(String)을 넣으려 해도 거절이에요.
새로 담으면 예전 반찬은 버려져요. 통 하나에는 값이 늘 하나만 들어 있어요.
비유의 한계: 실제 메모리 칸은 통처럼 눈에 보이지 않아요. 그리고 String은 반찬통과 조금 다르게 담겨요. 그 그림은 9강에서 다시 그려요.
변수 칸을 그릴 때는 늘 세 가지를 적어요. 이름(age), 종류(int), 그리고 지금 들어 있는 값(15)이에요. 이름과 종류는 선언할 때 한 번 정해지면 바뀌지 않아요. 바뀌는 것은 값뿐이에요.
public class Main { public static void main(String[] args) { int age = 15; System.out.println(age); System.out.println("age"); }}
15 age
조각으로 읽어 볼게요.
| 조각 | 뜻 |
|---|---|
int | 정수 칸을 만들어요 |
age | 칸의 이름 |
= | 오른쪽 값을 왼쪽 칸에 넣어요 |
15 | 넣을 값 |
; | 문장 끝 |
println(age)는 따옴표가 없으니 age 칸을 찾아 그 안의 값 15를 보여 줘요. println("age")는 따옴표 안이니 글자 그대로 age예요. 1강 예제 5와 같은 규칙이에요.
한 줄 정리: int age = 15;는 ‘정수 칸 age를 만들고 15를 넣어요’예요.
예제 2 · 새 값을 넣으면 예전 값은 사라져요 정
public class Main { public static void main(String[] args) { int score = 70; System.out.println(score); score = 85; System.out.println(score); }}
결과를 예상해 볼까요? 70이 두 번일까요, 70 다음에 85일까요?
70 85
다섯째 줄 score = 85;에는 앞에 int가 없어요. 칸은 이미 있으니 새로 만들지 않고 값만 바꿔요. 이게 재대입이에요.
한 줄 정리: 앞에 타입이 붙으면 새 칸 만들기, 타입 없이 이름 = 값;이면 값 바꾸기예요.
예제 3 · 다섯 종류의 칸 정
이번 코드는 길어서 main 안에 들어갈 문장만 두 상자로 나눠 보여 줘요. 틀 네 줄(1강) 사이, main의 중괄호 안에 첫 상자 다섯 줄과 둘째 상자 다섯 줄을 이어서 넣고 Run해요. 한 상자만 넣으면 오류가 나요.
main 안 ① 칸 다섯 개 만들기:
int count = 3;double height = 162.5;char grade = 'A';boolean pass = true;String name = "영숙";
main 안 ② 다섯 칸 보여 주기(①에 이어서):
System.out.println(count);System.out.println(height);System.out.println(grade);System.out.println(pass);System.out.println(name);
3 162.5 A true 영숙
| 종류 | 담는 값 | 값 적는 법 | 예 |
|---|---|---|---|
int | 정수 | 그냥 숫자 | 3, -10, 0 |
double | 소수 | 소수점 있는 숫자 | 162.5, 7.0 |
char | 글자 한 개 | 작은따옴표 하나로 감싸요 | 'A', '가' |
boolean | 참·거짓 | true / false (따옴표 없음) | true |
String | 글자 줄 | 큰따옴표로 감싸요 | "영숙", "Java" |
boolean의 true는 따옴표가 없어요. "true"라고 쓰면 그건 네 글자짜리 String이에요. 참·거짓 값은 4강 조건문에서 많이 써요.
String만 첫 글자가 대문자예요. 나머지 넷(int, double, char, boolean)은 소문자로 쓰는 기본형이고, String은 클래스라는 다른 무리예요. 클래스가 무엇인지는 9강에서 풀어요. 오늘은 ‘String은 대문자 S’만 기억해요.
한 줄 정리: 칸을 만들 때 종류를 먼저 쓰고, 값은 그 종류에 맞게 적어요.
예제 4 · 작은따옴표와 큰따옴표 정
'A'와 "A"는 화면에서는 똑같이 A로 보여요. 하지만 Java에게는 다른 값이에요.
public class Main { public static void main(String[] args) { char c = 'A'; String s = "A"; System.out.println(c); System.out.println(s); }}
A A
결과만 보면 같지요. 그런데 char 칸에 큰따옴표 값을 넣으면 거절당해요.
public class Main { public static void main(String[] args) { char c = "A"; System.out.println(c); }}
Main.java:3: error: incompatible types: String cannot be converted to char
char c = "A";
^
1 errorincompatible types는 ‘종류가 맞지 않아요’, 뒤는 ‘String을 char로 바꿀 수 없어요’라는 뜻이에요. 큰따옴표로 감싼 순간 그 값은 String이 되거든요. 글자가 하나뿐이어도요.
한 줄 정리: 작은따옴표는 글자 한 개(char), 큰따옴표는 글자 줄(String)이에요.
예제 5 · 값을 넣지 않은 칸은 읽을 수 없어요 정
칸을 선언만 하고 값을 넣지 않은 채 꺼내 보면 어떻게 될까요?
public class Main { public static void main(String[] args) { int x; System.out.println(x); }}
Main.java:4: error: variable x might not have been initialized
System.out.println(x);
^
1 error‘x에 값이 들어가지 않았을 수 있어요’라는 뜻이에요. main 안에서 만든 칸(지역 변수라고 해요)은 Java가 아무 값도 자동으로 넣어 주지 않아요. 빈 통을 꺼내 보여 달라고 하니, 실행하기 전에 컴파일러가 막은 거예요.
고치는 법은 간단해요. 읽기 전에 값을 넣어요.
public class Main { public static void main(String[] args) { int x; x = 10; System.out.println(x); }}
10
선언(int x;)과 첫 값 넣기(x = 10;)를 두 줄로 나눠도 돼요. 읽기 전에 값이 들어가 있기만 하면 돼요.
한 줄 정리: main 안의 칸은 값을 넣기 전에는 꺼내 쓸 수 없어요.
예제 6 · 칸에서 칸으로 값을 옮기면 정
b = a;는 ‘a 칸의 값을 복사해서 b 칸에 넣어요’예요. 복사한 뒤 a를 바꾸면 b도 바뀔까요?
public class Main { public static void main(String[] args) { int a = 5; int b = a; a = 9; System.out.println(a); System.out.println(b); }}
9 5
b는 그대로 5예요. 넷째 줄에서 b 칸에 들어간 것은 그 순간 a에 있던 값 5의 복사본이에요. a와 b가 연결된 게 아니에요. 그래서 나중에 a를 9로 바꿔도 b와는 상관없어요.
이 그림은 꼭 기억해 두세요. 9강에서는 객체를 가리키는 칸도 봐요. 그 칸에는 물건 자체가 아니라 물건을 찾아가는 값이 담겨요. 그때도 칸의 값을 복사하지만, 복사 뒤에 보이는 모습은 달라요. 오늘 그림과 나란히 놓고 비교할 거예요.
한 줄 정리: int끼리 b = a;는 값 복사예요. 그 뒤로 둘은 따로 움직여요.
예제 7 · 소수 칸과 정수 칸
public class Main { public static void main(String[] args) { double d = 7; System.out.println(d); }}
7.0
정수 7을 소수 칸에 넣으면 Java가 자동으로 7.0으로 바꿔 담아요. 큰 통에 작은 반찬을 담는 셈이라 문제가 없어요. 반대는 안 돼요.
public class Main { public static void main(String[] args) { int n = 7.5; System.out.println(n); }}
Main.java:3: error: incompatible types: possible lossy conversion from double to int
int n = 7.5;
^
1 errorpossible lossy conversion은 ‘바꾸면 일부를 잃을 수 있어요’라는 뜻이에요. 7.5를 정수 칸에 넣으면 .5를 잃으니까요. Java는 이렇게 값이 깎일 수 있는 넣기를 몰래 해 주지 않고 멈춰요. 일부러 깎는 방법은 3강에서 배워요.
한 줄 정리: 정수 → 소수 칸은 자동, 소수 → 정수 칸은 오류예요.
main 안에 넣을 문장만 보여요. 표의 줄 번호는 이 상자의 줄 번호예요.
int p = 3;int q = p;p = 4;q = p;p = 1;System.out.println(p);System.out.println(q);
| 실행한 줄 | p | q |
|---|---|---|
1 int p = 3; | 3 | (없음) |
2 int q = p; | 3 | 3 |
3 p = 4; | ||
4 q = p; | ||
5 p = 1; |
1 4
대조 답: 3줄 p 4 / q 3, 4줄 p 4 / q 4, 5줄 p 1 / q 4. 4줄에서 q가 받은 것은 그 순간 p의 값 4예요. 5줄에서 p가 1로 바뀌어도 q는 4 그대로예요.
연습 1. 알맞은 종류를 써요.
| 담을 값 | 종류 |
|---|---|
| 나이 15 | |
| 키 158.3 | |
| 혈액형 글자 하나 'O' | |
| 합격했나요? 예 | |
| 이름 "왕두목" |
연습 2. 정수 칸 money를 만들어 1000을 넣고, 값을 1500으로 바꾼 뒤 출력하는 main 안 문장 세 줄을 써요.
연습 3. 다음 중 컴파일 오류가 나는 줄에 ○ 해요.
① double a = 3; ② int b = 2.0; ③ char c = 'K'; ④ String d = 'K';
스스로 대조하는 답
연습 1은 int, double, char, boolean, String이에요. 연습 2는 이렇게 써요.
int money = 1000;money = 1500;System.out.println(money);
1500
연습 3은 ②와 ④예요. ②는 소수를 정수 칸에 넣어서, ④는 작은따옴표 값(char)을 String 칸에 넣어서 종류가 맞지 않아요.
학습용 창작 문항이에요.
문제. 다음 Java 코드의 실행 결과를 쓰시오.
public class Main { public static void main(String[] args) { int x = 2; int y = x; x = 7; double z = x; System.out.println(y); System.out.println(z); }}
내 답:
정답먼저 풀고 눌러서 펼쳐 보세요
2 7.0
해설: 4줄에서 y는 그때의 x 값 2를 복사해 받아요. 5줄에서 x를 7로 바꿔도 y는 2 그대로예요. 6줄에서 정수 7이 소수 칸 z에 들어가면서 7.0이 돼요. 7로 쓰면 오답이에요. double 칸의 값은 소수점이 붙어 출력돼요.
딱지 떼기
도장
- 선언·초기화·재대입을 코드로 구별할 수 있어요.
int·double·char·boolean·String에 맞는 값을 적을 수 있어요.'A'와"A"가 다른 종류라는 것을 알아요.- 값을 넣지 않은 지역 변수는 읽을 수 없다는 것을 알아요.
b = a;는 값 복사라서 그 뒤로 둘이 따로 움직인다는 것을 그림으로 그릴 수 있어요.
오늘 내가 뗀 딱지: 다시 볼 곳: