728x90
반응형
1. 개요
자바의 입력 함수 중 Scanner와 BufferedReader를 알게되었는데 Scanner에서는 그냥 사용하지만 BufferedReader를 사용할 때에는 항상 함수의 매개변수 옆에 throws IOException을 써줬다. Input Output에 관한 예외처리인 것 같았지만 확실히 알고싶어 함수를 뜯어보고 검색해서 찾아봤다.
1. BufferedReader
import java.io.InputStreamReader;
import java.util.Scanner;
public class Study {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
}
}
BufferedReader을 사용할 때에는 먼저 BufferedReader객체를 선언한 뒤 사용하게 되는데, 객체 변수명.readLine()함수를 선언하는데 만약 IOException을 붙이지 않고 사용하게되면 readLine()에서 오류가 뜨게된다.
그래서 readLine()을 뜯어봤다.
2. readLine()
String readLine(boolean ignoreLF, boolean[] term) throws IOException {
StringBuilder s = null;
int startChar;
synchronized (lock) {
ensureOpen();
boolean omitLF = ignoreLF || skipLF;
if (term != null) term[0] = false;
bufferLoop:
for (;;) {
if (nextChar >= nChars)
fill();
if (nextChar >= nChars) { /* EOF */
if (s != null && s.length() > 0)
return s.toString();
else
return null;
}
boolean eol = false;
char c = 0;
int i;
/* Skip a leftover '\n', if necessary */
if (omitLF && (cb[nextChar] == '\n'))
nextChar++;
skipLF = false;
omitLF = false;
charLoop:
for (i = nextChar; i < nChars; i++) {
c = cb[i];
if ((c == '\n') || (c == '\r')) {
if (term != null) term[0] = true;
eol = true;
break charLoop;
}
}
startChar = nextChar;
nextChar = i;
if (eol) {
String str;
if (s == null) {
str = new String(cb, startChar, i - startChar);
} else {
s.append(cb, startChar, i - startChar);
str = s.toString();
}
nextChar++;
if (c == '\r') {
skipLF = true;
}
return str;
}
if (s == null)
s = new StringBuilder(defaultExpectedLineLength);
s.append(cb, startChar, i - startChar);
}
}
}
이게 readLine함수의 내부 코드이다.
함수 내에서 synchronized 함수를 호출하고 있다.
Synchronized란?
synchronized 키워드는 동기화가 필요한 메소드나 코드 블럭 앞에 사용해서 동기화 할 수 있다고 한다. synchronized로 지정된 임계영역은 한 스레드가 이 영역에 접근하여 사용할 때 lock이 걸림으로써 다른 스레드가 접근하지 못하게 만들고 현재 코드가 코드를 다 실행 후 벗어나게 되면 unlock 상태가 되어 그 이후에 대기하고 있던 다른 스레드가 다시 lock을 걸고 이 영역에 들어가 사용한다.
너무 어려우니 쉽게 말해서 동시 호출을 막아주는 메서드이며 한 코드가 실행되면 다른 코드블럭은 대기 후 먼저 실행된 코드가 다 호출된 이후에 들어가서 실행된다.
BufferedReader에서는 readLine메서드에 접근하여 InputStreamReader가 열렸는지 확인해준다.
3. ensureOpen()
/** Checks to make sure that the stream has not been closed */
private void ensureOpen() throws IOException {
if (in == null)
throw new IOException("Stream closed");
}
ensureOpen함수에서는 in == null 이면 IOException을 던진다.
즉 readLine()에 입력된 값이 null일때를 대비해서 예외처리를 해주는 것이다.
null인 경우
변수를 선언할 때 int a = null; 선언한 이후 a라는 변수에 다른 입력값이 들어가지 않은 상태로 null 그대로 전달 된 경우 IOException을 반환.
- null > 초기화되지 않은 것. Value조차 존재하지 않음
- 0 > Value가 0
궁금한 부분이 생기면 찾아보고 토대로 제가 이해한 내용을 글로 정리하는 개인 공부 블로그입니다.
내용 중 틀린 부분은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
728x90
반응형
'Backend > Java' 카테고리의 다른 글
[Java] Overloading / Overriding (2) | 2023.12.07 |
---|---|
[Backend/Java] 입출력 (Tokenizer / BufferedReader / split) (0) | 2023.08.15 |