Eclipse IDE에서 Java 애플리케이션 만들기

Eclipse IDE에서 Java 애플리케이션 만들기

Eclipse IDE는 개발자가 Java 코드를 작성하고, 실행하고, 디버깅하는 데 도움을 주는 도구를 제공하는, 널리 쓰이는 애플리케이션이에요. 이 글은 Eclipse로 Java 애플리케이션 개발을 시작하는 방법을 설명해요. 설치부터 프로젝트 생성, 코드 자동 완성, 실행, 오류 처리, 디버깅, 코드 생성, 리팩터링까지 실제 IDE 사용 흐름을 하나씩 따라가볼게요.

출처: Building a Java Application in the Eclipse IDE

본문

소개와 설치

Eclipse IDE(줄여서 Eclipse)는 개발자가 Java 코드를 작성하고, 실행하고, 디버깅하는 데 도움을 주는 도구를 제공하는 흔히 사용되는 애플리케이션이에요. 이 글은 Java 애플리케이션을 개발하기 위해 Eclipse를 시작하는 방법을 설명해요.

Eclipse를 설치하는 가장 쉬운 방법은 이 사이트에서 Eclipse 설치 프로그램을 다운로드해 실행하는 거예요. 이는 설치할 수 있는 여러 패키지 옵션을 제공해요. 대부분의 경우 Eclipse IDE for Java Developers가 Java 개발에 좋은 설치 선택이에요.

이미지: Eclipse Installer

Eclipse를 설치한 후에는 워크스페이스(workspace)를 선택할 수 있어요. 워크스페이스는 대부분의 프로젝트가 위치하는 디렉터리예요.

이미지: Workspace selection

워크스페이스를 선택하면 여러 옵션을 보여주는 Welcome 화면이 나타나요. 예를 들어 간단한 Hello-World 애플리케이션을 만드는 방법을 보여주는 대화형 튜토리얼을 시작하는 옵션이 있어요.

이미지: Workspace selection

이 글은 Java 프로젝트를 직접 만드는 방법을 보여드릴 거라서, Welcome 탭 오른쪽 위의 Hide 버튼을 클릭해 이 Welcome 화면을 닫아도 돼요.

Java 프로젝트 만들기

Eclipse를 설치한 후에는 빈 워크스페이스가 있어야 해요. 새 Java 프로젝트를 만들려면 Eclipse 창 왼쪽 위의 File 도구 모음을 클릭하고 New > Java Project를 선택하세요.

이미지: File > New > Java Project

그러면 프로젝트를 구성할 수 있는 대화 상자 창이 열려요. 위쪽의 Project name: 옆에 이름을 입력해야 해요. 예를 들어 이름을 HelloWorld로 정할 수 있어요. 아래쪽 Module 섹션에서 Create module-info.java file 옵션을 비활성화하세요. JRE 상자에서 사용자 정의 Java 설치(JDK 또는 Java Development Kit라고 흔히 부름)를 구성할 수 있어요.

이미지: Java project creation dialog

이렇게 하면 Eclipse 창 왼쪽에 표시되는 Java 프로젝트가 만들어져요. 이 프로젝트를 펼치면 src라는 폴더가 있어야 해요. 이 디렉터리 안에서 마우스 오른쪽 클릭 후 New > Class를 선택하면 Java 클래스를 만들 수 있어요.

이미지: New > Class

프로젝트 생성 대화 상자와 비슷한 대화 상자가 열려요. 만들려는 클래스에 대한 다양한 옵션을 지정할 수 있어요. 지금은 HelloWorld 같은 클래스 이름을 입력하면 돼요. 원한다면 여러 클래스를 묶는 데 사용할 수 있는 패키지(package)도 구성할 수 있어요.

이미지: Java class creation dialog

내용 어시스트(Content Assist)

Eclipse는 코드의 일부를 자동으로 완성해줘서 Java 코드 작성을 도와줄 수 있어요. Java 코드를 편집하는 동안 키 조합 Ctrl+Space(macOS에서는 +Space, 중국어 시스템에서는 Alt+/)를 누르면, Eclipse가 코드를 완성하는 방법을 자동으로 제안해줘요. 이 제안은 Enter를 누르거나 제안을 더블클릭해 확인할 수 있어요.

예를 들어 클래스에서 main을 입력하고 Ctrl+Space를 누르면 main 메서드 추가를 제안해줘요.

이미지: Content assist suggesting a main method

메서드 안에서 Eclipse는 sysoutSystem.out.println(); 문장으로 바꾸는 것을 제안할 수 있어요.

이미지: Content assist suggesting a System.out statement

