자바 프로그램은 어떻게 생겼나
앞 페이지에서는 자바를 실행해 보았습니다. 이제 코드 자체가 실제로 무엇으로 이루어져 있는지 살펴봅시다. 자바는 엄격하고 명시적입니다. 모든 프로그램이 따라야 하는 고정된 형태가 있고, 컴파일러는 단 한 줄이 실행되기도 전에 그 형태를 검사합니다.
다음은 가능한 가장 작은 완전한 자바 프로그램입니다. 실행해 보세요:
한 줄을 출력하기에는 단어가 꽤 많고, 파이썬이나 자바스크립트와 달리 어느 것도 생략할 수 없습니다. 모든 조각이 필수이므로 각각이 무엇을 하는지 이해해 둘 가치가 있습니다. 바깥에서 안쪽으로 하나씩 뜯어보겠습니다.
모든 것은 클래스 안에 있다
자바에는 파일 최상위에 떠다니는 "느슨한" 코드가 없습니다. 모든 코드는 class 키워드와 이름으로 선언되는 클래스 안에 존재합니다:
public class Main {
// everything goes in here
}
여는 {와 그에 대응하는 닫는 }가 클래스의 본문을 표시합니다. 이름 Main은 여러분이 정할 수 있지만, 한 가지 중요한 규칙이 있습니다: 일반적인 .java 파일에서 public 클래스는 파일 이름과 정확히 일치해야 합니다. public class Main은 Main.java에 속합니다. 대소문자를 틀리면 컴파일러는 빌드를 거부합니다.
클래스가 실제로 무엇인지는 클래스 장에서 배우게 됩니다. 지금은 public class Main { ... }를 코드를 감싸는 필수 래퍼로 여기세요.
main 메서드가 출발선이다
자바 프로그램을 실행하면 런타임은 실행을 시작할 특정 메서드 하나를 찾습니다:
public static void main(String[] args) {
// your code starts here
}
이 시그니처는 협상의 여지가 없습니다. 각 단어는 제 역할이 있습니다:
public- 런타임이 클래스 밖에서 이 메서드에 접근할 수 있다.static- 클래스의 객체를 먼저 만들지 않고도 실행된다.void- 끝날 때 아무것도 돌려주지 않는다.main- 런타임이 찾는 정확한 이름.String[] args- 프로그램에 전달된 명령줄 인수의 배열.
단어 하나라도 잘못되면 - static 대신 Static, String[] args 대신 String args - 코드는 컴파일될 수도 있지만, 실행 시 Error: Main method not found in class Main로 실패합니다. 이 메시지는 거의 항상 이 줄에 오타가 있다는 뜻입니다.
문장은 세미콜론으로 끝난다
문장은 하나의 완전한 명령입니다. 자바에서는 모든 문장이 세미콜론 ;으로 끝납니다. 컴파일러는 세미콜론을 사용해 한 명령이 어디서 멈추고 다음 명령이 어디서 시작하는지 알아냅니다 - 줄바꿈은 컴파일러에게 의미가 없습니다.
줄바꿈이 무시되기 때문에 세 문장을 모두 한 줄에 두어도 동작합니다 - 물론 자바를 그렇게 쓰는 사람은 없지만요:
int score = 90; score = score + 5; System.out.println(score);
세미콜론을 빠뜨리면 컴파일러는 프로그램이 실행되기 전에 여러분을 멈춰 세웁니다:
int score = 90
System.out.println(score);
error: ';' expected
int score = 90
^
세미콜론 누락은 초보자로서 마주치게 될 가장 흔한 컴파일 오류입니다. 컴파일러가 어떤 줄을 가리키면 그 위 줄도 확인하세요 - 진짜 누락은 흔히 거기에 있습니다.
블록과 중괄호
중괄호 { }는 문장들을 블록으로 묶습니다. 클래스 본문도 블록이고, 메서드 본문도 블록이며, if나 반복문의 본문도 블록입니다. 블록은 다른 블록 안에 중첩될 수 있습니다:
문장과의 차이에 주목하세요: 블록을 여는 줄은 세미콜론이 아니라 {로 끝나며, 메서드, 클래스, if, 반복문의 닫는 } 뒤에는 세미콜론을 붙이지 않습니다. 이를 헷갈리는 것은 초기의 전형적인 실수입니다:
public static void main(String[] args) {
System.out.println("hi");
}; // <- this semicolon is unnecessary (and after a class/method, wrong)
예제의 들여쓰기는 순전히 사람을 위한 것입니다. 자바는 그것을 무시하지만, 일관된 들여쓰기는 여러분과 다른 모두가 어떤 {가 어떤 }와 짝을 이루는지 파악하는 방법입니다. 에디터의 자동 들여쓰기에 맡기면 중괄호가 알아서 정렬됩니다.
자바는 대소문자를 구분한다
자바는 대문자와 소문자를 완전히 다른 것으로 취급합니다. score, Score, SCORE는 세 개의 별개 이름입니다. 키워드와 내장 이름에도 똑같이 적용됩니다:
system.out.println(소문자 s)이라고 쓰거나 String Name이라고 써 놓고 name을 사용하려 하면 컴파일러가 거부합니다. 초보자가 대소문자를 자주 틀리는 이름 몇 가지:
System- 대문자S.system.out.println(...)은 컴파일되지 않습니다.String- 대문자S. 소문자 원시 타입과 달리 클래스입니다.void,int,public,static- 모두 소문자. 이들은 키워드입니다.
대부분의 "cannot find symbol" 오류는 대소문자 실수로 거슬러 올라갑니다. 오류는 찾지 못한 심볼이 무엇인지까지 알려줍니다 - 그 대소문자를 여러분이 입력한 것과 대조해 보세요.
조각을 한데 모으기
다음은 이 페이지의 모든 것 - 클래스, main 메서드, 여러 문장, 중첩된 블록, 일관된 대소문자 - 을 사용하는 조금 더 큰 프로그램입니다:
위에서 아래로 읽어보세요: 클래스가 모든 것을 감싸고, main은 실행이 시작되는 곳이며, 각 명령은 ;으로 끝나고, if 본문은 자체 블록으로 묶여 있으며, 모든 내장 이름이 올바른 대소문자로 작성되어 있습니다. 이것이 여러분이 작성하게 될 거의 모든 자바 프로그램의 뼈대입니다.
다음: 주석
이제 여러분은 자바 파일의 구조를 읽을 수 있습니다. 다음으로 더할 것은 사람을 위한 메모 - 컴파일러가 완전히 무시하는 텍스트입니다. 다음 페이지에서는 주석을 다룹니다: 한 줄 형식 //, 블록 형식 /* */, 그리고 주석이 코드 안에서 정말로 제 자리를 얻는 때.
자주 묻는 질문
자바 프로그램의 기본 문법은 무엇인가요?
모든 자바 프로그램은 클래스 안에 존재하며, 실행은 정확히 public static void main(String[] args) 시그니처를 가진 메서드에서 시작됩니다. 문장은 세미콜론으로 끝나고, 코드 블록은 중괄호 { }로 묶입니다. 최소한의 프로그램은 public class Main { public static void main(String[] args) { System.out.println("Hi"); } } 입니다.
자바는 왜 public static void main(String[] args)가 필요한가요?
그것이 바로 자바 런타임이 찾는 진입점이기 때문입니다. public은 런타임이 클래스 밖에서 호출할 수 있게 하고, static은 먼저 객체를 만들지 않고도 실행됨을 뜻하며, void는 아무것도 반환하지 않음을 뜻하고, String[] args는 명령줄 인수를 받습니다. 단어 하나라도 - 대소문자까지 - 바꾸면 프로그램은 컴파일은 되지만 시작되지 않고 Error: Main method not found가 나타납니다.
모든 자바 문장에 세미콜론이 필요한가요?
모든 문장은 세미콜론으로 끝납니다 - 변수 선언, 할당, 메서드 호출 등이 그렇습니다. 하지만 블록으로 끝나는 줄(if, for, while, 클래스나 메서드의 헤더)은 대신 {로 끝나며, 그런 블록의 닫는 } 뒤에는 세미콜론을 붙이지 않습니다. 세미콜론을 빠뜨리는 것은 자바 초보자가 가장 흔히 내는 컴파일 오류입니다.