본문 바로가기
JAVA/기본 이론

4. 입/출력 (Input/Output, I/O)

by D.O.T 2024. 2. 24.

프로젝트 진행 중이라 글을 작성하지 못하고 있었네요. 다시 블로그 글 열심히 작성해보겠습니다.

앞서 확인해보니 입/출력에 대해 빼뜨려먹어서 지금 작성합니다.

 

입/출력이란?

 

자바에서 입/출력이란 우리가 알고 있는 느낌 그대로.

우리가 지금 포스트 글 또는 댓글과 같이 텍스트 박스에 글을 작성하면 화면에 보이는 것.

키보드를 이용해서 글을 작성하는 행위가 입력이고 작성된 글이 화면에 보이는 것이 출력이다.

 

자바에서 출력하는 방법
public class Main {
    public static void main(String[] args){
        System.out.println("Hello World!");
    }
}

 

기본적으로 자바를 시작하게 되면 Intelli J와 Eclipse같은 IDE에서 제공하는 문법이다.

자바에서는 System.out에서 println이라는 메서드를 통해 출력할 수 있다.

 

자바에서 입력하는 방법
import java.util.Scanner;

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

출력 하는 방법이 System.out이라서 입력하는 방법은 System.in이라고 생각했다면 정말 잘한 것이다.

하지만 System.in은 내부적으로 조금 복잡하다. 자바를 처음 시작한다면 Scanner를 이용해 입력하는 것이 좋다.


출력 (Output)

System.out의 다양한 메서드(Method)

public class Main {
    public static void main(String[] args){
        System.out.print("print");      // 값이 들어가야 함.
        System.out.println();           // 빈 값이어도 됨.
        System.out.printf("printf");    // 값이 들어가야 함.
        System.out.format("");          // 값이 들어가야 함.
    }
}

기본적으로 Intelli J를 사용한다면 어떤 자료형들이 들어갈 수 있는지 알 수 있다.

추가로 괄호 안에서 Ctrl + p를 누른다면 어떤 값들을 입력해야하는지 전체적으로 알 수 있다.

 

다양한 출력 방법들이 있지만 주로 사용하는 것들은 위의 4가지 케이스이다.

나는 C언어에 익숙해서 주로 printf를 사용하긴 한다.

 

print, println

 

얘네 둘은 거의 똑같다고 보면 된다.

차이점은? println에서 ln은 line의 약자이다. 무조건 1줄을 가져간다는 의미이다.

그래서 위의 예제에서 보면 println은 빈 값이어도 동작한다. 빈 값이면 빈 줄 하나를 생성하기 때문이다.

print는 새로운 줄을 생성하지 못하기 때문에 무조건 값을 작성해주어야 한다. 

System.out.print("\n");
System.out.println();

둘은 같은 데이터이다. '\n' 은 nextLine으로 개행문자를 의미한다.

 

이때 출력 값에는 어떤 자료형이든 다 들어갈 수 있다. 물론 아래와 같은 쓰레기 값은 안된다.

System.out.print(sdfsdf); 

이전 포스트에서 설명한 자료형에 부합하는 데이터를 말하는 것이다. 

대신 주의할 점이 있다. print 메서드는 내부에서 모든 자료형을 문자열로 바꾸어주는 과정이 수행된다.

그래서 다른 데이터간의 표현은 ' + '로 묶어주어야 한다.

System.out.print(1 + "은 " + true + "와 같다");

이렇게

 

그리고 연산과 같은 작업은 괄호로 묶어주면 되는데 나는 하나의 변수를 따로 만들어서 안전하게 출력하는걸 추천한다.

int result = 1 + 1;
System.out.println("1 + 1 = " + (1 + 1) + ", 변수 : " + result);

 

printf와 format

 

얘네 둘은 걍 똑같다. 입맛에 따라 선택해서 고르면 된다.

출력 방식은 %를 이용한 형식지정방식을 사용한다.

이게 무슨 말이냐면 명령어가 존재하는 것이다.

%d, %f, %n, \n, \t, ... 뭐 많은데 솔직히 다 외울 필요가 없다.

아, 참고로 \n과 같은 개행문자는 형식 지정자가 아니다. 하나의 문자이다. 그래서 print에서도 써진다.

형식 지정자에서는 개행 문자를 %n으로도 쓰긴 하는데 \n이 젤 편하다.

 

가장 중요한 정수 표현 방식인 %d, 실수 표현 방식인 %f 정도만 알아도 된다.

자세한 내용은 오라클 Formatting 에서 참고하길 바란다.

public class Main {