게다가 클래스와 메서드 이름을 완성할 수도 있어요.

이미지: Content assist completing the class name String

이미지: Content assist completing the method String#length

프로그램 실행하기

Java 애플리케이션을 실행하려면 먼저 main 메서드가 있는 클래스가 필요해요. 패키지 탐색기에서 클래스를 마우스 오른쪽 클릭하거나, 클래스의 코드를 작성하고 있는 에디터에서 마우스 오른쪽 클릭 후 Run as > Java application을 선택하면 돼요.

이미지: Run As > Java application in the editor

이미지: Run As > Java application in the editor

또는 도구 모음의 Run 이미지: Run button 버튼으로 애플리케이션을 실행할 수 있어요. 이미지: Run button in toolbar

프로그램을 실행하면 Eclipse는 프로그램의 출력을 Console 뷰에 보여줘야 해요.

이미지: Program with output in console

컴파일 오류와 경고 다루기

Eclipse가 컴파일 오류를 감지하면 관련 줄이 빨간색으로 밑줄이 그어져요. 오류가 있는 줄이나 그 줄 왼쪽의 오류 아이콘 위에 마우스를 올리면, Eclipse는 무엇이 잘못됐는지에 대한 정보를 제공하고 오류를 고칠 수 있는 Quick Fix(빠른 수정)도 제안해줘요. 그러나 많은 경우 오류를 없애는 방법이 여러 가지예요. 제안이 실제로 여러분이 하려는 것과 일치하는지 신중하게 확인해야 해요. 어쨌든 IDE는 여러분의 의도를 예측할 수 없으니까요.

이미지: Compilation error due to calling a non-existing method

또한 Eclipse는 Problems 뷰에 오류 목록을 보여줘요. 이 뷰가 표시되지 않으면 Window > Show View > Problems 메뉴로 표시할 수 있어요.

이미지: opening Problems view

이미지: Problems view showing an error

오류와 마찬가지로 Eclipse는 컴파일은 되지만 문제가 있거나 무의미할 가능성이 있는 코드도 감지할 수 있어요. 이 경우 Eclipse는 경고(warning)를 표시해요.

이미지: Warning due to unused variable

이미지: Problems view showing a warning

디버깅

프로그램이 예상대로 작동하지 않으면 디버깅하고 싶을 거예요. 디버깅 과정은 이 글에서 설명하고 있어요. Eclipse는 Java 애플리케이션 디버깅을 쉽게 만들어주는 많은 기능을 제공해요.

애플리케이션을 디버그하려면 중단점(breakpoint)을 설정해야 해요. 프로그램이 중단점이 있는 줄을 실행하게 되면 잠시 멈추고("suspend"), 현재 상태를 검사하고 프로그램을 단계별로 진행할 수 있게 해줘요. 중단점을 설정하려면 프로그램을 멈추고 싶은 줄 왼쪽 영역을 더블클릭하면 돼요. 그러면 파란 점이 나타나야 해요.

이미지: A breakpoint next to source code

프로그램을 일반적으로 실행하면 모든 중단점을 무시해요. 디버깅하려면 디버그 모드에서 프로그램을 실행해야 해요. 실행 버튼 옆의 버그 아이콘이 있는 초록색 버튼 이미지: The debug button을 클릭하거나 Debug As > Java Application을 사용하면 돼요.

이미지: The debug button next to run buttons

디버그 모드에서 프로그램 실행이 중단점에 도달하면, Eclipse가 Debug 관점(perspective)으로 전환할지 물어봐요. 이 관점은 현재 디버깅 중인 프로그램에 대한 더 많은 정보를 주므로 전환하는 것이 좋아요. Switch 버튼을 클릭하세요.

이미지: Eclipse asking to switch to the Debug perspective

디버그 관점을 열면 여전히 가운데에 코드가 보여야 해요. 그러나 중단점 옆에 초록색 배경의 줄이 하나 있어야 해요. 이는 프로그램이 다음으로 실행할 줄을 나타내요. 오른쪽에는 변수와 현재 값을 담은 목록이 있는 Variables 뷰가 보여야 해요.

이미지: The debug perspective

프로그램이 중단되어 있는 동안, 상단 도구 모음의 버튼으로 어떻게 계속 실행할지 지시할 수 있어요. 이미지: Buttons for controlling execution flows in the toolbar Step Over 이미지: Step Over button (F6)로 한 줄을 실행하고, Step Into 이미지: Step Into button (F5)로 메서드 안으로 들어가거나, Resume 이미지: Resume button (F8)으로 다음 중단점까지 프로그램 실행을 계속할 수 있어요.

코드 생성하기

