UniCode
[이것이 자바다]CH09.중첩 클래스와 중첩 인터페이스(확인문제풀이) 본문
1. 중첩 멤버 클래스에 대한 설명으로 틀린 것은 무엇입니까 ?
① 인스턴스 멤버 클래스는 바깥 클래스의 객체가 있어야 사용될 수 있다.
② 정적 멤버 클래스는 바깥 클래스의 객체가 없어도 사용될 수 있다.
③ 인스턴스 멤버 클래스 내부에는 바깥 클래스의 모든 필드와 메소드를 사용할 수 있다.
④ 정적 멤버 클래스 내부에는 바깥 클래스의 인스턴스 필드를 사용할 수 있다.
☞ ④ 정적 멤버 클래스 내부에는 바깥 클래스의 인스턴스 필드를 사용할 수 있다.
정적 멤버 클래스안에서는 바깥 클래스의 정적 필드와 정적 메소드에만 접근이 가능하고
인스턴스 필드와 인스턴스 메소드에는 접근할 수 없다.
>정적 필드, 정적 메소드 > 메소드 영역 > 클래스 외부에서 사용 시 객체를 생성하지않고 접근 가능
A(바깥클래스).C(내부정적클래스) = new A.C();
>인스턴스 필드, 인스턴스 메소드 > 힙 영역 > 클래스 외부에서 사용 시 객체를 생성해야만 접근 가능
A(바깥클래스) a = new A(); // 바깥 클래스 객체 생성
A.B(내부인스턴스클래스) b = a.new B(); // 바깥 클래스 객체 생성 후 내부 인스턴스 클래스 생성
2. 로컬 클래스에 대한 설명으로 틀린 것은 무엇입니까?
① 로컬 클래스는 메소드 내부에 선언된 클래스를 말한다.
② 로컬 클래스는 바깥 클래스의 모든 필드와 메소드를 사용할 수 있다.
③ 로컬 클래스는 static 키워드를 이용해서 정적 클래스로 만들 수 있다.
④ final 특성을 가진 매개 변수나 로컬 변수만 로컬 클래스 내부에서 사용할 수 있다.
☞ ③ 로컬 클래스는 static 키워드를 이용해서 정적 클래스로 만들 수 있다.
로컬 클래스는 메소드 내부에서만 사용되므로 접근 제한자(public, private) 및 static을 붙일 수 없다. 또한 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.
3. 익명 객체에 대한 설명으로 틀린 것은?
① 익명 객체는 클래스를 상속하거나 인터페이스를 구현해야만 생성될 수 있다.
② 익명 객체는 필드, 매개 변수, 로컬 변수의 초기값으로 주로 사용된다.
③ 익명 객체에는 생성자를 선언할 수 있다.
④ 부모 클래스나 인터페이스에 선언된 필드와 메소드 의외에 다른 필드와 메소드를 선언할 수 있지만, 익명 객체 내부에서만 사용이 가능하다.
☞ ③ 익명 객체에는 생성자를 선언할 수 있다.
부모클래스 [필드|변수] = new 부모클래스(매개값, ...) { /*㉠*/ }
> new 부모클래스(매개값, ...) 부모 클래스의 생성자 호출 코드로 매개값은 부모 생성자의 매개변수에 맞게 입력> ㉠ : 필드나 메소드를 선언하거나 부모 클래스의 메소드를 재정의하는 내용 생성자 선언 불가능 익명 객체 생성 이후 [필드|변수].필드 , [필드|변수].메소드 로 호출가능한 필드와 메소드는 부모 클래스에 있는 인스턴스 멤버, 오버라이딩된 메소드만 가능하다.
4. 다음과 같이 Car 클래스 내부에 Tire와 Engine이 멤버 클래스로 선언되어 있습니다. NestedClassExample에서 멤버 클래스의 객체를 생성하는 코드를 작성해보세요.
Car.java |
public class Car { class Tire { } static class Engine { } } |
public class NestedClassExample{
public static void main(String[] arge){
Car myCar = new Car();
// 인스턴스 클래스는 바깥 클래스의 객체가 생성되어야만 객체 생성 가능
Car.Tire tire = myCar.new Tire();
// 정적 클래스는 바깥 클래스의 객체가 생성되어있지 않아도 객체 생성 가능
Car.Engine engine = new Car.Engine();
}
}
5. AnonymousExample 클래스의 실행 결과를 보고 Vehicle 인터페이스의 익명 구현 객체를 이용해서 필드, 로컬 변수의 초기값과 메소드의 매개값을 대입해보세요.
Vehicle.java |
public interface Vehicle{ public void run(); } |
public class Anonymous {
Vehicle feild = new Vehicle(){
@Override
void run(){
System.out.println("자전거를 달립니다.");
}
};
void method1(){
Vehicle localVar = new Vehicle(){
@Override
void run(){
System.out.println("승용차가 달립니다.");
}
};
localVar.run();
}
void method2(Vehicle v) {
v.run();
}
}
public class AnonEx{
public static void main(String[] args){
Anon anon = new Anon();
anon.field.run();
an.method1();
an.method2(new Vehicle() {
@Override
public void run() {
System.out.println("트럭이 달립니다.");
}
});
}
}
☞ field > 익명 구현 객체 생성 필드
method1 > 로컬 변수 값에 익명 구현 객체 생성 후 익명 구현 객체 안의 메소드 호출 실행
method2 > 메소드 매개값으로 익명 구현 객체 생성, 매개 값 대입 시(메소드 호출 시) 익명 구현 객체 정의
6. 다음 Chatting클래스는 컴파일 에러가 발생합니다. 원인이 무엇입니까?
public class Chatting{
void startChat(String chatId){
String nickName = null;
nickName = chatId;
Chat chat = new Chat(){
@Override
public void start(){
while(true){
String inputData = "안녕하세요";
String message = "[" + nickName + "]" + inputData;
sendMessage(message);
}
}
};
chat.start();
}
class Chat{
void start() {}
void sendMessage(String message){}
}
}
☞ 익명 객체의 로컬 변수 사용 시 매개 변수와 로컬 변수는 final특성을 가지고 있음으로 데이터 값 변경이 불가능
String nickName = null;
nickName = chatId;
(X)
String nickName = chatId; (O)
선언과 동시에 데이터 값 초기화
'이것이 자바다' 카테고리의 다른 글
[이것이 자바다] BankApplication (클래스메소드+예외처리) (0) | 2021.05.08 |
---|---|
[이것이 자바다]CH10.예외처리(확인문제풀이) (0) | 2021.05.05 |
[이것이 자바다]CH08.인터페이스(확인문제풀이) (0) | 2021.05.02 |
[이것이 자바다]CH07.상속(확인문제풀이) (0) | 2021.04.05 |
[이것이 자바다]CH06.클래스(확인문제풀이)-③ (0) | 2021.03.29 |