본문 바로가기

Java 길찾기/Java의 정석

[Java] 커맨드 라인을 통해 입력받기

Scanner클래스의 nextLine()외에도 화면을 통해 사용자로부터 값을 입력받을 수 있는 방법이 있다. 바로 커맨드라인을 이용한 방법인데, 프로그램을 실행할 때 클래스 이름 뒤에 공백문자로 구분하여 여러 개의 문자열을 프로그램에 전달 할 수 있다. 만일 실행할 프로그램의 main메서드가 담긴 클래스의 이름이 MainTest라고 가정하면 다음과 같이 실행할 수 있을 것이다.

더보기

c:\jdk1.8\work\ch5>java MainTest abc123

 

커맨드라인을 통해 입력된 두 문자열은 String배열에 담겨서 MainTest클래스의 main메서드의 매개변수(args)에 전달된다. 그리고는 main메서드 내에서 args[0], args[1]과 같은 방식으로 커맨드라인으로부터 전달받은 문자열에 접근할 수 있다. 여기서 args[0]은 "abc"이고 args[1]은 "123"이 된다.

class ArrayEx16 {
    public static void main(String[] args) {
        System.out.println("매개변수의 개수: "+ args.length);
        for(int i=0; i<args.length; i++) {
            System.out.println("args[" + i + "] = \"" + args[i] + "\"");
        }
    }
}

 

커맨드라인에 입력된 매개변수는 공백문자로 구분하기 때문에 입력될 값에 공백이 있는 경우 큰따옴표(" ")로 감싸주어야 한다. 그리고 커맨드라인에서 숫자를 입력해도 숫자가 아닌 문자열로 처리된다는 것에 주의해야 한다. 문자열 "123"을 숫자 123으로 바꾸려면 다음과 같이 한다.

int num = Integer.parseInt("123");

 

그리고 커맨드라인에 매개변수를 입력하지 않으면 크기가 0인 배열이 생성되어 args.length의 값은 0이 된다. 만일 입력된 매개변수가 없다고 해서 배열을 생성하지 않으면 참조변수 args의 값은 null이 될 것이고, 배열 args를 사용하는 모든 코드에서 에러가 발생할 것이다. 이러한 에러를 피하려면, 다음과 같이 main메서드에 if문을 추가해줘야 한다.

public static void main(String[] args) {
    if(args != null) {
        System.out.println("매개변수의 개수: " + args.length);
        for(int i=0; i<args.length; i++) {
            System.out.println("args[" + i + "] = \""+ args[i] + "\"");
        }
    }
}

 

그러나 JVM이 입력된 매개변수가 없을 때, null 대신 크기가 0인 배열을 생성해서 args에 전달하도록 구현되어 우리는 이러한 수고를 덜게 되었다.

// 사칙연산 예제
class ArrayEx17 {
    public static void main(string[] args) {
        if(args.length != 3) {
            System.out.println("usage: ajva ArrayEx17 NUM1 OP NUM2");
            Ststem.exit(0);
        }
        
        int num1 = Integer.parseInt(args[0]);
        char op = args[1].charAt(0);
        int num2 = Integer.parseInt(args[2]);
        int result = 0;
        
        switch(op) {
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num1 - num2;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                result = num1 / num2;
                break;
            default:
                System.out.println("지원되지 않는 연산입니다.");
        }
        System.out.println("결과: " + result);
    }
}