[Java] 입출력

artp·2025년 1월 15일

java

목록 보기
4/32
post-thumbnail

2. 입출력 다루기

2.1 출력하기

자바에서 데이터를 화면에 출력할 때 사용하는 대표적인 명령어는 print(), println(), printf()입니다. 이 명령어들은 System.out 객체를 통해 화면에 출력을 수행합니다.

System.out.print()
System.out.println()
System.out.printf()

2.1.1 System.out.print()

print()는 출력 후 줄바꿈 없이 이어서 출력합니다.

System.out.print("Hello");
System.out.print("World!");

출력:

HelloWorld!

줄바꿈 없이 내용을 이어서 출력하기 때문에, 줄바꿈이 필요하면 \n(개행 문자 또는 줄 바꿈 문자)를 사용해야 합니다.

System.out.print("Hello\n");
System.out.print("World!");

출력:

Hello
World!

2.1.2 System.out.println()

println()print + line의 의미로, 출력 후 줄바꿈을 자동으로 수행합니다.
println()은 줄바꿈을 자동으로 수행하므로, 각 문장을 별도의 줄에 출력할 때 유용합니다.

System.out.println("Hello");
System.out.println("World");

출력:

Hello
World!

2.1.3 System.out.printf()

printf()print + format의 의미로, 형식화된 출력을 위해 사용됩니다. 출력 형식을 지정하는 서식 문자열을 사용할 수 있습니다.

System.out.printf("이름: %s, 나이: %d", "홍길동", 20);

출력:

이름: 홍길동, 나이: 20

주요 서식 코드:

  • %s: 문자열
  • %d: 정수
  • %f: 실수
  • %n: 줄바꿈

예제:

System.out.printf("원주율을 %.2f입니다.%n", 3.14159);
System.out.printf("숫자 %d은 %s입니다.%n", 10, "정수");

출력:

원주율은 3.14입니다.
숫자 10은 정수입니다.

2.2 입력받기

출력은 프로그램 실행 결과를 화면에 보여주는 것이라면, 입력은 프로그램 실행에 필요한 데이터를 사용자로부터 제공받는 것을 의미합니다. 자바에서 대표적인 입력 방법으로는 read()Scanner를 사용할 수 있습니다.

2.2.1 read()로 입력받기

read()는 가장 기본적인 입력 방법 중 하나입니다. 하지만 입력받은 값을 ASCII 코드로 처리하며, 한 번에 한 글자만 읽을 수 있다는 제약이 있습니다.

int input = System.in.read();
System.out.println(input);

예제:

  • 키보드로 숫자 1을 입력하고 Enter를 누른 경우:
    • 출력: 49 (ASCII 코드값)

주의:

  • read()는 한 글자만 읽을 수 있으며, 여러 글자를 입력해도 첫 글자만 처리합니다.
  • 처리된 입력값은 정수로 반환되기 때문에, 원래 입력값을 사용하려면 ASCII 코드를 변환해야 합니다.

2.2.2 Scanner 클래스로 입력받기

read()의 한계를 보완하기 위해 Scanner 클래스를 사용합니다. 이 클래스는 보다 직관적이고 다양한 입력 방법을 제공합니다.

1. Scanner와 스트림

ScannerSystem.in(입력 스트림)을 통해 키보드로 입력된 데이터를 읽습니다. 스트림은 데이터를 한 방향으로 전달하는 통로이며, 입력과 출력이 별도로 존재합니다.

2. 기본 사용법

Scanner를 통해 문자열, 정수, 실수 등을 입력받을 수 있습니다. 가장 기본적인 방법은 nextLine()을 사용하여 문자열을 입력받는 것입니다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // Scanner 객체 생성
        System.out.print("입력: ");
        String line = sc.nextLine(); // 한 줄 입력받기
        System.out.println("출력: " + line);
        sc.close(); // Scanner 닫기
    }
}

예제:

  • 입력: Hello World!
  • 출력: 출력: Hello World!

2.2.3 Scanner 메서드 정리

Scanner는 다양한 입력 메서드를 지원합니다. 주요 메서드는 다음과 같습니다.

nextLine()

  • 한 줄을 읽어서 문자열로 반환합니다.
  • 반환 타입은 String입니다.

nextInt()

  • 정수를 입력받아 반환합니다.
  • 반환 타입은 int입니다.

nextDouble()

  • 실수를 입력받아 반환합니다.
  • 반환 타입은 double입니다.

next()

  • 공백 이전까지의 문자열을 읽어서 반환합니다.
  • 반환 타입은 String입니다.

데이터 입력 예제:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("정수를 입력하세요: ");
        int num = sc.nextInt();
        System.out.println("입력한 정수: " + num);

        System.out.print("실수를 입력하세요: ");
        double d = sc.nextDouble();
        System.out.println("입력한 실수: " + d);

        sc.nextLine(); // 버퍼 비우기

        System.out.print("문자열을 입력하세요: ");
        String str = sc.nextLine();
        System.out.println("입력한 문자열: " + str);

        sc.close();
    }
}

주의:

1. 버퍼 문제:

nextInt()nextDouble() 같은 메서드는 숫자만 읽고, 입력한 줄의 나머지 부분(줄바꿈 문자 등)을 남겨둡니다. 그런데, 그다음에 nextLine()을 사용하면 이 남은 부분을 읽어버려서 예상치 못한 동작이 발생할 수 있습니다.

   # 문제가 있는 코드
   Scanner sc = new Scanner(System.in);
   
   System.out.print("숫자를 입력하세요: ");
   int number = sc.nextInt(); // 숫자만 읽음
   
   System.out.print("문자열을 입력하세요: ");
   String text = sc.nextLine(); // 남아있던 줄바꿈 문자를 읽음
   
   System.out.println("입력한 숫자: " + number);
   System.out.println("입력한 문자열: " + text);
  • 사용자가 123을 입력하고 Enter를 누르면, nextInt()123만 읽고, Enter를 의미하는 줄바꿈 문자는 남겨둡니다.
  • 이후 nextLine()이 줄바꿈 문자(Enter)를 읽어버려서 문자열 입력을 건너뛰는 문제가 발생합니다.
  • 버퍼 문제를 해결하기 위해서는 nextLine()을 호출하기 전에 빈 줄을 읽어 버퍼를 비워야 합니다.
   # 버퍼 비우기를 통해 문제를 해결
   int number = sc.nextInt();
   sc.nextLine(); // 버퍼 비우기
   String text = sc.nextLine(); // 정상적으로 입력 가능
  • 이렇게 하면 줄바꿈으로 인한 문제가 해결되어 올바르게 작동합니다.

2. close() 호출:

Scanner를 사용한 뒤에는 반드시 close()를 호출하여 스트림 리소스를 반환하는 것이 좋습니다(권장).

2.2.4 Scanner와 read()의 차이점

  1. 사용 용도

    • read()한 글자만 읽을 때 사용하며, 반환값은 ASCII 코드입니다.
    • Scanner문자열, 정수, 실수 등 다양한 데이터를 입력받는 데 사용됩니다.
  2. 편의성

    • read()는 단순하지만, 여러 글자 입력 처리나 데이터 변환이 번거로워 잘 사용하지 않습니다.
    • Scanner는 다양한 입력 메서드(nextLine(), nextInt() 등)로 편리하게 사용할 수 있어 일반적으로 널리 사용됩니다.
profile
donggyun_ee

0개의 댓글