왕딱지 자바 · 2강 · 값에도 종류가 있어요 · 인쇄는 머리글/바닥글(날짜·URL)을 꺼 주세요 — 쪽 머리·꼬리는 이미 들어가요
dumok.net ·
dumok.net · 왕딱지 자바 ·
dumok.net ·
[ ] / –쪽 🏠
02
LESSON 02 · 15분

값에도 종류가 있어요

이름 붙은 칸에, 종류에 맞는 값을 담아요

딱지 지도 — 지금 여기

00준비운동
01첫 줄 출력
02값의 종류
03계산
04갈림길
05반복
06배열
07메서드
08오버로딩
09객체
10생성자
11문자열
12static
13상속
14재정의
15다형성
16인터페이스
17예외
18졸업
이번 강에서 뗄 딱지
  • 변수를 선언하고, 값을 처음 넣고(초기화), 새 값으로 바꿔요(재대입).
  • 다섯 가지 종류 int·double·char·boolean·String을 구별해요.
  • 작은따옴표 'A'와 큰따옴표 "A"를 구별해요.
  • 값을 넣지 않은 칸은 읽을 수 없다는 것을 컴파일 메시지로 확인해요.
도착점 코드를 보고 메모리 칸 그림을 그려요.
dumok.net
오늘의 딱지

지난 강에서 오늘로

1강에서 따옴표 안은 글자 그대로, 따옴표 밖의 1 + 2는 계산한 값 3이 나오는 걸 봤어요. 따옴표 없이 안녕하세요를 쓰면 Java가 ‘그런 이름이 없어요’ 하고 멈췄지요. 기억나시죠?

오늘은 그 ‘이름’을 직접 만들어요. 값을 담아 두는 이름 붙은 칸, 변수예요. Java는 칸을 만들 때 어떤 종류의 값을 담을 칸인지를 꼭 먼저 정해요. 이 점이 오늘의 핵심이에요.

  1. 변수를 선언하고, 값을 처음 넣고(초기화), 새 값으로 바꿔요(재대입).
  2. 다섯 가지 종류 int·double·char·boolean·String을 구별해요.
  3. 작은따옴표 'A'와 큰따옴표 "A"를 구별해요.
  4. 값을 넣지 않은 칸은 읽을 수 없다는 것을 컴파일 메시지로 확인해요.

오늘의 도착점: 코드를 보고 메모리 칸 그림을 그려요. 칸 이름, 종류, 지금 들어 있는 값을 적고, 실행 결과와 맞춰 봐요.

오늘 외울 딱지
✂ 오려서 들고 다니세요
변수
개념
값을 담아 두는 이름 붙은 칸
선언
개념
‘이런 종류, 이런 이름의 칸을 만들어요’라고 알리는 것. int age;
초기화
개념
칸에 처음 값을 넣는 것. int age = 15;
재대입
개념
이미 있는 칸의 값을 새 값으로 바꾸는 것. age = 16;
=
기호
‘오른쪽 값을 왼쪽 칸에 넣어요’. 수학의 ‘같다’가 아니에요
int
예약어
정수(소수점 없는 수) 칸. 15, -3, 0
double
예약어
소수점 있는 수 칸. 3.5, 7.0
char
예약어
글자 한 개 칸. 작은따옴표 'A'
boolean
예약어
참·거짓 칸. true 또는 false 둘 중 하나
String
클래스
글자 여러 개(글자 줄). 시험에서는 문자열이라고 불러요. 큰따옴표 "Java". 첫 글자 S가 대문자
생활 비유라벨 붙은 반찬통

냉장고에 반찬통이 여러 개 있다고 생각해 볼게요. 통마다 이름 라벨이 붙어 있고, 통의 모양이 정해져 있어요. 국 통에는 국을, 김치 통에는 김치를 담지요.

반찬통에서Java에서
통에 붙인 이름 라벨변수 이름(age)
통의 모양(국 통, 양념 종지…)종류, 즉 타입(int, double …)
통에 든 반찬값(15)
새 통을 꺼내 라벨 붙이기선언 int age;
처음 반찬 담기초기화 = 15
반찬을 비우고 새로 담기재대입 age = 16;

Java의 칸은 모양이 깐깐해요. 정수 통에 소수 3.5를 담으려 하면 담기 전에 거절해요(컴파일 오류). 양념 종지(글자 한 개 char)에 반찬 한 줄(String)을 넣으려 해도 거절이에요.

새로 담으면 예전 반찬은 버려져요. 통 하나에는 값이 늘 하나만 들어 있어요.

비유의 한계: 실제 메모리 칸은 통처럼 눈에 보이지 않아요. 그리고 String은 반찬통과 조금 다르게 담겨요. 그 그림은 9강에서 다시 그려요.

