본문 바로가기
[ JAVA ]/JAVA

[ Java ] 내부 클래스(Inner Class)

by 환이s 2023. 1. 3.
CHAPTER 17. Inner class 알아가기

 

1 )  Inner class의 정의

 

"클래스 안에 선언된 클래스"

 

특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언합니다. 이러한 내부 클래스는 외부 클래스(outer class)에 대해 두 개의 클래스가 서로 긴밀한 관계를 맺고 있을 때 선언할 수 있습니다.

 

 

2 ) Inner class 장단점

 

  • 장점

- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있습니다.

-코드의 복잡성을 줄일 수 있습니다.

  • 단점

-코드의 재사용이 어렵습니다.

-내부(중첩) 클래스입니다.(inner class, nested class) 

 

3 ) 선언하는 위치에 따른 4가지 형태

 

내부 클래스는 필드와 마찬가지로 선언된 위치에 따라 다음과 같이 구분됩니다.

 

- 인스턴스 클래스(instance class)

- 정적 클래스(static class)

- 지역 클래스(local class)

- 익명 클래스(anonymous class)

 

그럼 각 클래스를 코드로 알아봅시다.

 

 

1. 중접클래스(인스턴스 클래스)

/*
* 1) 클래스 안의 멤버(필드)변수를 선언하는 위치에 선언되는경우,
* 이를 중첩클래스 또는 인스턴스 클래스라고한다.
* 먼저 외부클래스격인 InnerExam1을 먼저 생성후
* InnerExam1.Cal cal = t.new Cal(); 과 같은 방법으로
* 내부클래스객체를 생성한다.
*/
public class InnerExam1 {
class Cal{
int value = 0;
public void plus() {
value++;
}
}//end class Cal
public static void main(String[] args) {
InnerExam1 t = new InnerExam1();//외부객체 생성
InnerExam1.Cal cal = t.new Cal();//내부객체 생성
cal.plus();
System.out.println(cal.value);
}
}

 

2. 정적중첩클래스(static 클래스)

 

/*
* 2) 내부 클래스가 static으로 정의된 경우, 이를 정적 중첩클래스
* 또는 static클래스라고 한다.
* 멤버(필드) 선언할때 static 선언한 것과 같다.
* 이 경우에는 외부클래스를 생성할 필요없이
외부클래스이름.내부클래스이름으로
* 접근해 사용할 수 있다.
*/
public class InnerExam2 {
static class Cal{//내부 static class
int value = 0;
public void plus() {
value++;
}
}//end class Cal
public static void main(String[] args) {
//내부 static class에 접근할때는
//외부클래스이름.내부클래스이름 참조변수 = new
외부클래스이름.내부생성자이름
InnerExam2.Cal cal = new InnerExam2.Cal();
cal.plus();
System.out.println(cal.value);
}
}

 

3. 지역중첩클래스(지역 클래스)

 

/*
* 3)메소드 안에 클래스를 선언한 경우, 이를 지역중첩클래스
* 또는 지역클래스라고 한다.
* 메소드 안에서 해당 클래스를 사용할 수 있다.
*/
public class InnerExam3 {
public void exec() {//메소드
class Cal{//메소드 안에서 class 선언
int value = 0;
public void plus() {
value++;
}
}//end class Cal
Cal cal = new Cal();
cal.plus();
System.out.println(cal.value);
}//end method exec()
public static void main(String[] args) {
InnerExam3 t = new InnerExam3();
t.exec();
}
}

 

4. 익명클래스(무명내부클래스)

 

/*
* 4)익명클래스는 생성자() 다음에 클래스의 이름없이 블럭을
* 만들어{ } 코딩하고 클래스 블럭{};의 끝에 세미콜론(;)으로
* 처리하는 특징이 있다.
*/
abstract class Action{ //추상클래스
public abstract void exec();
}
public class ActionExam extends Action{ //자식클래스
@Override
public void exec() {
System.out.println("I am Child");
}
public static void main(String[] args) {
Action a = new ActionExam() {//익명내부클래스
String name = "kim";
@Override
public void exec() {
System.out.println("나는 " + name + " 이다.");
}
};//익명클래스의 블럭끝에는 세미콜론(;)으로 마무리한다.
a.exec();
}
}

※ 익명 클래스는 이벤트 처리 등 1회성으로 사용하는 간단한 코드에 자주 사용합니다.

 

또한 익명클래스에서는 인터페이스 구현까지 가능합니다. 인터페이스는 new 해서 객체 생성을 못하지만 익명 클래스 처리하면 자동적으로 인터페이스를 익명 클래스가 상속받아 Override 처리할 수 있습니다.

 

interface RemoteControl{//인터페이스는 인스턴스할 수 없다.
    void turnOn();
    void turnOff();

}

public class AnonymousClassTest {

    public static void main(String[] args){
        //interface는 new 해서 객체 생성을 못하지만
        //아래처럼 무명클래스 처리하면 자동적으로 인터페이스를 무명 클래스가 상속 받아
        // Override 처리 할 수 있다.
        RemoteControl ac = new RemoteControl() {//익명클래스
            @Override
            public void turnOn() {
                System.out.println("TV turnOn()");
            }

            @Override
            public void turnOff() {
                System.out.println("TV turnOFF()");

            }
        };//무명내부클래스
        ac.turnOn();
        ac.turnOff();
    }
}


마치며

 

오늘은 내부 클래스에 대해 포스팅을 했습니다.  클래스의 종류 마다 차이점을 보여드리기 위해 코드를 한눈에 보기 쉽게 출력했습니다..! 

확실히 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근은 할 수 있고 코드의 복잡성을 줄일 순 있지만, 실무에선 클래스가 중첩되는 걸 좋아하진 않습니다..! 하지만 꼭 알아두고 가야 하는 파트입니다.

 

728x90

'[ JAVA ] > JAVA' 카테고리의 다른 글

[ Java ] Thread  (0) 2023.01.05
[ Java ] 예외처리(Exception Handling)  (0) 2023.01.04
[ Java ] Scanner  (0) 2022.12.29
[ Java ] Collection Framework  (0) 2022.12.28
[ Java ] Generic  (0) 2022.12.26