왕딱지 자바 · 1강 · Java의 첫 줄과 출력 · 인쇄는 머리글/바닥글(날짜·URL)을 꺼 주세요 — 쪽 머리·꼬리는 이미 들어가요
dumok.net ·
dumok.net · 왕딱지 자바 ·
dumok.net ·
[ ] / –쪽 🏠
01
LESSON 01 · 15분

Java의 첫 줄과 출력

틀은 그대로 두고, 바꿀 줄만 바꿔요

딱지 지도 — 지금 여기

00준비운동
01첫 줄 출력
02값의 종류
03계산
04갈림길
05반복
06배열
07메서드
08오버로딩
09객체
10생성자
11문자열
12static
13상속
14재정의
15다형성
16인터페이스
17예외
18졸업
이번 강에서 뗄 딱지
  • 다섯 줄에서 클래스 틀·main·중괄호·문장 끝 ;의 역할을 구별해요.
  • println과 print로 줄바꿈과 빈칸을 정확하게 만들어요.
  • public class 뒤의 이름과 파일 이름이 같아야 한다는 것을 읽어요.
도착점 결과 창에 나올 글자를 칸 하나, 줄바꿈 하나까지 미리 적고, 실행해서 똑같이 나오는지 확인해요.
dumok.net
오늘의 딱지

지난 강에서 오늘로

0강에서 다섯 줄을 따라 쳐서 안녕하세요를 화면에 띄웠어요. Run을 누르면 컴파일(번역) → JVM 실행이 이어진다는 것도 봤지요. 기억나시죠?

오늘은 그 다섯 줄을 조각으로 나눠 읽어요. 다섯 줄 중 네 줄은 매번 그대로 두는 틀이고, 우리가 바꾸는 곳은 가운데 한 줄뿐이라는 걸 알게 될 거예요. 그다음 출력 도구 두 개, println과 print의 차이를 결과 칸 하나하나로 확인해요.

  1. 다섯 줄에서 클래스 틀·main·중괄호·문장 끝 ;의 역할을 구별해요.
  2. println과 print로 줄바꿈과 빈칸을 정확하게 만들어요.
  3. public class 뒤의 이름과 파일 이름이 같아야 한다는 것을 읽어요.

오늘의 도착점: 결과 창에 나올 글자를 칸 하나, 줄바꿈 하나까지 미리 적고, 실행해서 똑같이 나오는지 확인해요.

오늘 외울 딱지
✂ 오려서 들고 다니세요
class
예약어
코드를 담는 바깥 틀(클래스). 오늘은 ‘이름표 붙은 큰 상자’로 봐요
main
이름
프로그램이 시작하는 곳. Run하면 JVM이 여기 첫 줄부터 실행해요
{ }
기호
중괄호. 틀이 어디서 시작하고 어디서 끝나는지 표시해요
;
기호
세미콜론. 문장(명령) 하나가 끝났다는 표시
System.out.println( )
출력
괄호 안을 화면에 보여 주고 줄을 바꿔요
System.out.print( )
출력
괄호 안을 화면에 보여 주고 줄을 바꾸지 않아요
" "
기호
글자 그대로 보여 줄 부분의 시작과 끝

새 말 두 개만 먼저 풀어 둘게요.

  • 예약어는 Java가 미리 뜻을 정해 둔 낱말이에요. class, public, static, void 같은 것이에요. 우리가 다른 뜻으로 쓸 수 없어요. main, String, System은 예약어가 아니라 이름이에요.
  • 문장은 컴퓨터에게 시키는 명령 하나예요. 오늘의 출력문 끝에는 ;를 붙여요. 나중에 배울 if·for처럼 중괄호로 묶는 문장까지 모두 ;로 끝내는 것은 아니에요.
생활 비유건물, 정문, 전광판

Java 프로그램을 건물 하나라고 생각해 볼게요.

