본문 바로가기
개념

[이것이 자바다] chapter.9 - 확인 문제

by cook_code 2023. 2. 6.
반응형

1. 중첩 멤버 클래스에 대한 설명으로 틀린 것은 무엇입니까?

  1. 인스턴스 멤버 클래스는 바깥 클래스의 객체가 있어야 사용될 수 있다. 
  2. 정적 멤버 클래스는 바깥 클래스의 객체가 없어도 사용될 수 있다. 
  3. 인스턴스 멤버 클래스 내부에는 바깥 클래스의 모든 필드와 메소드를 사용할 수 있다. 
  4. 정적 멤버 클래스 내부에는 바깥 클래스의 인스턴스 필드를 사용할 수 있다. 

2. 로컬 클래스에 대한 설명으로 틀린 것은 무엇입니까?

  1. 로컬 클래스는 메소드 내부에 선언된 클래스를 말한다. 
  2. 로컬 클래스는 바깥 클래스의 모든 필드와 메소드를 사용할 수 있다. 
  3. 로컬 클래스는 static 키워드를 이용해서 정적 클래스로 만들 수 있다. 
  4. final 특성을 가진 매개 변수나 로컬 변수만 로컬 클래스 내부에서 사용할 수 있다. 

3. 익명 객체에 대한 설명으로 틀린 것은 무엇입니까?

  1. 익명 객체는 클래스를 상속하거나 인터페이스를 구현해야만 생성될 수 있다. 
  2. 익명 객체는 필드, 매개 변수, 로컬 변수의 초기값으로 주로 사용된다.
  3. 익명 객체에는 생성자를 선언할 수 있다. 
  4. 부모 클래스나 인터페이스에 선언된 필드와 메소드 이외에 다른 필드와 메소드를 선언할 수 있지만, 익명 객체 내부에서만 사용이 가능하다. 

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 

  • 메소드 안에 생성된 변수인 지역변수는 초기화해주지 않고 사용하면 에러 발생 !
  • 멤버변수(클래스 변수와 인스턴스 변수), 배열의 초기화는 선택적이지만 지역변수의 초기화는 필수적이다.

- 멤버 변수 초기화 방법

더보기
  1. 명시적 초기화 : 변수 선언과 동시에 초기화 
  2. 생성자 
  3. 초기화 블럭 

- 인스턴스 초기화 블럭

인스턴스 변수 초기화 시 사용

생성자와 같이 인스턴스를 생성할 때마다 수행

모든 성자에서 공통으로 수행되어야 하는 코드를 넣는데 사용

- 클래스 초기화 블럭

클래스 변수의 (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) {}
	}
}
반응형