Java io와 캐리지리턴

조회수 2242회

안녕하세요. 항상 좋은 답변 감사합니다! 혼자 공부를 하는데 구글에 찾아도 이해하기 어려울때마다 해시코드를 찾고 있습니다. 정말로 감사합니다.

io를 공부하고 있는데 출력값이 이상해서 여쭤보려고 왔습니다.

package streamEx;

import java.io.IOException;

public class inputStreamTest2 {

    public static void main(String[] args) {
        byte[] input = new byte[5];

        int i = 0;
        int cnt = 0; // count
        int tot = 0; // total
        System.out.println("컨솔창에 입력하여라!");
        try {
            while((i= System.in.read(input)) != -1){ 
                cnt++; // 반복문 횟수
                tot += i;

                System.out.println("i: "+i);
                System.out.write(input, 0, i);

            }    System.out.println("cnt: "+cnt);

            System.out.println("읽은 byte수: "+tot);
            System.in.close();
            System.out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

제가 AppleTest라고 이클립스에 입력을 하면

i: 5
Applei: 5
Test
i: 1

이렇게 출력되나

cmd를 통한 출력을 하게 되면

i: 5
Applei: 5
i: 1t

이렇게 출력됩니다.

제가 생각했을 때는

i: 5
Applei: 5
i: 1
Test

으로 되어야한다고 생각했는데

  1. cmd에선 왜 덮어씌어서 출력이 될까요?
  2. 그리고 이클립스와 cmd의 출력의 차이가 왜 있는 것일까요?

  3. 배열에 대한 메모리구조에 대해 질문있습니다. 소스를 보시면 input이라는 5byte짜리 배열을 선언했는데 제가 "AppleTest"라는 글자를 넣으면 '/r''/n' 까지 포함하여 11byte를 입력한건데 오버플로우가 안되고 왜 전부다 출력이 되는건지 궁금합니다. 설명을 보면 input스트림에

    "_ _ _ _ /n /r t e s T e l p p A "(_는 빈칸입니다.)
    

    입력이 되고, output스트림에는

    " i:5\nApllei:5Test\ri:1\n\n "
    

    로 입력이 된다는데 그럼 input[0] = "Apple", input[1] = "Test\r", input[2] ="\n" 이런식으로 들어간다는 말인가요??

비오는데 감기조심하세요~~~

1 답변

  • 일단 \r 과 \n 에 대한 차이점을 이해할 필요가 있습니다.

    옛날의 타자기에서 줄바꿀때 일어나는 일을 표현한 것입니다.

    • \n (라인피드) 은 줄바꿈이며
    • \r (캐리지리턴) 은 행의 첫줄로 헤드를 옮기는 것입니다.

    이게 전자식 타자기로 바뀔 때, 줄바꿈과 행의 첫줄로 옮기는 일이 동시에 일어나도록 수정됩니다.

    일단 윈도우즈는 위의 라인피드와 캐리지 리턴을 분리해서 다루고, 유닉스계열은 \n으로 두가지를 동시에 표현합니다.

    AppleTest 로 입력하면

    input 배열의 크기가 5 임으로,

    • 첫번째 반복에서 "Apple" 이 저장됩니다.
    • 두번째 반복에서는 "Test\r" 이 저장됩니다.
    • 세번째 반복에서는 "\n"이 저장될 겁니다.

    위를 순서대로 출력하면

    i:5
    Apple
    

    이 처음에 출력되고 이어서

    i:5
    Test\r
    

    이 출력됨으로 합치면

    i:5
    Applei:5
    Test
    

    인데, 이 때 커서는 T의 앞에 위치하게 됩니다. 마지막으로 출력은

    i:1
    \n
    

    임으로, 최종적으로는

    i:5
    Applei:5
    i:1t
    
    

    로 커서의 위치에서 i:1을 출력하여 Tes가 덮어씌어지고, \n에 의해 개행하게 됩니다.

    이클립스는 아마도 \r와 \n 을 유닉스처럼 동일하게 처리하는 것으로 생각됩니다. (어딘가에 설정을 바꾸면 cmd와 똑같게 할 수도 있을 것 같습니다.)

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)