건물에서Java에서하는 일
건물 이름이 붙은 울타리public class Main { … }코드를 담는 바깥 틀. 이름은 Main
손님이 들어오는 정문public static void main(String[] args) { … }프로그램이 시작하는 곳
정문 안 안내 데스크의 일 순서중괄호 안의 문장들위에서 아래로 하나씩 해요
안내 전광판결과 영역출력한 글자가 나타나요

전광판에는 깜박이는 커서가 있어요. 커서는 ‘다음 글자가 찍힐 자리’예요.

  • println은 글을 쓰고 나서 커서를 다음 줄 맨 앞으로 옮겨요. ‘쓰고 줄 바꿈’이에요.
  • print는 글을 쓰고 커서를 그 자리에 둬요. 다음 글은 바로 옆에 이어서 써져요.

이름의 ln은 line(줄)에서 왔어요. println을 ‘프린트 라인’이라고 읽으면 ‘줄 단위로 쓴다’는 뜻이 떠올라요.

비유의 한계: 실제 건물에는 문이 여러 개 있지만, 오늘 우리 프로그램의 시작점은 main 하나예요.

틀 그림바깥 상자, 안쪽 상자, 그리고 바꿀 줄
그림 1-1 다섯 줄은 상자 두 겹겹친 상자 그림. 바깥 상자 머리 public class Main 여는 중괄호, 오른쪽 이름표 클래스 틀. 그 안 상자 머리 public static void main(String[] args) 여는 중괄호, 이름표 시작점. 그 안 노란 줄 System.out.println("안녕하세요"); 이름표 바꿀 줄. 각 상자 아래 닫는 중괄호.public class Main {클래스 틀시작점public static void main(String[]args) {System.out.println("안녕하세요");main 끝}클래스 끝}노란 줄이 실제로 일하는 문장이에요. 나머지는 그대로두는 틀이에요.
그림 1-1 다섯 줄은 상자 두 겹겹친 상자 그림. 바깥 상자 머리 public class Main 여는 중괄호, 오른쪽 이름표 클래스 틀. 그 안 상자 머리 public static void main(String[] args) 여는 중괄호, 이름표 시작점. 그 안 노란 줄 System.out.println("안녕하세요"); 이름표 바꿀 줄. 각 상자 아래 닫는 중괄호.public class Main {클래스 틀시작점public static voidmain(String[] args) {System.out.println("안녕하세요");main 끝}클래스 끝}노란 줄이 실제로 일하는 문장이에요.나머지는 그대로 두는 틀이에요.
그림 1-1바깥 상자는 클래스, 안쪽 상자는 main이에요. 우리가 바꾸는 것은 노란 줄뿐이에요.

그림처럼 다섯 줄은 상자 두 겹이에요. 바깥 상자는 클래스, 안쪽 상자는 main이에요. 우리가 바꾸는 것은 노란 줄, 즉 main 안쪽의 문장이에요. 나머지 네 줄은 앞으로 오랫동안 그대로 써요.

안쪽 상자의 머리 줄 public static void main(String[] args)는 낱말이 많아서 겁이 나지요? 바로 아래에서 한 조각씩 나눠 볼게요.

