JAVA 상속 : 문제풀이 (3)

keymu·2024년 10월 1일
0

출력:
go in Sente go in Goban go in Goban

상속 관계에 있어서 메소드의 변천 과정을 물어보는 문제입니다.

Go Interface에서 상속받은 Sente 클래스의 객체 a.go() method는 Sente class, 즉 자신의 클래스 내부에 정의된 go() method를 실행합니다.
b.go() method도 자기 자신의 클래스 내부에 정의된 go() method를 실행합니다.
c.go()는 자신이 상속하고 있는 Goban 내부에 정의된 go() method를 실행합니다.

답은 C


B. 33번째 줄의 코드에서 예외가 발생하는 경우
C. 35번째 줄의 코드에서 예외가 발생하는 경우
E. 33번째 줄의 코드가 성공적으로 실행되는 경우

finally 블록은 예외가 발생하든 발생하지 않든 항상 실행됩니다.
finally 블록 내부의 코드(37번째 줄)는 위의 세 가지 시나리오 모두에서 실행됩니다.

답은 B, C, E


출력: case 3 블록 내부의 println 문이 "three"를 출력

값이 1과 2인 두 개의 Integer 객체가 생성됩니다.
Integer 객체에 대해 + 연산자가 오버로딩되어 있어, 더하기 연산을 수행하고 합계(3)가 포함된 새로운 Integer 객체를 반환합니다.
switch 문은 i 표현식(값이 3인 Integer 객체)을 평가합니다.
case 3 레이블이 i의 값과 일치하므로, 해당 케이스 블록 내부의 코드가 실행됩니다.

답은 A


set은 HashSet으로 선언되며, 중복 요소를 허용하지 않는 집합입니다.
i1과 i2는 각각 45와 46의 값을 가지는 Integer 객체입니다.

i1은 두 번 set에 추가되지만, HashSet은 중복을 허용하지 않기 때문에 두 번째 i1은 무시됩니다. 현재 set에는 한 개의 요소 45만 들어갑니다.
i2는 46을 가리키고 있으며, 이것이 set에 추가됩니다.
set에는 두 개의 요소 45와 46이 있습니다.
set.size()는 현재 2를 반환합니다 (요소 45와 46).
출력은 2입니다.

set에서 i1(즉, 45)를 제거합니다.
set에는 46만 남습니다.
이제 set.size()는 1을 반환합니다. (요소 46만 존재). 출력은 1입니다.

i2는 이제 47을 가리킵니다. 하지만, 이는 set과 관련된 기존의 46 객체와는 다른 새로운 객체입니다.
현재 i2는 47을 가리키지만, set에는 47이 없고, 46만 있습니다.
따라서 아무런 변화가 없습니다.
set.size()는 여전히 1을 반환합니다 (요소 46만 존재).
출력은 1입니다.

답은 2 1 1


코드 분석:

Line 5:
Object o = new Object();
여기서 새로운 Object 인스턴스가 생성되고, 이 객체는 o라는 로컬 변수에 할당됩니다. 이 시점에서 o는 해당 객체를 참조하고 있습니다.

Line 6:
doSomethingElse(o);
o가 doSomethingElse 메서드로 전달됩니다. 이 메서드 안에서 obj는 GC 클래스의 인스턴스 변수 o에 할당됩니다.
즉, 이제 두 개의 참조가 존재합니다:
로컬 변수 o (5번 라인에서 생성된 객체를 참조) / 인스턴스 변수 o (3번 라인에서 obj를 받음)

Line 7:
o = new Object();
여기서 로컬 변수 o가 새로운 Object 인스턴스로 덮어씌워집니다. 이제 5번 라인에서 생성된 객체는 로컬 변수 o로부터 참조되지 않습니다. 하지만 여전히 인스턴스 변수 o가 그 객체를 참조하고 있으므로, 아직 가비지 컬렉션 대상이 아닙니다.

Line 8:
doSomethingElse(null);
이번에는 null이 doSomethingElse 메서드에 전달됩니다. 이 메서드는 인스턴스 변수 o에 null을 할당합니다. 따라서 이제 5번 라인에서 생성된 객체를 참조하는 것이 완전히 사라집니다. 이 시점에서 더 이상 그 객체를 참조하는 변수가 없으므로, 5번 라인에서 생성된 객체는 가비지 컬렉션의 대상이 됩니다.

Line 9:
o = null;
이 라인에서는 로컬 변수 o에 null이 할당됩니다. 하지만 5번 라인에서 생성된 객체는 이미 8번 라인에서 참조가 끊겼으므로 이 라인은 해당 객체와는 상관이 없습니다.

Line 10:
메서드가 끝나면서 로컬 변수들이 모두 벗어납니다.

결론:
5번 라인에서 생성된 객체는 8번 라인 이후에 가비지 컬렉션 대상이 됩니다. 그 이유는 8번 라인에서 인스턴스 변수 o가 null로 설정되면서 더 이상 해당 객체를 참조하지 않기 때문입니다.

답은 D


내부클래스에서는 외부클래스의 모든 메소드와 변수를 사용할 수 있습니다.
private으로 지정된 메소드와 클래스도 마찬가지로 사용할 수 있습니다.
내부 클래스에서는 외부클래스의 변수와 메소드도 모두 내부클래스 안에서 선언한 것처럼 사용하면 됩니다.

B. The code compiles and the output is 2.
E. If lines 16, 17 and 18 were removed, the code would compile and the output would be 2.
F. If lines 24, 25 and 26 were removed, the code would compile and the output would be 1.

  1. The code compiles and the output is 2.
    코드는 정상적으로 컴파일됩니다.
    이유는 testFoo() 메서드 내부에 로컬 클래스로 정의된 A 클래스(24~26줄)의 bar() 메서드가 fubar() 메서드에 전달되기 때문입니다. 이 로컬 클래스의 bar() 메서드는 2를 반환하므로 출력도 2입니다.

  2. If lines 16, 17 and 18 were removed, the code would compile and the output would be 2.
    만약 16~18줄이 삭제되어도 코드는 여전히 정상적으로 컴파일되며, 출력은 여전히 2입니다.
    이유는 16~18줄의 클래스 A는 Beta 클래스의 멤버 클래스로 정의되어 있지만, 실제로 사용되지 않습니다. testFoo() 메서드 내부에 있는 로컬 클래스 A가 우선적으로 사용되므로, 멤버 클래스 A가 없어도 문제가 없습니다.

  3. If lines 24, 25 and 26 were removed, the code would compile and the output would be 1.
    만약 24~26줄이 삭제되면 로컬 클래스 A가 사라지게 되고, 그 결과 멤버 클래스 A가 대신 사용됩니다. 멤버 클래스 A의 bar() 메서드는 1을 반환하므로 출력은 1이 됩니다.

답은 BEF

profile
Junior Backend Developer

0개의 댓글