메모리 그림칸 하나의 세 가지 정보
그림 2-1 칸 하나의 세 정보메모리 칸 하나. 칸 위 글씨 int age, 칸 안 값 15. 아래 설명: 이름 age, 종류 int, 값 15.변수 칸(main 안)int age15위 글씨 = 종류 + 이름(선언 때 정해져요). 칸 안 = 지금값(바뀔 수 있어요).
그림 2-1 칸 하나의 세 정보메모리 칸 하나. 칸 위 글씨 int age, 칸 안 값 15. 아래 설명: 이름 age, 종류 int, 값 15.변수 칸(main 안)int age15위 글씨 = 종류 + 이름(선언 때정해져요). 칸 안 = 지금 값(바뀔 수있어요).
그림 2-1변수 칸은 이름·종류·값 세 가지로 그려요. 이름과 종류는 선언 때 정해지고, 바뀌는 것은 값뿐이에요.

변수 칸을 그릴 때는 늘 세 가지를 적어요. 이름(age), 종류(int), 그리고 지금 들어 있는 값(15)이에요. 이름과 종류는 선언할 때 한 번 정해지면 바뀌지 않아요. 바뀌는 것은 값뿐이에요.

예제 1칸을 만들고 꺼내 보여요 정
Main.java
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 · 새 값을 넣으면 예전 값은 사라져요 정

Main.java
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가 없어요. 칸은 이미 있으니 새로 만들지 않고 값만 바꿔요. 이게 재대입이에요.

그림 2-2 재대입 전과 후표. 실행한 줄, score 칸, 화면. 3줄 int score = 70 → 70. 4줄 출력 → 화면 70. 5줄 score = 85 → 85 강조 별표, 70은 지워짐. 6줄 출력 → 화면 85.실행한 줄score 칸화면int score = 70;70println(score);7070score = 85;85★println(score);8585칸은 하나뿐이에요. 85를 넣는 순간 70은 남지 않아요.
그림 2-2 재대입 전과 후표. 실행한 줄, score 칸, 화면. 3줄 int score = 70 → 70. 4줄 출력 → 화면 70. 5줄 score = 85 → 85 강조 별표, 70은 지워짐. 6줄 출력 → 화면 85.실행한 줄score칸화면int score =70;70println(score);7070score = 85;85★println(score);8585칸은 하나뿐이에요. 85를 넣는 순간70은 남지 않아요.
그림 2-2score = 85; 는 새 칸을 만들지 않고 같은 칸의 값만 바꿔요. 70은 사라져요.

한 줄 정리: 앞에 타입이 붙으면 새 칸 만들기, 타입 없이 이름 = 값;이면 값 바꾸기예요.

예제 3 · 다섯 종류의 칸 정

이번 코드는 길어서 main 안에 들어갈 문장만 두 상자로 나눠 보여 줘요. 틀 네 줄(1강) 사이, main의 중괄호 안에 첫 상자 다섯 줄과 둘째 상자 다섯 줄을 이어서 넣고 Run해요. 한 상자만 넣으면 오류가 나요.

main 안 ① 칸 다섯 개 만들기:

Main.java
int count = 3;double height = 162.5;char grade = 'A';boolean pass = true;String name = "영숙";

main 안 ② 다섯 칸 보여 주기(①에 이어서):

Main.java
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
영숙
그림 2-3 다섯 종류의 칸변수 칸 다섯 개 세로. int count 3, double height 162.5, char grade 작은따옴표 A, boolean pass true, String name 큰따옴표 영숙.변수 칸(main 안)int count3double height162.5char grade'A'boolean passtrueString name"영숙"String 칸이 실제로 어떻게 담기는지는 9강에서 다시그려요.
그림 2-3 다섯 종류의 칸변수 칸 다섯 개 세로. int count 3, double height 162.5, char grade 작은따옴표 A, boolean pass true, String name 큰따옴표 영숙.변수 칸(main 안)int count3double height162.5char grade'A'boolean passtrueString name"영숙"String 칸이 실제로 어떻게 담기는지는9강에서 다시 그려요.
그림 2-3종류마다 값을 적는 법이 달라요. String만 첫 글자가 대문자예요.
종류담는 값값 적는 법예
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에게는 다른 값이에요.

Main.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 칸에 큰따옴표 값을 넣으면 거절당해요.

Main.java
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 error

incompatible types는 ‘종류가 맞지 않아요’, 뒤는 ‘String을 char로 바꿀 수 없어요’라는 뜻이에요. 큰따옴표로 감싼 순간 그 값은 String이 되거든요. 글자가 하나뿐이어도요.