낱말 해부main 줄을 아홉 조각으로
그림 1-2 main 줄 낱말 해부위에 낱말 상자 두 줄. 1 public, 2 static, 3 void, 4 main / 5 여는 소괄호, 6 String, 7 대괄호 두 개, 8 args, 9 닫는 소괄호. 아래 풀이: 1 public 누구나(JVM도) 부를 수 있게 열어 둠 13강, 2 static 객체를 만들지 않고 바로 부를 수 있음 12강, 3 void 일을 마치고 돌려주는 값이 없음 7강, 4 main 시작점 이름, JVM이 이 이름을 찾아 시작 7강, 5 여는 소괄호 받을 것을 적는 자리 시작 7강, 6 String 글자 줄 종류 2강·11강, 7 대괄호 여러 개를 담는 배열 표시 6강, 8 args 받는 칸의 이름 6강, 9 닫는 소괄호 받을 것 자리 끝 7강.1public2static3void4main5(6String7[]8args9)1public누구나(JVM도) 부를 수 있게열어 둠13강2static객체를 만들지 않고 바로 부를수 있음12강3void일을 마치고 돌려주는 값이없음7강4main시작점 이름. JVM이 이 이름을찾아 시작7강5(받을 것을 적는 자리 시작7강6String글자 줄 종류2·11강7[]여러 개를 담는 배열 표시6강8args받은 것을 담는 칸 이름6강9)받을 것 자리 끝7강
그림 1-2 main 줄 낱말 해부위에 낱말 상자 두 줄. 1 public, 2 static, 3 void, 4 main / 5 여는 소괄호, 6 String, 7 대괄호 두 개, 8 args, 9 닫는 소괄호. 아래 풀이: 1 public 누구나(JVM도) 부를 수 있게 열어 둠 13강, 2 static 객체를 만들지 않고 바로 부를 수 있음 12강, 3 void 일을 마치고 돌려주는 값이 없음 7강, 4 main 시작점 이름, JVM이 이 이름을 찾아 시작 7강, 5 여는 소괄호 받을 것을 적는 자리 시작 7강, 6 String 글자 줄 종류 2강·11강, 7 대괄호 여러 개를 담는 배열 표시 6강, 8 args 받는 칸의 이름 6강, 9 닫는 소괄호 받을 것 자리 끝 7강.1public2static3void4main5(6String7[]8args9)1public누구나(JVM도) 부를수 있게 열어둠13강2static객체를 만들지않고 바로 부를수 있음12강3void일을 마치고돌려주는 값이없음7강4main시작점 이름.JVM이 이이름을 찾아시작7강5(받을 것을 적는자리 시작7강6String글자 줄 종류2·11강7[]여러 개를 담는배열 표시6강8args받은 것을 담는칸 이름6강9)받을 것 자리끝7강
그림 1-2시작점 줄은 낱말 아홉 개예요. 지금은 하는 일만 한 줄씩 알고 철자 그대로 두면 돼요. 오른쪽은 자세히 다시 나오는 강이에요.
낱말무슨 일을 하나요(한 줄)자세히는
public누구나 부를 수 있게 문을 열어 둬요. 프로그램을 시작하는 JVM도 밖에서 부르니까 열려 있어야 해요13강 예제 5 끝
static객체를 만들지 않고 바로 부를 수 있어요. 시작할 때는 아직 Main 객체를 만들지 않았거든요7강에서 붙여 쓰고, 12강에서 까닭
void일을 마치고 돌려주는 값이 없어요7강
main시작점의 이름이에요. JVM이 이 이름을 찾아 첫 줄부터 실행해요7강
(이 일이 받을 것을 적는 자리가 시작돼요7강
String받을 것의 종류: 글자 줄2강·11강
[]그 글자 줄을 여러 개 담는 배열 표시6강
args받은 것을 담는 칸의 이름. 관례로 이렇게 써요6강
)받을 것 자리가 끝나요7강

한 문장으로 이으면 ‘누구나 부를 수 있고(public), 객체 없이 바로 부를 수 있고(static), 돌려주는 값은 없는(void), 시작점(main)이며, 글자 줄 여러 개(String[])를 args라는 칸으로 받아요’예요.

지금은 이 표를 외워 두면 충분해요. 직접 바꿀 일은 없고, 철자 그대로 두는 틀이에요. 오른쪽 칸의 강에 가면 그 낱말을 다시 불러와 자세히 풀어요.

예제 1다섯 줄을 조각으로 읽어요 정프

0강의 코드를 다시 봐요. 이번에는 줄마다 역할을 붙여 읽어요.

Main.java
public class Main {    public static void main(String[] args) {        System.out.println("안녕하세요");    }}
실행 결과
안녕하세요
줄코드역할
1public class Main {클래스 틀 시작. 이름은 Main
2public static void main(String[] args) {시작점 main 시작
3System.out.println("안녕하세요");실제로 일하는 문장
4}main 끝
5}클래스 끝

