작성
·
179
0
안녕하세요.
래퍼클래스 강의 중 궁금한게 있어서 문의드립니다.
래퍼 클래스 기본형 한계 얘기하시면서 값이 있으면 MyInteger객체를 반환해주고 없으면 null을 반환한다고 하셨는데, MyInteger는 toString을 재정의 해서 해당 클래스의 value를 String으로 출력하도록 되어 있어서 value가 나오는건 알겠는데 밑의 예시처럼 값이 없을 때에는 null 이 나오는데 이게 System.out.println(null)과 같은 뜻일텐데 따로 이런식으로 입력해보면 null이라고 안 찍히고 에러가 나더라고요. println 메서드 까서 봐도 밑과 같이 되어 있는데 String.valueOf(null)은 에러가 나고요.
설명 부탁드립니다.
System.out.println(findValue(arrInt, 100));
public void println(Object x) {
String s = String.valueOf(x);
답변 2
0
안녕하세요. 인프린님, 공식 서포터즈 코즈위버입니다.
말씀하신 상황을 컴파일하며 확인하여 보니,
String.valueOf(null) 은 String.valueOf(char[]) 를 호출하게 됩니다. 그리고 이 메서드에는 null에 대한 처리가 없지요. 그래서 오류가 발생합니다.
System.out.println(null)의 경우 null이 타입이 아니어서 문제가 발생합니다. 어떤 println() 메서드를 호출해야 하는지 컴파일러가 결정을 하지 못해서 오류가 발생합니다. 아래는 오류 전문입니다.
java: reference to println is ambiguous
both method println(char[]) in java.io.PrintStream and method println(java.lang.String) in java.io.PrintStream match
println(char[])을 호출해야 하는지 println(String)을 호출해야 하는지 혼동이 오기에 컴파일을 할 수 없다는 내용을 설명하고 있습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
인프린님의 질문에 답변드리겠습니다. 래퍼 클래스와 관련해 System.out.println(null)
시 발생하는 에러와 이와 관련된 System.out.println(Object x)
의 동작 방식에 대해 궁금해 하시는 것 같습니다.
System.out.println(Object x)
을 호출할 때, null
값이 인자로 넘어온 경우 Java는 String.valueOf(Object obj)
메소드를 내부적으로 호출합니다. 이 메소드는 null
값에 대해서는 “null” 문자열을 반환합니다. 따라서 System.out.println(null)
이 호출되면 실제로 출력되는 것은 null
참조 자체가 아니라 “null”이라는 문자열입니다.
하나 중요한 점은 직접 null
값을 println
함수에 넘기는 것과, null
을 반환하는 메소드나 표현식을 println
에 넘기는 것 사이에 차이가 있습니다. 후자의 경우 Java 런타임은 null
이 어떤 타입인지 알 수 없으므로, “null”이라는 문자열로 처리를 합니다. 그러나 직접 System.out.println(null)
과 같이 호출하려고 하면 컴파일러는 어떤 메소드 오버로드를 호출해야 할지 결정할 수 없어 에러가 발생할 수 있습니다.
인프린님의 질문과 유사한 상황에 대해 예전에 다른 수강생 분이 질문한 내용이 있어 해당 답변을 참고하시면 도움이 될 것 같습니다. 이 경우는 System.out.println()
호출 시, 자바가 해당 객체의 toString()
메소드를 호출하는 자세한 설명을 담고 있습니다: return을 객체로 할 때 질문입니다.
여기서 언급된 것처럼, 객체의 toString()
메서드가 null이 아닌 경우 실제 toString()
메서드의 반환 값이 출력되며, 객체 자체가 null
인 경우에는 “null” 문자열이 출력됩니다. 이는 System.out.println()
내부 로직에서 null
처리 방식 때문입니다.
다만, 직접 System.out.println(null)
을 호출할 때 발생할 수 있는 문제는 메소드 오버로딩으로 인한 혼란 때문인데, 이 부분은 System.out.println((Object)null)
과 같이 명시적으로 타입을 지정해주면 해결할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.