그림 2-4 작은따옴표와 큰따옴표비교 표. 작은따옴표 A는 char, 글자 꼭 한 개, 양념 종지. 큰따옴표 A는 String, 글자 줄(0개 이상), 반찬통. 작은따옴표 AB는 오류, 큰따옴표 AB는 가능.적은 값종류글자 수비유'A'char꼭 한 개양념 종지"A"String0개 이상반찬통'AB'오류★두 개는 안돼요"AB"String두 개반찬통
그림 2-4 작은따옴표와 큰따옴표비교 표. 작은따옴표 A는 char, 글자 꼭 한 개, 양념 종지. 큰따옴표 A는 String, 글자 줄(0개 이상), 반찬통. 작은따옴표 AB는 오류, 큰따옴표 AB는 가능.적은 값종류글자 수비유'A'char꼭 한 개양념종지"A"String0개 이상반찬통'AB'오류★두 개는안 돼요"AB"String두 개반찬통
그림 2-4화면에는 둘 다 A로 보이지만 종류가 달라요.

한 줄 정리: 작은따옴표는 글자 한 개(char), 큰따옴표는 글자 줄(String)이에요.

예제 5 · 값을 넣지 않은 칸은 읽을 수 없어요 정

칸을 선언만 하고 값을 넣지 않은 채 꺼내 보면 어떻게 될까요?

Main.java
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가 아무 값도 자동으로 넣어 주지 않아요. 빈 통을 꺼내 보여 달라고 하니, 실행하기 전에 컴파일러가 막은 거예요.

고치는 법은 간단해요. 읽기 전에 값을 넣어요.

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도 바뀔까요?

Main.java
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와는 상관없어요.

그림 2-5 값 복사표. 3줄 int a = 5: a 5, b 없음. 4줄 int b = a: a 5, b 5 강조(복사). 5줄 a = 9: a 9 강조, b 5 그대로.실행한 줄a 칸b 칸int a = 5;5★(없음)int b = a;55★a = 9;9★5a와 b는 연결된 게 아니에요. 복사본을 받았을뿐이에요(9강 객체 칸과 비교해요).
그림 2-5 값 복사표. 3줄 int a = 5: a 5, b 없음. 4줄 int b = a: a 5, b 5 강조(복사). 5줄 a = 9: a 9 강조, b 5 그대로.실행한 줄a 칸b 칸int a = 5;5★(없음)int b = a;55★a = 9;9★5a와 b는 연결된 게 아니에요. 복사본을받았을 뿐이에요(9강 객체 칸과비교해요).
그림 2-5b = a; 는 그 순간 a의 값을 복사해 넣어요. 그 뒤 a가 바뀌어도 b는 그대로예요.

이 그림은 꼭 기억해 두세요. 9강에서는 객체를 가리키는 칸도 봐요. 그 칸에는 물건 자체가 아니라 물건을 찾아가는 값이 담겨요. 그때도 칸의 값을 복사하지만, 복사 뒤에 보이는 모습은 달라요. 오늘 그림과 나란히 놓고 비교할 거예요.

한 줄 정리: int끼리 b = a;는 값 복사예요. 그 뒤로 둘은 따로 움직여요.

예제 7 · 소수 칸과 정수 칸

Main.java
public class Main {    public static void main(String[] args) {        double d = 7;        System.out.println(d);    }}
실행 결과
7.0

정수 7을 소수 칸에 넣으면 Java가 자동으로 7.0으로 바꿔 담아요. 큰 통에 작은 반찬을 담는 셈이라 문제가 없어요. 반대는 안 돼요.

Main.java
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 error

possible lossy conversion은 ‘바꾸면 일부를 잃을 수 있어요’라는 뜻이에요. 7.5를 정수 칸에 넣으면 .5를 잃으니까요. Java는 이렇게 값이 깎일 수 있는 넣기를 몰래 해 주지 않고 멈춰요. 일부러 깎는 방법은 3강에서 배워요.

한 줄 정리: 정수 → 소수 칸은 자동, 소수 → 정수 칸은 오류예요.

결과 따라 적기칸의 값이 언제 바뀌나

main 안에 넣을 문장만 보여요. 표의 줄 번호는 이 상자의 줄 번호예요.

Main.java
int p = 3;int q = p;p = 4;q = p;p = 1;System.out.println(p);System.out.println(q);
실행한 줄pq
1 int p = 3;3(없음)
2 int q = p;33
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는 이렇게 써요.

Main.java
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;는 값 복사라서 그 뒤로 둘이 따로 움직인다는 것을 그림으로 그릴 수 있어요.

오늘 내가 뗀 딱지:  다시 볼 곳:

dumok.net · 왕딱지 — 코딩 초보 딱지 떼기