때로는 비즈니스 로직이 많지 않고 기존 코드의 정보로 생성할 수 있는 반복적인 코드를 작성해야 할 때가 있어요. 이러한 예가 getter/setter나 equals/hashCode/toString 메서드인데, 이들은 보통 일부 필드에 접근하기만 하면 돼요. 레코드(records)를 사용하는 것이 종종 선호되지만, Eclipse에는 이런 반복 코드 조각을 생성하는 기능도 들어 있어요.

이를 위해 먼저 이런 메서드를 생성하고 싶은 일부 필드가 있는 클래스를 만들어야 해요. 이 예시에서는 사람의 이름, 성, 나이를 저장하는 Person 클래스를 만들어볼게요.

public class Person {
    private String firstName;
    private String lastName;
    private int age;
    //we want to generate code here

}

이 클래스에서 마우스 오른쪽 클릭하면 Source라는 옵션이 있는데, 코드를 생성하는 다양한 방법을 제공해요. 여기서 Generate Getters and Setters...를 선택해서 Person 클래스의 필드에 대한 접근자(accessor) 메서드를 생성할 수 있어요.

이미지: Generate Getters and Setters

이 옵션은 어떤 필드에 대해 접근자를 생성할지 구성할 수 있는 새 창을 열어줘야 해요. 모든 필드에 대한 접근자를 만들려면 Select All 버튼을 사용하고, 오른쪽 아래의 Generate를 클릭하세요.

이미지: Generate Getters and Setters

이 작업을 마치면 클래스는 다음과 같이 보여야 해요.

public class Person {
    private String firstName;
    private String lastName;
    private int age;
    //we want to generate code here
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

마찬가지로 Source > Generate hashCode() and equals()... 메뉴를 사용해 hashCodeequals 메서드를 생성할 수 있어요.

이미지: Generate hashCode and equals

이것도 hashCodeequals 메서드에 포함할 필드를 선택할 수 있는 창을 열어요. 이미지: Selecting fields to use in hashCode and equals

Generate를 클릭하면 Eclipse가 이 메서드들을 클래스에 자동으로 추가해요.

import java.util.Objects;

public class Person {
    private String firstName;
    private String lastName;
    private int age;
    //we want to generate code here
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public int hashCode() {
        return Objects.hash(age, firstName, lastName);
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        return age == other.age && Objects.equals(firstName, other.firstName)
                && Objects.equals(lastName, other.lastName);
    }

}

흔히 생성되는 또 다른 메서드는 객체의 String 표현을 반환하는 toString()이에요. 이 메서드를 생성하려면 Source 메뉴에서 Generate toString()...을 선택하세요.

이미지: Generate toString

앞서와 마찬가지로, 이 창은 코드를 정확히 어떻게 생성할지에 대한 옵션을 지정할 수 있게 해줘요.

이미지: Options for toString

Generate 버튼을 사용하면 Eclipse는 앞선 다른 메서드들과 마찬가지로 toString 메서드를 생성해요.

import java.util.Objects;

public class Person {
    private String firstName;
    private String lastName;
    private int age;
    //we want to generate code here
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public int hashCode() {
        return Objects.hash(age, firstName, lastName);
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        return age == other.age && Objects.equals(firstName, other.firstName)
                && Objects.equals(lastName, other.lastName);
    }
    @Override
    public String toString() {
        return "Person [firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + "]";
    }

}

리팩터링

Java 애플리케이션을 작업할 때는 기능을 유지하면서 기존 코드를 다양한 방식으로 변경해야 하는 경우가 많아요. Eclipse는 다양한 리팩터링 옵션을 제공해서 개발자의 이런 작업을 지원해요. 그 예로는 클래스, 메서드, 필드 이름 바꾸기가 있어요. 클래스, 메서드 또는 변수 이름을 클릭하고 마우스 오른쪽 클릭 후 Refactor > Rename을 선택하면 돼요.

이미지: Rename context menu

그러면 이름을 다른 것으로 바꾸고 Enter 키로 확인할 수 있어요. 이렇게 하면 이름이 바뀐 요소를 참조하는 모든 참조도 업데이트돼요.

이미지: Renaming a class name

이미지: Renaming a class name

요약

보시다시피 Eclipse IDE는 개발자가 Java 애플리케이션을 작성할 때 도움이 되는 많은 도구를 제공해요. 이 글이 일부를 보여줬지만, Eclipse에는 더 큰 애플리케이션을 작업할 때 특히 유용할 수 있는 훨씬 많은 기능이 들어 있어요. 더 읽고 싶다면 Java Development 사용자 가이드를 확인해보세요.

더 알아보기 (Learn more)