첫 프로그램은 구조를 읽는 연습입니다
첫 Java 프로그램은 보통 화면에 짧은 문장을 출력합니다. 출력 자체는 어렵지 않습니다. 중요한 것은 그 한 줄이 어떤 구조 안에 들어가야 JVM이 실행할 수 있는지 보는 일입니다. Java는 자유롭게 아무 줄이나 실행하지 않습니다. 클래스 안에 코드가 있고, 실행 시작점인 main 메서드 안에 명령문이 있어야 합니다.
처음에는 public, static, void, String[] args 같은 단어가 낯설 수 있습니다. 지금 당장 각 단어의 깊은 의미를 모두 외울 필요는 없습니다. 다만 JVM이 프로그램을 시작할 때 public static void main(String[] args) 모양의 메서드를 찾는다는 사실은 기억해야 합니다. 이 선언이 틀리면 파일이 컴파일되더라도 실행 시작점을 찾지 못할 수 있습니다.
실행 가능한 기본 예제
아래 코드를 Main.java로 저장합니다.
public class Main {
public static void main(String[] args) {
System.out.println("학습 캠프에 입장했습니다.");
System.out.println("오늘의 목표: Java 구조 읽기");
System.out.println(12 + 8);
}
}
컴파일하고 실행합니다.
javac Main.java
java Main
예상 출력은 다음과 같습니다.
학습 캠프에 입장했습니다.
오늘의 목표: Java 구조 읽기
20
문자열은 큰따옴표로 감싸고, 숫자 계산은 따옴표 없이 씁니다. "12 + 8"이라고 쓰면 계산식이 아니라 글자 그대로 출력됩니다. 반대로 12 + 8이라고 쓰면 정수 덧셈이 먼저 실행되고 결과인 20이 출력됩니다.
class는 코드를 담는 가장 바깥 단위입니다
public class Main은 Main이라는 공개 클래스를 선언합니다. Java에서 클래스는 관련된 데이터와 동작을 묶는 기본 단위입니다. 객체지향을 배우기 전까지는 “코드를 담는 큰 상자”라고 생각해도 충분합니다. 공개 클래스 이름이 Main이면 파일 이름은 Main.java여야 합니다.
중괄호 {와 }는 범위를 만듭니다. 클래스의 여는 중괄호부터 닫는 중괄호까지가 Main 클래스의 영역입니다. 그 안에 main 메서드가 들어 있고, 다시 그 안에 출력 명령이 들어 있습니다. 들여쓰기는 문법적으로 필수는 아니지만, 사람이 구조를 읽을 수 있게 해 주는 중요한 약속입니다.
좋은 들여쓰기는 오류를 줄입니다. 중괄호가 하나 빠졌을 때 컴파일러가 오류를 알려주더라도, 들여쓰기가 무너지면 사람이 어디에서 빠졌는지 찾기 어렵습니다. 초반부터 클래스 안은 한 단계, 메서드 안은 두 단계 들여쓰는 습관을 들이세요.
main 메서드는 입구입니다
main 메서드는 JVM이 실행을 시작하는 입구입니다.
public static void main(String[] args) {
System.out.println("시작점 확인");
}
괄호 안의 String[] args는 프로그램 실행 시 전달받을 수 있는 문자열 목록입니다. 이 과정의 초반 예제에서는 사용하지 않지만, 선언에는 포함해야 합니다. 나중에 터미널 인수, 배열, 메서드를 배우면 왜 문자열 배열인지 이해할 수 있습니다.
void는 이 메서드가 호출한 쪽에 값을 돌려주지 않는다는 뜻입니다. static은 객체를 만들지 않고도 실행할 수 있다는 뜻으로, 객체지향 장에서 다시 설명합니다. 지금은 “시작점 선언의 정해진 모양”으로 받아들이면 됩니다.
출력 명령 자세히 보기
System.out.println은 표준 출력으로 값을 보내고 줄을 바꿉니다. System은 Java 표준 API의 클래스이고, out은 화면 출력과 연결된 객체이며, println은 값을 출력하는 동작입니다. 점(.)은 안쪽 구성 요소나 기능으로 들어갈 때 사용합니다.
print와 println의 차이는 줄바꿈입니다.
public class Main {
public static void main(String[] args) {
System.out.print("플레이어 ");
System.out.print("준비 ");
System.out.println("완료");
System.out.println("다음 줄입니다.");
}
}
예상 출력은 다음과 같습니다.
플레이어 준비 완료
다음 줄입니다.
print는 같은 줄에 이어 쓰고, println은 출력 후 다음 줄로 이동합니다. 로그 메시지나 결과를 사람이 읽기 좋게 표시할 때 둘을 적절히 섞어 사용할 수 있습니다.
주석은 실행되지 않는 메모입니다
주석은 코드 안에 남기는 설명입니다. 컴파일러는 주석을 실행 명령으로 처리하지 않습니다.
public class Main {
public static void main(String[] args) {
// 첫 화면에 학습 상태를 출력합니다.
System.out.println("준비 상태: 정상");
/*
* 여러 줄 주석은 긴 설명을 남길 때 사용할 수 있습니다.
* 단, 명확한 코드가 더 좋은 설명인 경우가 많습니다.
*/
System.out.println("점검 완료");
}
}
주석은 많을수록 좋은 것이 아닙니다. System.out.println("점검 완료"); 옆에 “점검 완료를 출력한다”라고 쓰는 주석은 새 정보를 주지 않습니다. 반대로 왜 이 메시지가 필요한지, 어떤 조건을 확인하기 위한 임시 출력인지 설명하는 주석은 도움이 됩니다.
문장 끝의 세미콜론
Java의 많은 실행문은 세미콜론(;)으로 끝납니다. 출력문, 변수 선언문, 대입문은 보통 세미콜론을 붙입니다. 클래스나 메서드의 중괄호 뒤에는 일반적으로 세미콜론을 붙이지 않습니다.
다음 코드는 두 번째 출력문 끝에 세미콜론이 없습니다.
public class Main {
public static void main(String[] args) {
System.out.println("첫 줄");
System.out.println("둘째 줄")
}
}
컴파일러는 세미콜론이 필요하다고 알려줍니다. 오류를 확인할 때는 메시지에 표시된 줄뿐 아니라 바로 앞줄과 괄호, 따옴표도 함께 보세요. 문자열의 닫는 큰따옴표가 빠져도 다음 줄에서 세미콜론 오류처럼 보일 수 있습니다.
문자열 연결과 계산의 차이
출력문에서는 문자열과 값을 함께 연결하는 일이 많습니다. + 연산자는 숫자끼리 있으면 덧셈이지만, 한쪽이 문자열이면 문자열 연결이 됩니다.
public class Main {
public static void main(String[] args) {
System.out.println("남은 횃불: " + 3);
System.out.println("좌표 합계: " + 10 + 20);
System.out.println("좌표 합계: " + (10 + 20));
}
}
예상 출력은 다음과 같습니다.
남은 횃불: 3
좌표 합계: 1020
좌표 합계: 30
두 번째 줄은 왼쪽부터 문자열 연결이 진행되어 10과 20이 글자로 이어집니다. 숫자를 먼저 계산하고 싶다면 괄호로 묶어 의도를 분명히 합니다.
코드 블록을 읽는 순서
Java 코드를 처음 읽을 때는 위에서 아래로만 훑지 말고 바깥 구조부터 좁혀 들어가면 좋습니다. 먼저 파일을 대표하는 클래스 이름을 봅니다. 그다음 main 메서드가 있는지 확인합니다. 마지막으로 main 안의 실행문을 순서대로 읽습니다. 이런 방식으로 읽으면 낯선 코드에서도 “실제로 실행되는 부분”과 “구조를 만들기 위한 부분”을 구분할 수 있습니다.
예제 코드에서 중괄호를 손가락으로 짝지어 보는 연습도 도움이 됩니다. 첫 번째 여는 중괄호는 클래스의 시작이고, 마지막 닫는 중괄호는 클래스의 끝입니다. 그 안쪽 중괄호는 main 메서드의 범위입니다. 출력문은 반드시 메서드 범위 안에 있어야 실행문으로 인정됩니다. 클래스 안이지만 메서드 밖에 System.out.println을 바로 쓰면 컴파일 오류가 납니다.
들여쓰기는 컴파일러보다 사람을 위한 장치입니다. Java 컴파일러는 공백과 줄바꿈을 상당히 유연하게 받아들이지만, 팀에서 일하는 개발자는 들여쓰기가 흐트러진 코드를 빠르게 신뢰하기 어렵습니다. 클래스 안은 한 단계, 메서드 안은 한 단계 더 안쪽으로 들여쓰는 패턴을 눈에 익히세요.
출력은 작은 디버깅 도구입니다
입문 단계의 System.out.println은 결과를 보여 주는 기능이면서 동시에 가장 작은 디버깅 도구입니다. 변수가 아직 낯설 때도, 코드가 어느 줄까지 실행되는지 알고 싶을 때도, 조건문이 어떤 경로를 탔는지 확인하고 싶을 때도 출력문을 사용할 수 있습니다. 실무에서는 전용 로깅 도구를 쓰지만, 학습 과정에서는 출력으로 흐름을 관찰하는 일이 매우 효과적입니다.
다만 출력문을 아무 곳에나 많이 넣으면 결과가 지저분해집니다. 메시지에는 값의 의미를 함께 적으세요. System.out.println(level);보다 System.out.println("현재 레벨: " + level);이 훨씬 읽기 좋습니다. 여러 값을 출력할 때는 줄바꿈을 적절히 사용하고, 계산 결과와 설명 문자열을 구분하세요. 오류를 찾기 위한 임시 출력은 문제가 해결된 뒤 정리하는 습관도 필요합니다.
직접 해보기
- 캠프 이름, 오늘의 목표, 예상 학습 시간을 세 줄로 출력합니다.
print두 번과println한 번을 사용해 한 줄 문장을 완성합니다.System.out.println("결과: " + 5 * 6);과System.out.println("결과: " + (5 * 6));을 비교합니다.- 세미콜론 하나를 일부러 지우고 컴파일 오류를 읽은 뒤 다시 고칩니다.
- 코드 위에 “왜 이 출력을 하는지” 설명하는 한 줄 주석을 추가합니다.
연습 팁
컴파일 오류를 일부러 만들어 보는 연습은 매우 좋습니다. 정상 코드만 실행하면 오류 메시지 읽는 능력이 늦게 자랍니다. 작은 예제에서 안전하게 실패해 보세요.
스스로 설명하는 연습
첫 프로그램을 이해했다면 코드를 보지 않고 구조를 설명해 보세요. “파일에는 Main 클래스가 있고, 그 안에 JVM이 찾는 main 메서드가 있으며, 그 메서드 안에서 출력문이 순서대로 실행된다”라고 말할 수 있어야 합니다. 각 줄의 모든 키워드를 깊게 설명하지 못해도 괜찮지만, 어느 줄이 구조이고 어느 줄이 실제 실행문인지는 구분해야 합니다.
다음으로 출력문 세 줄의 실행 순서를 예상해 보세요. Java는 main 안의 문장을 위에서 아래로 실행합니다. 첫 번째 출력이 끝난 뒤 두 번째 출력이 실행되고, 세 번째 출력에서 숫자 계산이 먼저 이루어진 뒤 결과가 출력됩니다. 이 단순한 순서 감각은 나중에 조건문과 반복문을 배울 때 기준점이 됩니다.
오류가 났을 때도 같은 방식으로 접근합니다. 클래스 이름이 맞는지, main 선언이 정확한지, 실행문이 메서드 안에 있는지, 따옴표와 괄호와 세미콜론이 닫혔는지 확인합니다. 처음에는 느려도 괜찮습니다. 오류 하나를 차분히 고치는 경험이 쌓이면 새로운 예제를 만났을 때 겁이 줄어듭니다.
좋은 첫 예제의 기준
첫 예제는 화려할 필요가 없습니다. 한 파일에서 컴파일되고, 실행 결과가 예상 가능하며, 작은 수정을 해도 다시 확인할 수 있으면 충분합니다. 출력 문장을 바꾸고, 숫자 계산을 바꾸고, print와 println을 바꾸어 보세요. 작은 변화가 어떤 결과 차이를 만드는지 관찰하는 일이 문법 암기보다 오래 남습니다.
또한 예제를 저장할 때는 이전 장의 파일과 섞이지 않게 폴더를 나누세요. 같은 이름의 Main.java를 여러 곳에서 사용하면 현재 터미널 위치가 중요합니다. “어느 폴더에서 컴파일했는가”와 “어느 폴더에서 실행했는가”를 의식하면 초반의 혼란을 크게 줄일 수 있습니다.
이번 장의 정리
첫 Java 프로그램은 클래스, main 메서드, 실행문이라는 세 겹 구조로 읽으면 됩니다. System.out.println은 값을 출력하고 줄을 바꾸며, print는 같은 줄에 이어 씁니다. 주석은 개발자를 위한 메모이고, 실행문 끝에는 세미콜론을 붙입니다. 다음 장에서는 이렇게 출력하던 값에 이름을 붙이고 바꾸어 사용할 수 있도록 변수와 자료형을 배웁니다.