넷째 줄과 다섯째 줄은 둘 다 }예요. 어느 것이 무엇을 닫는지는 들여쓰기를 보면 알아요. 넷째 줄 }는 둘째 줄과 같은 깊이에서 시작하니까 main을 닫고, 다섯째 줄 }는 첫째 줄과 같은 깊이니까 클래스를 닫아요.

들여쓰기(줄 앞의 빈칸)는 사람이 읽기 좋게 하려고 넣어요. Java는 들여쓰기가 틀려도 실행은 해요. 그래도 짝을 찾으려면 꼭 맞춰 써요.

한 줄 정리: 다섯 줄 중 네 줄은 틀이고, main 안의 문장이 실제로 일해요.

예제 2 · println 세 번 정프

main 안에 문장을 세 개 넣어 볼게요. 틀 네 줄은 그대로예요.

Main.java
public class Main {    public static void main(String[] args) {        System.out.println("왕");        System.out.println("딱");        System.out.println("지");    }}

실행 결과를 예상해 보세요. 한 줄일까요, 세 줄일까요?

실행 결과
왕
딱
지

세 줄이에요. println은 쓰고 나서 줄을 바꾸니까요. 문장은 위에서 아래로 한 번씩 실행돼요. 순서를 바꿔 쓰면 화면 순서도 바뀌어요.

그림 1-3 println 세 번의 결과 칸결과 칸 그림. 1줄 왕 다음 줄바꿈 칸, 2줄 딱 다음 줄바꿈 칸, 3줄 지. 왼쪽 이름표 println 세 개.println왕↵println딱↵println지↵ 칸 = 줄바꿈. 마지막 println의 줄바꿈은 화면에보이지 않아요.
그림 1-3 println 세 번의 결과 칸결과 칸 그림. 1줄 왕 다음 줄바꿈 칸, 2줄 딱 다음 줄바꿈 칸, 3줄 지. 왼쪽 이름표 println 세 개.println왕↵println딱↵println지↵ 칸 = 줄바꿈. 마지막 println의줄바꿈은 화면에 보이지 않아요.
그림 1-3println은 쓰고 나서 줄을 바꿔요. 그래서 세 줄이 돼요.

한 줄 정리: println은 ‘쓰고 줄 바꿈’, 문장은 위에서 아래로 실행돼요.

예제 3 · print와 println을 섞어요 정프

이번에는 print를 섞어요. 결과 칸이 어떻게 채워질지 칸 단위로 생각해 보세요.

Main.java
public class Main {    public static void main(String[] args) {        System.out.print("A");        System.out.print("B");        System.out.println("C");        System.out.print("D");    }}
실행 결과
ABC
D

전광판 커서를 따라가 볼게요.

실행한 문장화면에 찍힌 것커서 위치
print("A")AA 바로 뒤
print("B")ABB 바로 뒤
println("C")ABC 그리고 줄바꿈둘째 줄 맨 앞
print("D")둘째 줄에 DD 바로 뒤
그림 1-4 커서가 움직이는 길결과 칸 그림. 첫 줄 A, B, C 다음 줄바꿈 칸. 둘째 줄 D. 왼쪽 이름표 첫 줄 print·print·println, 둘째 줄 print.A·B·CABC↵DD줄바꿈(↵)은 C를 쓴 뒤에 생겨요. C 앞이 아니에요.
그림 1-4 커서가 움직이는 길결과 칸 그림. 첫 줄 A, B, C 다음 줄바꿈 칸. 둘째 줄 D. 왼쪽 이름표 첫 줄 print·print·println, 둘째 줄 print.A·B·CABC↵DD줄바꿈(↵)은 C를 쓴 뒤에 생겨요. C앞이 아니에요.
그림 1-4A·B는 print라 줄을 안 바꾸고, C를 쓴 다음에 println이 줄을 바꿔요.

println("C")의 줄바꿈은 C를 쓴 다음에 일어나요. 줄바꿈이 C 앞에 생기는 게 아니에요.

한 줄 정리: print는 커서를 그 자리에 두고, println은 쓰고 나서 다음 줄로 보내요.

예제 4 · 빈칸도 글자예요

