1. 핵심 정리
내부 클래스란?
두 클래스 간에 서로 쉽게 접근하여 사용할 수 있도록 만든 것을 말하며 중첩클래스라고도 함
보통 바깥쪽의 클래스를 외부 클래스, 안쪽의 클래스를 내부 클래스라고 함
내부 클래스 구분
| 메서드 | 설명 |
| 인스턴스 클래스 | 외부 클래스의 멤버 변수와 같은 위치에 선언 주로 외부 클래스의 멤버 변수와 관련된 작업에 사용될 목적으로 선언 |
| 정적 클래스 | 외부 클래스의 클래스 변수와 같이 static 키워드가 부여 |
| 지역 클래스 | 외부 클래스의 메서드 내부에서 선언하여 사용 메서드 영역에서 선언되기 때문에 메서드 내부에서만 사용 가능 |
내부 클래스에도 접근 제한자를 부여하여, 클래스의 접근에 대한 기능을 제한 가능
익명 클래스
다른 내부 클래스와는 달리 이름이 없는 클래스를 의미
익명 클래스는 클래스의 선언과 객체의 생성을 동시에 하므로 단 한번만 사용할 수 있으며
오직 하나의 객체만을 생성할 수 있는 일회용 클래스
따라서 익명 클래스는 보통 인터페이스를 상속하지 않고, 일회성으로 기능을 구현하여 사용할 때 주로 사용
2. 응용 문제
Q1. 다음 중 중첩 클래스에 대한 설명으로 틀린 것은 무엇일까요?
- 인스턴스 클래스는 외부 클래스 안에 선언됩니다.
- 인스턴스 클래스의 위치는 인스턴스 변수와 같습니다.
- 정적 내부 클래스는 인스턴스 필드를 사용할 수 있습니다.
- 정적 내부 클래스는 외부 클래스 없이 객체를 선언할 수 있습니다.
A1. 3
Q2. 다음 중 로컬 클래스에 대한 설명으로 틀린 것은 무엇일까요?
- 로컬 클래스는 메서드 내부에 선언된 클래스를 말합니다.
- 로컬 클래스는 외부 클래스의 모든 필드와 메서드를 사용할 수 있습니다.
- 로컬 클래스는 static 키워드를 이용해서 정적 클래스로 만들 수 없습니다.
- 로컬 클래스는 메서드에서 선언된 변수의 값을 변경하여 사용할 수 있습니다.
A2. 2
Q3. 다음 빈칸( )에 알맞은 코드를 작성해 보세요.
[MyCar.java]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package section13;
public class MyCar {
private int price;
private String myName;
public MyCar(String myName,int price) {
this.myName=myName;
this.price=price;
}
public String getInfo() {
String str="차량: "+myName+", 가격: "+price;
return str;
}
public class Promotion {
public int discount() {
int discount=0;
discount=price/100;
return discount;
}
}
}
|
cs |
[MyCarMain.java]
|
1
2
3
4
5
6
7
8
9
|
package section13;
public class MycarMain {
public static void main(String[] args) {
System.out.println(mycar.getInfo()+", 할인금액: "+promotion.discount());
}
}
|
cs |
A3. 외부클래스를 받아오기 위해 생성자를 생성해주고, 익명 내부 클래스를 또다른 생성자를 가져와서
모든 메서드를 활성화 시켜준다.
|
1
2
3
4
5
6
7
8
9
10
|
package section13;
public class MycarMain {
public static void main(String[] args) {
MyCar mycar=new MyCar("Car",1000);
MyCar.Promotion promotion=mycar.new Promotion();
System.out.println(mycar.getInfo()+", 할인금액: "+promotion.discount());
}
}
|
cs |
Q4. 다음 코드를 실행하면 오류가 발생합니다. 오류의 원인을 찾아 수정해 보세요.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package section13;
public class InnerExam {
public int plus(int value) {
class Cal {
public int add() {
return value++;
}
}
Cal cal=new Cal();
return cal.add();
}
public static void main(String[] args) {
InnerExam ie=new InnerExam();
System.out.println(ie.plus(10));
}
}
|
cs |
A4. 7줄에 value를 직접 수정하려고 시도하므로 컴파일 오류가 발생한다.
++는 후위 증가 연산자로, 현재 값을 반환한 후에 값을 1 증가시킵니다.
value는 final 변수처럼 동작하므로 값을 변경할 수 없기 때문에,
value의 값을 변경하기 보단 value에 1을 더한 값을 반환하는 방식으로 변경해야 한다.
return value+1;
2024.07.24
'JAVA > JAVA복습(멘토씨리즈 자바)' 카테고리의 다른 글
| [JAVA복습] 15. 기본 API 클래스 (0) | 2024.07.27 |
|---|---|
| [JAVA복습] 14. 예외처리 (0) | 2024.07.25 |
| [JAVA복습] 12. 추상 클래스와 인터페이스 (0) | 2024.07.24 |
| [JAVA복습] 11. 다형성과 타입 변환 (0) | 2024.07.22 |
| [JAVA복습] 10. 상속 (0) | 2024.07.21 |