1998년생인 내가 태국에서는 2541년생?!-자바

NakHyun Choi·2022년 11월 1일
0

https://www.acmicpc.net/problem/18108

자료구조를 조금씩 공부하기로 했다.
첫 문제는 아주 간단한 녀석으로.

요것이 문제이고 서기 연도와 불기 연도를 어떻게 구하는 지 안다면 쉽게 풀 수 있는 문제다.

불기는 서기에서 534년을 더한 것이고 입력 받을 값은 2541이기 때문에 Scanner 나 BufferedReader을 사용하면 된다.
위 두가지는 입력 방식이다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int x_num = sc.nextInt();
        int y_num = x_num - 543;

        System.out.println(y_num);

    }

}

Scanner를 통한 기본적인 방법으로 변수를 선언해서 풀었다.

다음은 BufferedReader인데 이녀석의 특징은 받은 값을 무조건 문자형으로 반환한다는 거다.
따라서 2541이라는 게 입력되면 문자로 반환되며 Int 값으로 형변환을 해야하는 특징을 가지고 있다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String s = br.readLine();	// 한 줄을 읽고 문자열로 반환함
        int year = Integer.parseInt(s);	// 반환 된 문자열을 정수로 바꿔줌
        int c_year = year - 543;
        
        System.out.println(c_year);
    }
}

여기서 궁금했던 것은 왜 br.readLine()은 IOException 처리를 해야할까? 였다.
https://itbeginner2020.tistory.com/27
그래서 이곳에서 해답을 찾았다.
readLine()를 살펴보면 synchronized(lock)으로 되있고 ensureOpen();을 호출하는데 이건
동기적 기능 즉 쓰레드가 동시에 호출되는 걸 막아주는 메서드라고 한다. 그래서 lock을 걸어서 한번에 한 사용자만 readLine 메서드에 접근해서 InputStreamReader가 열렸는지 확인 받는다.
InputStreamReader은 뭐야? 했더니
https://st-lab.tistory.com/41 이분이 나왔다... 좀 길었다.

자바에 대해서 잠시 공부를 할까? 이건 다른 글에서 정리하겠다.

뭐 암튼 그래서 synchronized 가 호출하고있는 ensureOpen() 메서드는 아래와 같았다.

private void ensureOpen() throws IOException {
       if (in == null)
           throw new IOException("Stream closed");
   }

in이 null이라는건 Reader(여기서는 키보드와의 connection) 가 프로그램에 인식되지 않는다는 의미이고, 이때 예외처리를 던진다.

자원이 없는데 강제로 read 시키면 프로그램 장애를 유발하는데, 미리 예외처리를 해서 막는것이다.

키보드 입력이 null 이라는게 접근 객체가 없다는 의미라고 생각했는데, 그건 inputstream=0 인것이고 inputstream=null 은 아예 자원이 인식이 되지 않는것을 의미했다.

혼자 개발할 때는 없는 일이지만, 실서비스로 넘어가면 종종 생기는 예외라고한다.
결론 : readLine() 에서 throwsException 하는 이유는 InputStream==null 일때의 장애를 대비해서 미리 예외처리를 해줘야했던것.
출처 - https://itbeginner2020.tistory.com/27

1문제 끝. 허나 다른 숙제가 생겼다...

profile
SuccessiveP

0개의 댓글