화면의 빈칸(띄어쓰기)은 저절로 생기지 않아요. 따옴표 안에 빈칸을 넣어야 생겨요.

Main.java
public class Main {    public static void main(String[] args) {        System.out.print("왕두목");        System.out.println("샘");        System.out.print("왕두목 ");        System.out.println("샘");        System.out.println();        System.out.println("끝");    }}
실행 결과
왕두목샘
왕두목 샘

끝
  • 첫 줄은 왕두목 뒤에 빈칸이 없어서 왕두목샘으로 붙었어요.
  • 둘째 줄은 "왕두목 "처럼 따옴표 안 끝에 빈칸을 넣어서 띄어졌어요.
  • System.out.println();처럼 괄호 안이 비어 있으면 아무 글자 없이 줄만 바꿔요. 그래서 빈 줄이 하나 생겼어요.
그림 1-5 빈칸 칸과 빈 줄결과 칸 그림. 1줄 왕두목샘 줄바꿈, 2줄 왕두목 빈칸 샘 줄바꿈, 3줄 줄바꿈만, 4줄 끝.1줄왕두목샘↵2줄왕두목·샘↵3줄↵4줄끝점(·) 칸 = 빈칸 한 개. 3줄은 println()이 만든 빈줄이에요.
그림 1-5 빈칸 칸과 빈 줄결과 칸 그림. 1줄 왕두목샘 줄바꿈, 2줄 왕두목 빈칸 샘 줄바꿈, 3줄 줄바꿈만, 4줄 끝.1줄왕두목샘↵2줄왕두목·샘↵3줄↵4줄끝점(·) 칸 = 빈칸 한 개. 3줄은println()이 만든 빈 줄이에요.
그림 1-5따옴표 안 빈칸은 점 칸 하나로, println()은 줄바꿈 칸만 있는 빈 줄로 나와요.

한 줄 정리: 빈칸은 따옴표 안에 내가 넣은 만큼만 나와요. println()은 글자 없이 줄만 바꿔요. 이번처럼 이미 새 줄 맨 앞에 있을 때 쓰면 빈 줄 하나가 생겨요.

예제 5 · 따옴표가 있을 때와 없을 때

괄호 안에 따옴표 없이 숫자 계산을 넣으면 어떻게 될까요?

Main.java
public class Main {    public static void main(String[] args) {        System.out.println("1 + 2");        System.out.println(1 + 2);    }}
실행 결과
1 + 2
3

따옴표 안의 1 + 2는 글자 그대로 나와요. 따옴표가 없는 1 + 2는 Java가 계산한 값 3이 나와요. 따옴표는 ‘계산하지 말고 글자 그대로’라는 표시예요. 계산은 3강에서 더 자세히 해요.

그럼 글자에 따옴표 없이 안녕하세요만 쓰면요? Java는 그것을 글자가 아니라 무언가의 이름으로 읽어요. 그런 이름은 없으니 오류가 나요.

Main.java
public class Main {    public static void main(String[] args) {        System.out.println(안녕하세요);    }}
컴파일 메시지 · 실행되지 않았어요
Main.java:3: error: cannot find symbol
        System.out.println(안녕하세요);
                           ^
  symbol:   variable 안녕하세요
  location: class Main
1 error

cannot find symbol은 ‘그런 이름을 찾을 수 없어요’라는 뜻이에요. Java가 안녕하세요를 변수 이름(2강에서 배워요)으로 읽었다는 것도 symbol: variable에서 보여요. 글자를 보여 주려면 큰따옴표로 감싸요.

한 줄 정리: 큰따옴표 안은 글자 그대로, 따옴표 밖은 Java가 계산하거나 이름으로 읽어요.

예제 6 · 클래스 이름과 파일 이름

public class 뒤의 이름은 파일 이름과 같아야 해요. 파일이 Main.java라면 클래스 이름도 Main이에요. 실행기의 파일 이름이 Main.java인데 클래스 이름을 Hello로 바꾸면 이렇게 돼요.

