3. 자바로 프로그램 작성하기
3.1 Hello.javas
자바로 프로그램을 개발하려면 JDK이외에 메모장(Notepad.exe)이나 에딧플러스(editplus)와 같은 편집기가 필요하다. 이외에도 좋은 개발도구들이 많지만, 일단 처음 자바를 배우는 사람들에게는 editplus와 같이 가벼우면서도 편리한 기능을 제공하는 편집기가 좋다.
나중에 자바에 어느 정도 익숙해지고 나서 이클립스(eclipse)나넷빈즈(netbeans)와 같은 고급툴을 사용하자.
|참고| eidtplus는 http://www.editplus.com에 가면 평가판을 무료로 제공한다.
▼ 예제 1-1 / ch1 / Hello.java
class Hello {
public static void main(string[] args)
{
System.out.println("Hello, world."); // 화면에 글자를 출력한다.
}
}
실행결과 : Hello, world.
이 예제는 화면에 "Hello, world.'를 출력하는 아주 간단한 프로그램이다. 이 예제를 통해서 화면에 글자를 출력하려면 어떻게 해야 하는지 쉽게 알 수 있을 것이다.
예제 1-1을 편집기나 editplus를 이용해서 작성한 다음 "Hello.java'로 저장하자. 이 때 클래스의 이름 'Hello'가 대소문자까지 저오학히 같아야 한다.
이 예제를 실행하려면, 먼저 자바컴파일러(javac.exe)를 사용해서 소스파일(Hello.java)로 부터 클래스파일(Hello.class)을 생성해야 한다.
그 다음에 자바 인터프리터(javas.exe)로 실행한다.
Hello.java 작성 -> javac.exe (컴파일) -> Hello.class생성 -> java.exe (실행) -> "Hello.world." 출력
-----------------------------------------------
C:\jdk1.8\work>javac Hello.java
C:\jdk1.8\work>java Hello
Hello, world.
C:\jdk1.8\work
-----------------------------------------------
▲ 문자 1-4 Hello.java를 컴파일하고 실행한 화면
문자 1-4와 같은 결과를 얻었다면 자바로 프로그래밍할 준비가 모두 끝난 것이다. 만일 컴파일 시에 오류가 발생했다면 '3.2 자주 발생하는 에러와 해결방법'을 참고하자.
자바에서 모든 코드는 반드시 클래스 안에 존재해야 하며, 서로 관련된 코드들을 그룹으로 나누어 별도의 클래스를 구성하게 된다. 그리고 이 클래스들이 모여 하나의 Java 애플리케이션을 이룬다.
클래스를 작성하는 방법은 간단하다. 키워드 'class'다음에 클래스의 이름을 적고, 클래스의 시작과 끝을 의미하는 괄호 {} 안에 원하는 코드를 넣으면 된다.
class 클래스이름 {
/*
주석을 제외한 모든 코드는 클래스의 블럭{} 내에 작성해야 한다.
*/
}
|참고| 나중에 배우게 될 package문과 import문은 예외적으로 클래스의 밖에 작성한다.
아래 코드의 'public static void main(String[] args)'는 main 메서드의 선언부인데, 프로그램을 실행할 때 'java.exe'에 의해 호출될 수 있도록 미리 약속된 부분이므로 항상 똑같이 적어주어야 한다.
|참고| '[]'은 배열을 의미하는 기호로 배열의 타입(type) 또는 배열의 이름 옆에 붙일 수 있다. 'String[] args'는 String 타입의 배열 args를 선언한 것이며, 'String args[]'와 같이 쓸 수도 있다. 이 둘은 같은 의미이므로 차이가 없다. 자세한 내용은 '5장 배열'에서 배우게될 것이다.
class 클래스이름 {
public static void main(String[] args) // main메서드의 선언부
{
// 실행될 문장들을 적는다.
}
}
main 메서드의 선언부 다음에 나오는 괄호{}는 메서드의 시작과 끝을 의미하며, 이 괄호 사이에 작업할 내용을 작성해 넣으면 된다. Java 애플리케이션은 main메서드의 호출로 시작해서 main메서드의 첫 문장붙어 마지막 문장까지 수행을 마치면 종료된다.
모든 클래스가 main 메서드를 가지고 있어야 하는 거은 아니지만, 하나의 Java 애플리케이션에는 main메서드를 포함한 클래스가 반드시 하나는 있어야 한다. main 메서드는 java애플리케이션의 시작점이므로 main메서드 없이는 Java 애플리케이션은 실행될 수 없기 때문이다. 작성된 java애플리케이션을 실행할 때는 'java.exe' 다음에 main 메서드를 포함한 클래스의 이름을 적어줘야 한다.
하나의 소스파일에 하나의 클래스만을 정의하는 것이 보통이지만, 하나의 소스파일에 둘 이상의 클래스를 정의하는 것도 가능하다. 이 때 주의해야할 점은 '소스파일의 이름은 public class의 이름과 일치해야 한다.'는 것이다. 만일 소스파일 내에 public class가 없다면, 소스파일의 이름은 소스파일 내의 어떤 클래스의 이름으로 해도 상관없다.
올바른 작성 예 |
설명 |
Hello2.java public class Hello2 {} class Hello3 {} |
public class가 잇는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야 한다. |
Hello2.java class Hello2 {} class Hello3 {} | public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java', 'Hello3.java' 둘 다 가능하다. |
잘못된 작성 예 |
설명 |
Hello2.java public class Hello2 {} public class Hello3 {} |
하나의 소스파일에둘 이상의 public class가 존재하면 안된다. 각 클래스를 별도의 소스파일에 나눠서 저장하던가 아니면 둘 중의 한 클래스에 public을 붙이지 않아야 한다. |
Hello3.java public class Hello2 {} class Hello3 {} |
소스파일의 이름이 public class의 이름과 일치하지 않는다. 소스파일의 이름을 'Hello2.java |
hello2.java public class Hello2 {} class Hello3 {} |
소스파일의 이름과 public class의 이름이 일치하지 않는다. 대소문자를 구분하므로 대소문자까지 일치해야한다. 그래서, 소스파일의 이름에서 'h'를 'H'로 바꿔야 한다. |
▲ 소스파일의 작성 예
소스파일(*.java)과 달리 클래스파일(*,class)은 클래스마다 하나씩 만들어지므로 표1-1의 '올바른 작성 예'에 제시된 'Hello2.java'를 컴파일하면 'Hello2.class'와 'Hello3.class' 모두 두 개의 클래스파일이 생성된다.
접근제어자(access modifier)인 'public'에 대해서는 '7장 객체지향 프로그래밍 II'에서 자세히 배울 것이므로 여기서는 하나의 소스파일에 둘 이상의 클래스를 정의할 때 주의할 점에 대해서만 이해하고 넘어가자.
3.2 자주 발생하는 에러와 해결방법
자바로 프로그래밍을 배워나가면서 많은 수의 크고 작은 에러들을 접하게 될 것이다. 대부분의 에러는 작은 실수에서 비롯된 것들이며, 곧 익숙해져서 쉽게 대응할 수 있게 되지만 처음 배울 때는 작은 실수 하나 때문에 많은 시간을 허비하곤 한다. 그래서 자주 발생하는 기본적인 에러와 해결방법을 간단히 정리하였다. 에러가 발생하였을 때 참고하고, 그 외의 에러는 에러 메시지의 일부를 인터넷에서 검색해서 찾아보면 해결책을 얻는데 도움이 될 것이다.
1. cannot find symbol 또는 cannot resolve symbol
지정된 변수나 메서드를 찾을 수 없다는 뜻으로 선언되지 않은 변수나 메서드를 사용하거나, 변수 또는 메서드의 이름을 잘못 사용한 경우에 발생한다. 자바에서는 대소문자 구분을 하기 때문에 철자 뿐만 아니라 대소문자의 일치여부도 꼼꼼하게 확인해야 한다.
2. ';' expected
세미콜론';'이 필요한 곳에 없다는 뜻이다. 자바의 모든 문장의 끝에는 ';'을 붙여주여야 하는데 가끔 이를 잊고 실수하기 쉽다.
3. Exception in thread "main" java.lang.NosSuchMethodError: main
'main메서드를 찾을 수 없다.' 는 뜻인데 실제로 클래스 내에 main메서드가 존재하지 않거나 메서드의 선언부 'public static void main (String[] args)'에 오타가 존재하는 경우에 발생한다.
이 에러의 해결 방법은 mian메서드가 클래스에 정의되어 있는지 확인하고, 정의되어 있다면 main 메서드의 선언부에 오타가 없는지 확인한다. 자바는 대소문자를 구별하므로 대소문자의 일치여부까지 정확히 확인해야 한다.
|참고| args 매개변수의 이름이므로 args대신 argv나 arg와 같이 다른 이름을 사용할 수 없다.
4. Exception in thread "main" java.lang.NoClassDefFoundError: Hello
'Hello라는 클래스를 찾을 수 없다.'는 뜻이다. 클래스 'Hello'의 철자, 특히 대소문자를 확인해보고 이상이 없으면 클래스파일(*.class)이 생성되었는지 확인한다. 예를 들어 'Hello.java'가 정상적으로 컴파일 되었다면 클래스파일 'Hello.class'가 있어야 한다. 클래스파일이 존재하는데도 동일한 메시지가 반복해서 나타난다면 클래스패스(classpath)의 설정이 바르게 되었는지 다시 확인해보자.
5. illegal start of expresstion
직역하면 문장(또는 수식, expresstion)의 앞부분이 문법에 맞지 않는다는 의미인데, 간단히 말해서 문장에 문법적 오류가 있다는 뜻이다. 괄호'(' 나 '{'를 열고서 닫지 않거나, 수식이나 if문, for문 등에 문법적 오류가 잇을 때 또는 public이나 static과 같은 키워드를 잘 못 사용한 경우에도 발생한다. 에러가 발생한 곳이 문법적으로 옳은지 확인하라.
6. class, interface, or enum expected
이 메시지의 의미는 '키워드 class나 interface 또는 enum이 없다.'이지만, 보통 괄호 '{' 또는 '{'의 개수가 일치하지 않는 경우에 발생한다. 열린 괄호 '{'와 닫힌괄호 '}'의 개수가 같은지 확인하자.
마지막으로 한 가지 더 얘기하고 싶은 것은 에러가 발생했을 때, 어떻게 해결할 것인가에 대한 방법이다. 아주 간단하고 당연한 내용이라서 다소 실망스럽게 느껴질지도 모르지만, 막상 실제 에러가 발생했을 때 아래의 순서대로 처리해보면 도움이 될 것이다.
1. 에러 메시지를 잘 읽고 해당 부분의 코드를 살펴본다.
2. 그래도 이상이 없으면 에러 메시지는 잊어버리고 기본적인 부분을 재확인한다. 대부분의 에러는 사소한 것인 경우가 많다.
3. 의심이 가는 부분을 주석처리하거나 따로 떼어내서 테스트 한다.
에러 메시지가 실제 에러와는 관계없는 내용일 때도 있지만, 대부분의 경우 에러 메시지만 잘 이해해도 문제가 해결되는 경우가 많으므로 에러 해결을 위해서 제일 먼저 해야할 일은 에러 메시지를 잘 읽는 것임을 명심하자.
3.3 자바프로그램의 실행과정
콘솔에서 아래와 같이 Java 애플리케이션을 실행시켰을 때
c:\jdk1.8\work>java Hello
mian(String[] args)
내부적인 진행순서는 다음과 같다.
1. 프로그램의 실행에 필요한 클래스(*.class파일)를 로드한다.
2. 클래스파일을 검사한다.(파일형식, 악성코드 체크)
3. 지정된 클래스(Hello)에서 main(String[] args)를 호출한다.
main메서드의 첫 줄부터 코드가 실행되기 시작하여 마지막 코드까지 모두실행되면 프로그램이 종료되고, 프로그램에서 사용했던 자원들은 모두 반환된다.
만일 지정된 클래스에 main메서드가 없다면 다음과 같은 에러 메시지가 나타날 것이다.
Exception in thread "main" java.lang.NoSuchMethodError: main
'프로그래밍 > JAVA' 카테고리의 다른 글
1.1.2 왜 자바일까? (0) | 2019.01.22 |
---|---|
1장 자바 기초 지식 (0) | 2019.01.22 |
2. 자바개발환경 구축하기 (0) | 2017.09.18 |
1. 자바 (Java Programming Language) (0) | 2017.09.18 |
변수 (0) | 2017.09.15 |