자바 완전 정복 13장 연습문제 풀이
1번. 다음과 같이 클래스 내부에 이너 클래스와 이너 인터페이스가 위치할 때 컴파일 이휴 생성되는 모든 .class 파일명을 쓰시오.
class A { //A.class
class B {} //A$B.class
interface C {} //A$C.class
class D { //A$D.class
void def() {
//지역이너클래스 : 아우터클래스+$+숫자+지역이너클래스+.class
class E {} //A$D$1E.class
}
}
}
2번. 클래스 A 내부에 이너 클래스 B가 있을 때 다음 코드와 같이 b.bcd()의 결과가 "이너 클래스와 메서드"로 출력되도록 이너 클래스 객체를 생성하는 코드를 작성하시오(참조 변수명은 b로 정함).
class A {
class B {
void bcd() {
System.out.println("이너 클래스와 메서드");
}
}
}
public static void main(String[] args) {
A a = new A(); //외부 클래스 먼저 선언
A.B b = a.new B(); //내부 클래스 추후 선언
b.bcd();
}
3번. 실행 결과가 "클래스 A 메서드"가 나오도록 이너 클래스 B의 bcd() 메소드에서 클래스 A의 print() 메소드를 호출하는 코드를 작성하시오.
class A {
void print() {
System.out.println("클래스 A 메서드");
}
class B {
void print() {
System.out.println("클래스 B 메서드");
}
void bcd( ) {
//이너 클래스에서 아우터 클래스 멤버 참조 시 this 키워드 사용
A.this.print();
}
}
}
public static void main(String[] args) {
A a = new A();
A.B ab = a.new B();
ab.bcd();
}
4번. 클래스 A 내부에 정적 이너 클래스 B가 있을 때 다음 코드와 같이 b.bcd()의 결과가 "정적 이너 클래스와 메서드"가 출력되도록 정적 이너 클래스의 객체를 생성하는 코드를 작성하시오(참조 변수명은 ab로 정함).
class A {
static class B {
void bcd() {
System.out.println("정적 이너 클래스의 메서드");
}
}
}
public static void main(String[] args) {
A.B ab = new A.B();
ab.bcd();
}
5번. 다음과 같이 이너 클래스 B는 bcd() 메서드를 포함하고 있으며, 여기에는 4줄의 실행문이 포함돼 있다. 각 실행문의 가능 여부를 O, X로 표기하고, X라면 그 이류를 쓰시오.
class A {
int a=3;
static int b=4;
void method1() {
}
static void method2() {
}
static class B {
void bcd() {
System.out.println(a);
System.out.println(b);
method1();
method2();
}
}
}
실행문 | 실행문 가능 여부(O, X) | 오류가 발생한 이유 |
System.out.println(a); | X | static 클래스 내에서는 외부 static 필드와 메서드만 사용 가능. (인스턴스 필드, 메서드 불가) |
System.out.println(b); | O | |
method1(); | X | |
method2(); | O |
6번. 다음 코드는 오류를 포함하고 있다. 오류가 발생한 위치와 그 이유를 설명하시오.
class A { // 1
int m=3; // 2
int n=5; // 3
void abc() { // 4
int n=5; // 5
class B { // 6
void bcd() { // 7
m=m+1; System.out.println(m); // 8
n=m+1; System.out.println(n); // 9
} // 10
} // 11
} // 12
} // 13
오류가 발생한 행 번호 | 오류가 발생한 이유 |
9행 | 지역 이너 클래스 내부 지역변수는 final 지정자로 강제 선언되기 때문에 값을 변경할 수 없다. |
7번. 다음과 같이 클래스 A 내에 이너 인터페이스 B가 있을 떄 이너 인터페이스의 객체를 생성하는 코드를 익명 이너 클래스 방법으로 작성하시오(객체의 참조 변수명은 ab로 하고, 메서드 오버라이딩일 때 메서드 내부는 비워 둠).
class A {
interface B {
void abc();
}
}
public static void main(String[] args) {
//이너 인터페이스의 객체 생성(익명 이너 클래스 이용)
A.B ab = new A.B() {
@Override
public void abc() {}
};
ab.abc();
}
8번. 다음과 같이 이너 인터페이스 내부에 static 메서드가 있을 때 이 메서드를 호출하는 코드를 작성하시오.
class A {
interface B {
static void bcd() {
System.out.println("이너 인터페이스 내 static 메서드");
}
}
}
public static void main(String[] args) {
//이너 인터페이스의 객체 생성(익명 이너 클래스 이용)
A.B.bcd();
}