Main.java
public class Hello {    public static void main(String[] args) {        System.out.println("안녕하세요");    }}
컴파일 메시지 · 실행되지 않았어요
Main.java:1: error: class Hello is public, should be declared in a file named Hello.java
public class Hello {
       ^
1 error

메시지를 풀면 ‘Hello가 public이니까 Hello.java라는 파일에 있어야 해요’예요. 이 책의 모든 예제는 파일 이름 Main.java, 클래스 이름 Main으로 맞춰요. 실행기 화면의 파일 이름 칸이 Main.java인지 한 번 확인해 두면 안심이에요.

Main의 M은 대문자예요. main(시작점)은 소문자예요. 둘은 다른 이름이에요.

결과 따라 적기커서를 따라가요

아래 코드의 결과를 칸 단위로 적어요. 실행하기 전에 먼저 적고, 실행해서 대조해요.

Main.java
public class Main {    public static void main(String[] args) {        System.out.print("Ja");        System.out.println("va");        System.out.print("1");        System.out.print(" ");        System.out.println("강");    }}
차례실행한 문장화면 줄 1화면 줄 2줄바꿈?
1print("Ja")Ja아니요
2println("va")Java예
3print("1")Java
4print(" ")Java
5println("강")Java
실행 결과
Java
1 강

대조 답: 3행 화면 줄 2는 1, 줄바꿈 아니요. 4행은 1 (1 뒤 빈칸), 아니요. 5행은 1 강, 예. 빈칸만 따로 출력해도 빈칸 한 칸이 생겨요.

안 보고 직접 쓰기

빈칸 틀은 종이 연습이에요. 실행기에는 완성한 코드만 넣어요.

연습 1. 틀 네 줄을 채워요.

연습 틀
public [①   ] Main {
    public static void [②   ](String[] args) {
        System.out.println("연습");
    [③ ]
}

①:  ②:  ③:

연습 2. 화면에 아래처럼 나오게 main 안의 문장만 써요. print를 두 번, println을 한 번 써요.

실행 결과
왕두목 샘

연습 3. System.out.println("A"); 와 System.out.print("A");의 차이를 한 문장으로 써요.

스스로 대조하는 답

연습 1은 ① class ② main ③ }예요. 연습 2는 여러 답이 있어요. 예를 들면 아래처럼 써요.

Main.java
public class Main {    public static void main(String[] args) {        System.out.print("왕두목");        System.out.print(" ");        System.out.println("샘");    }}
실행 결과
왕두목 샘

연습 3은 ‘println은 A를 쓰고 줄을 바꾸고, print는 A를 쓰고 줄을 바꾸지 않아요’예요.

시험에선 이렇게 나와요출력 결과 정프

학습용 창작 문항이에요.

문제. 다음 Java 프로그램의 실행 결과를 쓰시오.

public class Main {    public static void main(String[] args) {        System.out.print("K");        System.out.println("O");        System.out.print("R");        System.out.print("E");        System.out.println("A");    }}

내 답:

정답먼저 풀고 눌러서 펼쳐 보세요
아래 실행 결과
실행 결과
KO
REA

해설: println("O")에서 O를 쓴 다음에 줄이 바뀌어요. 그래서 첫 줄은 KO예요. 둘째 줄은 print 두 번과 println 한 번이 이어져서 REA가 돼요. KOREA를 한 줄로 쓰면 오답이에요. 시험의 출력 문제는 줄바꿈 위치까지 채점해요.

딱지 떼기 체크
다 했으면
딱지 떼기
도장
  • 다섯 줄에서 클래스 틀, main, 실제로 일하는 문장을 구별할 수 있어요.
  • 닫는 중괄호 두 개가 각각 무엇을 닫는지 들여쓰기로 찾을 수 있어요.
  • println과 print의 차이를 ‘다 쓰고 줄을 바꾸느냐’로 말할 수 있어요.
  • 빈칸은 따옴표 안에 넣어야 나온다는 것을 알아요.
  • public class 이름과 파일 이름이 같아야 한다는 것을 알아요.

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

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