반응형
1. 중첩 멤버 클래스에 대한 설명으로 틀린 것은 무엇입니까?
- 인스턴스 멤버 클래스는 바깥 클래스의 객체가 있어야 사용될 수 있다.
- 정적 멤버 클래스는 바깥 클래스의 객체가 없어도 사용될 수 있다.
- 인스턴스 멤버 클래스 내부에는 바깥 클래스의 모든 필드와 메소드를 사용할 수 있다.
정적 멤버 클래스 내부에는 바깥 클래스의 인스턴스 필드를 사용할 수 있다.
2. 로컬 클래스에 대한 설명으로 틀린 것은 무엇입니까?
- 로컬 클래스는 메소드 내부에 선언된 클래스를 말한다.
- 로컬 클래스는 바깥 클래스의 모든 필드와 메소드를 사용할 수 있다.
로컬 클래스는 static 키워드를 이용해서 정적 클래스로 만들 수 있다.- final 특성을 가진 매개 변수나 로컬 변수만 로컬 클래스 내부에서 사용할 수 있다.
3. 익명 객체에 대한 설명으로 틀린 것은 무엇입니까?
- 익명 객체는 클래스를 상속하거나 인터페이스를 구현해야만 생성될 수 있다.
- 익명 객체는 필드, 매개 변수, 로컬 변수의 초기값으로 주로 사용된다.
익명 객체에는 생성자를 선언할 수 있다.- 부모 클래스나 인터페이스에 선언된 필드와 메소드 이외에 다른 필드와 메소드를 선언할 수 있지만, 익명 객체 내부에서만 사용이 가능하다.
4. 다음과 같이 Car 클래스 내부에 Tire와 Engine이 멤버 클래스로 선언되어 있습니다.
NextedClassExample에서 멤버 클래스의 객체를 생성하는 코드를 작성해보세요.
package chapter9;
public class Car {
//멤버 클래스 tire, engine 선언
class Tire {}
static class Engine{}
}
package chapter9;
public class NestedClassExample {
public static void main(String[] args) {
Car myCar = new Car();
Car.Tire tire = myCar.new Tire();
Car.Engine engine = new Car.Engine();
}
}
5. AnonymousExample클래스의 실행 결과를 보고 Vehicle 인터페이스의 익명 구현 객체를 이용해서 필드, 로컬 변수의 초기값과 메소드, 매개값을 대입해보세요.
package test;
public interface Vehicle {
public void run();
}
package test;
public class Anonymous {
Vehicle field = new Vehicle() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("자전거가 달립니다.");
}
};
//자꾸 다른 메소드가 실행되서 method이름을 1->0으로 바꿨습니다...
public void method0() {
Vehicle localVar = new Vehicle() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("승용차가 달립니다.");
}
};
localVar.run();
}
public void method2(Vehicle v) {
// TODO Auto-generated method stub
v.run();
}
public void method1() {
// TODO Auto-generated method stub
}
}
package test;
public class AnonymousExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Anonymous anony = new Anonymous();
anony.field.run();
anony.method0();
anony.method2(new Vehicle() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("트럭이 달립니다.");
}
});
}
}
6. 다음 Chatting 클래스는 컴파일 에러가 발생합니다. 원인이 무엇입니까?
package test;
public class Chatting {
void startChat(String chatId) {
String nickName = null;
nickName = chatId;
Chat chat = new Chat() {
@Override
public void start() {
while(true) {
String inputData = "안녕하세요";
//오류 발생 부분 : nickName
String message = "["+nickName+"]"+inputData;
sendMessage(message);
}
}
};
chat.start();
}
class Chat{
void start() {}
void sendMessage(String message) {}
}
}
- 오류 원인
Local variable nickName defined in an enclosing scope must be final or effectively final
- 메소드 안에 생성된 변수인 지역변수는 초기화해주지 않고 사용하면 에러 발생 !
- 멤버변수(클래스 변수와 인스턴스 변수), 배열의 초기화는 선택적이지만 지역변수의 초기화는 필수적이다.
- 멤버 변수 초기화 방법
더보기
- 명시적 초기화 : 변수 선언과 동시에 초기화
- 생성자
- 초기화 블럭
- 인스턴스 초기화 블럭
인스턴스 변수 초기화 시 사용
생성자와 같이 인스턴스를 생성할 때마다 수행
모든 성자에서 공통으로 수행되어야 하는 코드를 넣는데 사용
- 클래스 초기화 블럭
클래스 변수의 (static 변수) 초기화 시 사용
클래스가 메모리에 처음 할당될 때 한 번만 수행
- 답안
package test;
public class Chatting {
void startChat(String chatId) {
//메소드 지역 변수의 명시적 초기화
String 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) {}
}
}
반응형
'개념' 카테고리의 다른 글
[이것이 자바다] chapter.11 확인 문제 (0) | 2023.02.22 |
---|---|
[이것이 자바다] chapter.10 - 확인 문제 (0) | 2023.02.09 |
[이것이 자바다] chapter.8 - 확인문제 (0) | 2023.02.01 |
[이것이 자바다] chapter.7 - 확인문제 (0) | 2023.01.30 |
[이것이 자바다] chapter.6 확인 문제 - 2 (0) | 2023.01.30 |