본문으로 건너뛰기
안동민 개발노트 아이콘

안동민 개발노트

본문 시작
1장 : Java 소개와 개발 환경

JShell과 IDE를 학습 도구로 쓰기

Java를 익힐 때 모든 생각을 완성된 프로젝트로 만들 필요는 없습니다.

표현식의 결과를 빠르게 확인할 때는 JShell이 적합하고, 여러 파일을 탐색하고 리팩터링할 때는 IDE가 적합합니다.

바이트코드를 확인하는 javap는 소스 문법이 실제로 어떻게 번역됐는지 보여 줍니다.

도구를 많이 설치하는 것보다 질문에 맞는 도구를 고르는 편이 학습 속도를 높입니다.

여기서는 도구가 대신 판단해 주는 부분과 직접 이해해야 할 부분을 나눕니다.


JShell은 작은 가설을 검증한다

JShell에서는 변수 선언과 메서드 호출을 즉시 평가할 수 있습니다.

짧은 API 동작이나 타입 추론을 확인하기 좋지만 여러 파일의 구조를 검증하는 용도로는 적합하지 않습니다.


IDE는 탐색과 변경 비용을 낮춘다

자동 완성보다 중요한 기능은 선언 이동, 사용처 검색, 안전한 이름 변경, 디버거입니다.

컴파일 오류를 IDE 표시만으로 넘기지 말고 메시지와 실제 컴파일 명령도 함께 확인해야 합니다.

ToolChoice.java는 도구를 바꾸어도 같은 square 메서드와 결과를 관찰하게 해 줍니다. JShell에서 먼저 식을 확인하고, 파일로 저장해 IDE와 터미널에서 각각 실행해 보세요.

ToolChoice.java
public class ToolChoice {
    static int square(int value) {
        return value * value;
    }

    public static void main(String[] args) {
        int input = 7;
        System.out.println(square(input));
    }
}

IDE에서 실행하더라도 이 프로그램이 하는 일은 소스 저장, 컴파일, 클래스 실행 세 단계입니다. Run 버튼이 실패하면 터미널에서 같은 파일을 직접 컴파일해 보아 코드 오류와 IDE 설정 오류를 먼저 나눕니다.

49

JShell은 작은 계산을, javac/java는 파일 계약을, javap는 생성된 바이트코드를 확인합니다.


javap로 컴파일 결과를 읽는다

javap -c 클래스이름은 메서드의 바이트코드를 보여 줍니다.

모든 명령을 외울 필요는 없지만 소스 한 줄이 여러 JVM 명령으로 바뀔 수 있다는 점을 관찰할 수 있습니다.

javap는 소스를 복원하는 도구가 아니라 클래스가 공개한 필드와 메서드, JVM 명령을 읽는 진단 도구입니다. javap -c 클래스이름으로 본 명령을 소스 한 줄과 대조하면 컴파일러가 문법을 어떤 실행 단위로 바꾸는지 감을 잡을 수 있습니다.

// 빠른 표현식 확인
jshell
jshell> 7 * 7
$1 ==> 49

// 컴파일 결과 관찰
javac ToolChoice.java
javap -c ToolChoice

빌드 도구는 프로젝트가 커질 때 도입한다

단일 파일 학습에는 javac가 가장 투명합니다.

의존성과 여러 소스 집합을 관리해야 할 때 Maven이나 Gradle을 선택하고, 도구를 쓰는 이유를 먼저 명시하는 편이 좋습니다.

파일 하나를 실험할 때는 javac와 JShell만으로 충분하고, 여러 소스와 외부 라이브러리의 버전이 얽히기 시작하면 Maven이나 Gradle을 도입합니다. 빌드 도구는 Java 문법을 대신하는 것이 아니라 컴파일 명령과 의존성, 결과물 위치를 팀 전체에 재현하는 장치입니다.


JShell, IDE, javap, 빌드 도구는 경쟁 관계가 아니라 질문의 크기에 따라 바꾸어 쓰는 도구입니다.