    public static void main(String[] args) {
        System.out.printf("\tDOT의 자바 공부방\n");
        System.out.printf("\t정수 표현 : %d\n", 100);
        System.out.printf("\t실수 표현 : %f\n", 200.0f);
        System.out.printf("\t큰수 표현 : %d\n", 100000000000000L);
        System.out.printf("\t큰 실수 표현 : %f\n", 200.0d);
        System.out.printf("\t소수점 특정자리 표현 : %.3f\n", 200.303434242f);
        System.out.printf("\t천단위 끊기 표현 : %,d\n", 10000);
    }

}

 

 


입력 (Input)

Scanner 기능

얘도 보면 뭐가 많긴 많다... 이름이 Scanner라서 뭐 스캔하는 기능도 있다. 하지만 우리는 입력 기능만 사용해보자.

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String next = input.next();
        String nextLine = input.nextLine();
        int nextInt = input.nextInt();
    }

}

 

잡다한 기능이 많은데 입력받는 기능은 next로 시작한다고 보면 된다.

어떤 데이터로 입력받을 것인지에 따라서 nextInt, nextLine, ... 등으로 나뉘게 된다.

실제로는 주로 문자열을 다루기 때문에 nextLine을 많기 사용하긴한다.

 

이렇게 next에 마우스 커서를 가져다 대면 String Type인 것을 알 수 있고 이를 토대로 변수를 선언하면 된다.

 

input을 할 때 중요한 점

String next = input.next();
System.out.println("next = " + next);

String nextLine = input.nextLine();
System.out.println("nextLine = " + nextLine);

int nextInt = input.nextInt();
System.out.println("nextInt = " + nextInt);

 

그냥 이렇게 출력해버리면 사진과 같은 이슈가 발생해버린다.

그 이유는 뭘까?

우리는 입력할 때 버퍼라는 저장공간에 데이터를 임시 저장해두었다가 한번에 가져오게된다.

컴퓨터 시스템 상 버퍼라는 공간이 없다면 입력하는 순간 순간 출력해버려야 하는 것이다.

이건 너무 비효율적이다..

 

컴퓨터 시스템에서 입력하는 순간 순간 출력한다는게 어떤 의미인지 예시를 들어보자.

'안녕하세요'라는 문자열을 출력하는 과정을 해보자.

1. Ctrl + R을 누른다 (메모장 실행) -> 소프트웨어 실행

2. 안을 친다. -> 메모장에 저장

3. 녕을 친다. -> 메모장에 이어서 저장

4. 하를 친다. -> 메모장에 이어서 저장

5, 6. 세, 요

글 쓰다가도 지친다. 5글자도 이런데 블로그 포스트 같은 것을 작성한다면 얼마나 많은 작업이 수행 되는지 느껴질 것이다.

 

버퍼를 사용해보자.

1. Ctrl + R을 누른다 (노트북 실행) -> 소프트웨어 실행

2. 안녕하세요를 친다. -> 버퍼에 저장

3. 버퍼에서 한 번에 메모장에 저장

버퍼의 크기에 따라서 한 번만에 될 수도 수십번만에 수행될 수도 있지만 확실한건 버퍼 없이 하나씩 하는 것보단 훨씬 빠르다는 점이다.

 

본론으로 돌아가서 nextLine()는 버퍼에서 Enter까지 한 번에 저장하는 것이다.

그 외, next()나 nextInt() 등 다른 것들은 Enter 직전까지 한 번에 저장하는 것이다.

입력 과정에서 Enter는 무조건 들어갈 수 밖에 없다.

그래서 nextLine을 제외한 다른 것들을 사용할 때는 nextLine()으로 Enter를 한 번 비워줘야한다.

 

그리고 조금 더 정확하게 짚고 넘어가자면 nextLine을 제외한 다른 기능들은 공백을 만나기 직전까지이다.

공백에는 개행문자인 엔터도 포함이 되지만 띄어쓰기인 스페이스바도 포함이 된다.

 

Scanner input = new Scanner(System.in);
String next = input.next();
System.out.println("next = " + next);
input.nextLine();

String nextLine = input.nextLine();
System.out.println("nextLine = " + nextLine);

int nextInt = input.nextInt();
System.out.println("nextInt = " + nextInt);
input.nextLine();

 

노션 정리 사이트

 

https://www.notion.so/24jihwan/8a7e948fcc6b45cbb43af2745586ad36

 

입출력 | Notion

입출력

24jihwan.notion.site

 

'JAVA > 기본 이론' 카테고리의 다른 글

10. Casting (형변환)  (0) 2024.07.14
9. 반복문 - while 문, do while 문  (1) 2024.02.10
8. 반복문 - for 문  (1) 2024.02.10
7. 다차원 배열 (Multi Dimensional Array)  (1) 2024.02.10
6. 배열 (Array)  (1) 2024.02.10