얼마 전에 자바 프로그래밍의 상위 50개 질문에 대한 기사를 썼습니다. 독자들이 매우 좋아했습니다. 그래서 오늘은 자바에서 몇 가지 까다로운 면접 질문을 살펴보겠습니다.
자바 어려운 면접 질문
이들은 프로그래밍 질문이지만 자바에 대한 깊은 이해가 없으면 출력을 추측하고 설명하기가 어려울 것입니다.
1. 매개변수로 Null 전달하기
오버로드된 함수가 있고 null을 전달하고 있습니다. 어떤 함수가 호출되고 프로그램의 출력은 무엇일까요?
public class Test {
public static void main(String[] args) {
foo(null);
}
public static void foo(Object o) {
System.out.println("Object argument");
}
public static void foo(String s) {
System.out.println("String argument");
}
}
2. “L”을 long에 사용하기
아래 문장들의 출력을 추측할 수 있나요?
long longWithL = 1000*60*60*24*365L;
long longWithoutL = 1000*60*60*24*365;
System.out.println(longWithL);
System.out.println(longWithoutL);
Null Argument Tricky Question 설명
Java 사양에 따르면 오버로딩의 경우 컴파일러는 가장 구체적인 함수를 선택합니다. 명백히 String 클래스가 Object 클래스보다 구체적이므로 “String 인수”가 인쇄됩니다. 하지만 아래와 같이 클래스에 다른 메소드가 있는 경우 어떻게 될까요?
public static void foo(StringBuffer i){
System.out.println("StringBuffer impl");
}
이 경우, Java 컴파일러는 “Test 유형에 대해 foo(String) 메소드가 모호합니다”라는 오류를 발생시킵니다. String과 StringBuffer에는 상속 계층이 없습니다. 따라서 이들 중 어느 것도 다른 것보다 구체적이지 않습니다. 메소드가 다른 메소드보다 구체적이면 첫 번째 메소드로 처리된 모든 호출이 컴파일 타임 유형 오류 없이 다른 메소드로 전달될 수 있습니다. 우리는 String을 Object 인수 및 String 인수에 매개변수로 전달할 수 있지만 StringBuffer 인수 메소드에는 전달할 수 없습니다.
Long 변수에 대한 설명
코드 스니펫의 출력은 다음과 같습니다:
31536000000
1471228928
우리는 명시적으로 첫 번째 변수를 길게 만들기 위해 “L” 접미사를 추가합니다. 따라서 컴파일러는 그것을 long으로 취급하고 첫 번째 변수에 할당할 것입니다. 두 번째 문에 대해서는, 컴파일러가 계산을 수행하고 32비트 정수로 취급할 것입니다. 출력이 정수 최대 값 범위를 벗어나기 때문에(2147483647), 컴파일러는 가장 중요한 비트를 절단한 다음 변수에 할당할 것입니다. 1000*60*60*24*365L의 이진 동등물은 011101010111101100010010110000000000입니다(36비트). 32비트 int에 수용하기 위해 가장 중요한 4비트를 제거한 후 새 값은 01010111101100010010110000000000입니다(32비트). 이는 1471228928과 같으며 따라서 출력값입니다. 최근에는 자바 어려운 프로그램에 대한 YouTube 비디오 시리즈를 만들었습니다.
더 많은 자바 예제 프로그램은 우리의 GitHub 저장소에서 확인하실 수 있습니다.
Source:
https://www.digitalocean.com/community/tutorials/java-tricky-interview-questions