본문 바로가기
🤼‍♂️ 5. Project/5-2 연습문제 풀이

[혼자공부하는자바] 9장 중첩 클래스와 중첩 인터페이스

by 달님🌙 2021. 8. 11.
반응형

1절 중첩 클래스와 중첩 인터페이스 소개

 

1. 중첩 멤버 클래스 OX 문제

① O

② O

③ O

④ X -> 정적 멤버 클래스 내부에는 바깥 클래스의 인스턴스 필드는 사용할 수 없고 정적 필드만 사용이 가능

 

2. 로컬 클래스 OX 문제

① O

② O

③ X -> 로컬 클래스는 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없어 static이나 public 등을 붙일 수 없음

④ O

 

3. 인스턴스 멤버 클래스 vs 정적 멤버 클래스 (객체 생성 방법에서의 차이점)

class Car { 
	class Tire { } // 인스턴스 멤버 클래스
	static class Engine {} // 정적 멤버 클래스
}

public class NestedCarExample {
	public static void main(String[] args) {
		
		// 인스턴스 멤버 클래스 객체 생성 시 바깥 클래스의 객체 생성 후 사용 가능
		Car myCar = new Car(); // Car 객체 생성
		Car.Tire tire = myCar.new Tire(); // Tire 멤버 클래스 객체 생성
		
		// 정적 멤버 클래스 객체 생성 시 바깥 클래스의 객체가 없어도 사용 가능
		Car.Engine engine = new Car.Engine(); // Engine 멤버 클래스 객체 생성
		// myCar.이 안붙는 이유 : 정적 멤버는 바깥 객체가 없어도 그냥 바깥 클래스만으로 접근이 가능해서
	}
}

 

 

4. Chatting 클래스에서 컴파일 발생하는 원인

public class chatting {
	void startChat(String chatId) { // 메소드 선언
		// String nickName = null; // 로컬 변수는 final로 선언 되므로  
		// nickName = chatId; // 이렇게 쓰면 값을 변경할 때 에러 발생
		String nickName = chatId; // 이렇게 한 줄로 바로 선언해주어야함 
	
		class Chat { // 중첩 클래스
			public void start() {
				while (true) { 
					String inputData = "안녕하세요"; 
					String message = "[" + nickName +"]" + inputData;
					sendMessage(message);
				}
			}
			void sendMessage(String message) {}
		}
		Chat chat = new Chat();
		chat.start();
	}
}

 

 

5. CheckBox 클래스 

 

import reviewProblem.ch09.CheckBox.OnSelectListener;

class CheckBox {
	OnSelectListener listener; // 인터페이스 타입 필드 선언
	
	void setOnSelectListener(OnSelectListener listener) {
		this.listener = listener;
	}
	
	void select() {
		listener.onSelect();
	}

	static interface OnSelectListener {
		void onSelect(); // 추상 메소드 
	}
}

// 구현 클래스
class BackgroundChangeListener implements OnSelectListener {
	@Override
	public void onSelect() { // public 꼭 써주어야함
		System.out.println("배경을 변경합니다.");
	}
}

// 실행 클래스
public class CheckBoxExample {
	public static void main(String[] args) {
		CheckBox checkBox = new CheckBox();
		checkBox.setOnSelectListener(new BackgroundChangeListener());
		checkBox.select();
	}
}

 

 

2절 익명 객체

 

1.  

class Worker {
	public void start() {
		System.out.println("쉬고 있습니다.");
	}
}

 

public class Anonymous {
	// 필드 사용
	Worker field = new Worker() {
		@Override
		public void start() {
			System.out.println("디자인을 합니다.");
		}
	};
	
	// 로컬 변수 사용
	void method1() {
		Worker localVar = new Worker() {
			@Override
			public void start() {
				System.out.println("개발을 합니다.");
			}
		};
		localVar.start();
	}
	
	// 매개 변수 사용
	void method2(Worker worker) {
		worker.start();
	}
}

 

public class AnonymousExample {
	public static void main(String[] args) {
		Anonymous anony = new Anonymous();

		// 익명 객체 필드 사용
		anony.field.start();
		
		// 익명 객체 로컬 변수 사용
		anony.method1();
		
		// 익명 객체 매개값 사용
		anony.method2(
			new Worker() {
				@Override
				public void start() {
					System.out.println("테스틀를 합니다.");
				}
			}
		);
	}
}

 

디자인을 합니다.
개발을 합니다.
테스틀를 합니다.

 

 

2. 

interface Vehicle {
	public void run();
}

public class Anonymous {
	
	// 1. 필드 사용
	Vehicle field = new Vehicle() {
		@Override
		public void run() {
			System.out.println("자전거가 달립니다.");
		}
	};
	
	// 2. 로컬 변수 사용
	void method1() {
		Vehicle localVar = new Vehicle() {
			@Override
			public void run() {
				System.out.println("승용차가 달립니다.");
			}
		};
		localVar.run();
	}
	
	// 3. 매개값 사용
	void method2(Vehicle vehicle) {
		vehicle.run();
	}
}

 

public class AnonymousExample {
	public static void main(String[] args) {
		Anonymous anony = new Anonymous();
		
		// 익명 객체 필드 사용
		anony.field.run();
		
		// 익명 객체 로컬 변수 사용
		anony.method1();
		
		// 익명 객체 매개값 사용
		anony.method2(
			new Vehicle() {
				@Override
				public void run() {
					System.out.println("트럭이 달립니다.");
				}
			}
		);
		
	}
}

 

자전거가 달립니다.
승용차가 달립니다.
트럭이 달립니다.

 

3.

public class CheckBox {
	
	// 1. 중첩 인터페이스 선언
	static interface OnSelectListener {
		void onSelect();
	}
	
	// 2. 인터페이스 타입의 필드 선언
	OnSelectListener listener;
	
	// 3. setter 메소드로 외부에서 구현 객체 받아 필드에 대입
	void setOnSelectListener(OnSelectListener listener) {
		this.listener = listener;
	}
	
	// 선택 이벤트 발생 메소드
	void select() {
		listener.onSelect(); // 인터페이스를 통해 구현 객체의 메소드 호출
	}
}

 

public class CheckBoxExample {
	public static void main(String[] args) {
		// CheckBox 객체 생성
		CheckBox checkBox = new CheckBox();
		
		// 생성된 구현 객체(new 뒤에 써있는 것)를 setter 메소드로 받아서 필드에 대입
		checkBox.setOnSelectListener(
			new CheckBox.OnSelectListener() { // 인터페이스 타입 익명 객체 생성
				@Override
				public void onSelect() { // 실체 메소드로 재정의
					System.out.println("배경을 변경합니다.");
				}
			}
		);
		
		checkBox.select(); // '선택'이라는 이벤트 발생
	}
}

 

배경을 변경합니다.
반응형

댓글