반응형
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(); // '선택'이라는 이벤트 발생
}
}
배경을 변경합니다.
반응형
'🤼♂️ 5. Project > 5-2 연습문제 풀이' 카테고리의 다른 글
[혼자공부하는자바] 11장 기본 API 클래스 (0) | 2021.08.13 |
---|---|
[혼자공부하는자바] 10장 예외 처리 (0) | 2021.08.11 |
[혼자공부하는자바] 8장 인터페이스 (0) | 2021.08.11 |
[혼자공부하는자바] 7장 상속 (0) | 2021.08.06 |
[혼자공부하는자바] 6장 클래스 (0) | 2021.08.02 |
댓글