본문 바로가기
JAVA/JAVA복습(멘토씨리즈 자바)

[JAVA복습] 13. 내부 클래스

by ssunooo 2024. 7. 24.

 

 

1.  핵심 정리

 

내부 클래스란?

두 클래스 간에 서로 쉽게 접근하여 사용할 수 있도록 만든 것을 말하며 중첩클래스라고도 함

보통 바깥쪽의 클래스를 외부 클래스, 안쪽의 클래스를 내부 클래스라고 함

 

내부 클래스 구분

메서드 설명
인스턴스 클래스 외부 클래스의 멤버 변수와 같은 위치에 선언
주로 외부 클래스의 멤버 변수와 관련된 작업에 사용될 목적으로 선언
정적 클래스 외부 클래스의 클래스 변수와 같이 static 키워드가 부여
지역 클래스 외부 클래스의 메서드 내부에서 선언하여 사용
메서드 영역에서 선언되기 때문에 메서드 내부에서만 사용 가능

 

내부 클래스에도 접근 제한자를 부여하여, 클래스의 접근에 대한 기능을 제한 가능

 

익명 클래스

다른 내부 클래스와는 달리 이름이 없는 클래스를 의미

익명 클래스는 클래스의 선언과 객체의 생성을 동시에 하므로 단 한번만 사용할 수 있으며

오직 하나의 객체만을 생성할 수 있는 일회용 클래스

따라서 익명 클래스는 보통 인터페이스를 상속하지 않고, 일회성으로 기능을 구현하여 사용할 때 주로 사용

 


 

2. 응용 문제

 

Q1. 다음 중 중첩 클래스에 대한 설명으로 틀린 것은 무엇일까요?

  1. 인스턴스 클래스는 외부 클래스 안에 선언됩니다.
  2. 인스턴스 클래스의 위치는 인스턴스 변수와 같습니다.
  3. 정적 내부 클래스는 인스턴스 필드를 사용할 수 있습니다.
  4. 정적 내부 클래스는 외부 클래스 없이 객체를 선언할 수 있습니다.

A1. 3

 


 

Q2. 다음 중 로컬 클래스에 대한 설명으로 틀린 것은 무엇일까요?

  1. 로컬 클래스는 메서드 내부에 선언된 클래스를 말합니다.
  2. 로컬 클래스는 외부 클래스의 모든 필드와 메서드를 사용할 수 있습니다.
  3. 로컬 클래스는 static 키워드를 이용해서 정적 클래스로 만들 수 없습니다.
  4. 로컬 클래스는 메서드에서 선언된 변수의 값을 변경하여 사용할 수 있습니다.

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