소환사쇽쇽
1k
2021-03-23 02:23:24
2
214

java api 문서 해석 도와주세요.


java.io

Class PrintWriter

클래스의

write

public void write(String s)
Writes a string. This method cannot be inherited from the Writer class because it must suppress I/O exceptions.
Overrides:write in class WriterParameters:s - String to be written

print

public void print(String s)
Prints a string. If the argument is null then the string "null" is printed. Otherwise, the string's characters are converted into bytes according to the platform's default character encoding, and these bytes are written in exactly the manner of the write(int) method.
Parameters:s - The String to be printed

입니다.

서블릿으로 html 페이지 작성 중 두 메서드의 동작이 (제 생각에) 같은데 어떤 차이인지 알고 싶어서 문서를 읽었는데 이해를 잘 못 했습니다.
우선 This method cannot be inherited from the Writer class because it must suppress I/O exceptions.여기부터 막힙니다. 이 메서드는 I/O exception을 억제(?)해야 하므로 Writer 클래스로부터 상속받을 수 없다. 라고 번역은 했는데 왜 그런지 잘 모르겠습니다. ㅠ
Writer 클래스도 찾아보았는데 write(String str)로 구현된 메서드가 있고 위 문구처럼 I/O exception을 던지는 것을 확인했습니다. 예외 사항을 던지는 메서드는 오버라이드가 안 된다는 것인가요?
그런데 막상 PrintWriter 클래스의 write를 읽어보면 
Overrides:write in class Writer
overrides라고 적혀 있는데 이게 상속 받았다는 것 아닌가요? print 메서드와의 비교는 고사하고 write 메서드 하나의 해석도 막히네요. ㅠㅠ
어느 부분이 되었든 조금이라도 설명 해주시면 감사하겠습니다.



0
  • 답변 2

  • 엡실론
    1k
    2021-03-23 02:53:23

    Writer 클래스를 보면 여러 write() 메소드가 있고, write(char[], int, int)만 abstract method입니다. 코드를 굳이 살펴보지 않아도 아마도 다른 write 메소는 저 abstract method를 이용해서 구현되어 있겠죠. 따라서 Writer를 상속한 클래스는 write(char[], int, int)만 구현해도 write(String)을 비롯한 나머지 write를 그냥 쓸 수 있습니다. 하지만 Writer 클래스의 write 메소드들은 모두 IOException을 던지게 되어 있는데, PrintWriter에서는 그걸 피하고 싶기 떄문에 기능적으로는 Writer 클래스의 write와 다를 바 없지만, 상속받지 않고 오버라이딩해서 다시 구현한 것입니다.

    write와 print의 차이는 print() 설명 부분에 있는대로 null이면 "null"이라고 출력하는 점이 다릅니다.

  • fender
    21k
    2021-03-23 07:18:22

    조금 애매하게 설명을 해서 헷갈리는 경우인 것 같습니다. 해당 구문을 이해하기 위해선 맥락을 볼 필요가 있는데, PrintWriter 클래스의 설명에는 이런 내용이 있습니다:

    Methods in this class never throw I/O exceptions, although some of its constructors may. The client may inquire as to whether any errors have occurred by invoking checkError().

    즉, 클래스의 목적 자체가 예외 처리 같은 것을 신경 쓰지 않고 편하게 'println' 등을 호출해서 문자열을 찍는데 있는 상황입니다.

    그래서 해당 클래스에서 체크트 예외를 던지는 Writer.writer 메서드 구현을 그대로 사용할 수 없으니, 시그네쳐에서 예외를 지우기 위해 오버라이드 했다는 뜻입니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.