09_3 자바 내부클래스 정리

안녕하세요 Mr_ChooC(coding)AI 입니다~ 

내부클래스

1.     내부 클래스

2.     내부 클래스 종류

3.     내부 클래스의 접근성

4.     익명 클래스(anonymous)

 

앞으로 계속 class를 더 잘 활용할 수 있는 방법에 대해서 계속 알아가 보도록 하겠습니다. 전에 포스트에서는 인터페이스 대해서 다루었고 이번에는 내부클래스에 대해서 다루어 보도록 하겠습니다. 실습코드는 하기 github을 참조해 주세요!

Github: https://github.com/Chooyoungjun/javastudy/tree/main/10_innerclass

내부클래스

클래스의 다양한 사용 방법 중에 클래스 내부에 정의하는 방법도 있습니다. 이런 방법에 대해서 알아 보도록 하겠습니다.

1.     내부 클래스

클래스 내부에서 생성된 클래스를 내부클래스라고 합니다. 크게 다른 의미는 없고 클래스 안에 클래스를 말합니다. 그래서 지금부터는 클래스 안에 변수, 메서드, 클래스 이렇게 3가지를 정리 할 수 있다고 말 할 수 있습니다.

[구조]

class outer class{

            class InnerClass{

                      

            }

}

[내부 클래스(Inner class)의 사용 목적]

클래스간의 관계가 긴밀할 때 사용하여 코드를 간결하게 하기 위해 사용합니다.

내부클래스는 다양한 사용방법이 존재 합니다. 이러한 부분에 대해서 뒤에서 정리해 보도록 하겠습니다.

2.     내부 클래스 종류(3가지 종류)

(인스턴스 클래스, 스태틱 클래스, 지역 클래스, 익명 클래스)

4가지의 내부클래스의 종류에서 인스턴스 클래스 스태틱 클래스 지역 클래스는 비슷하게 사용되므로 묶어서 설명을 하도록 하겠습니다. 익명 클래스 같은 경우에는 실습 후에 따로 설명을 하도록 하겠습니다.

A.    인스턴스 클래스

[정의]

외부클래스에서 멤버 변수 위치에 선안된 클래스를 인스턴스 내부 클래스 입니다.

[특징]

클래스의 내부에서 인스턴스(객체)멤버처럼 다뤄지며, 인스턴스 멤버들과 상호작용 가능한 클래스 입니다.

[구조]

class outer class{

                      class InnerClass{ // 여기에 정의된 클래스를 인스턴스 내부 클래스

                                

                      }

}

B.     스태틱 클래스

[정의]

외부클래스에서 멤버 변수 위치에 선언된 클래스를 인스턴스 내부 클래스 입니다.

[특징]

클래스의 내부에서 인스턴스(객체)멤버처럼 다뤄지며, 인스턴스 멤버들과 상호작용 가능한 클래스 입니다.

[구조]

class outer class{

       static class InnerClass{ // static 내부 클래스로 정의

                 

       }

}

[정의]

외부클래스에서 멤버 static 변수 위치에 선언된 static 클래스를 인스턴스 내부 클래스 입니다

[특징]

클래스 내부에서 static 멤버처럼 다뤄지며 static 멤버들과 상호작용 가능

[실습]

간단하게 클래스를 만들어서 변수 자리에 static 내부 클래스와 instance 내부 클래스를 정의해서 어떻게 사용하는지 확인해 보도록 하겠습니다.



위의 실습에서 확인해 보시면 static 내부 클래스는 static 메서드 안에서 생성 가능 하지만 instance 내부 클래스는 생성이 불가능 한 것을 알 수 있다. 하지만 instance 메서드에서는 둘 다 생성이 가능 한 것을 알 수 있습니다. 이와 같이 static이 잘 적적 되는 것을 학인하고 차이점을 이해 하시면 되겠습니다.

C.    지역 클래스

[정의]

메서드 내부 지역변수 위치에 선언합니다.

[특징]

메서드나 초기화 블록의 내부에서 다뤄지며 선언된 영역 내부에서 사용 가능 합니다.

, 메모리 영역 중 스택 영역에 존재하기 때문에 메서드 호출부터 종료까지 메모리에 존재 하는 영역입니다.

class outer class{

      void A(){

                 class InnerClass{ // 메서드 안에 정의된 내부 클래스

                                      

                 }

      }

}

3.     내부 클래스의 접근성

위에서 배운 내부 클래스도 클래스 이기 때문에 저희가 접근 제어자를 통해서 접근 제어를 사용 할 수 있습니다. 어떻게 활용이 되는지 알아보도록 하겠습니다.

[구조]

class outer class{

         private class InnerClass{ // private 접근 제어

                    

         }

protected class InnerClass{ // protected 접근 제어

                    

         }

}

[실습2]

위의 실습에서는 간단하게 객체화를 시키지 않은 내부 클래스에 대해서 알아 보았습니다 이제는 내부 클래스를 어떻게 객체화를 하는지 확인해 보도록 하겠습니다.


위의 snapshot과 같이 outerclass innerclass들을 설정 하였습니다. 이거를 기반으로 main method에서 객체화 하여 불러서 사용하는 실습을 진행해 보겠습니다.


위의 snapshot과 같이 메인 클래스에서 inner class를 정의해 보았습니다. 가장 큰 특징은 정의를 하실 때 outerclass+.+new + innerclass 이런 구조로 정의를 해야 합니다. 위의 Snapshot을 참고 하셔서 이해 하시면 되겠습니다.

4.     익명 클래스(anonymous)

[정의]

익명 클래스 또는 무명 클래스라고도 하며, 이름이 없는 클래스를 의미합니다.

[구조]

기존 클래스를 익명 클래스로 변환 시켜 주는 의미를 가지고 있습니다.


위의 실습 및 구조를 확인 하시면 o에 정의한 것을 오버라이딩 해서 메서드를 바꾸었다고 해서 ok라고 새로 정의 한 곳에서 바뀌지 않는 것을 명심하시면 되겠습니다.

[실습]

지금까지는 일반클래스에서 익명클래스를 활용하는 방법에 대해서 알아 보았습니다. 그런데 지금 부터는 interface에서 어떻게 사용하는지 한번 확인해 보고 넘어가도록 하겠습니다


아래에서 OuterClass를 정의하면 하기의 클래스를 기반으로 익명 클래스 즉 이름이 없는 클래스를 1회성으로 재정의하여 사용할 수 있습니다. 어찌 보면 Method 오버리딩과 같이 class 오버라딩이라고 이해 하시면 편할 것 같습니다. 클래스 자체를 재정의 하는 방법이라고 설명 할 수도 있을 것 같습니다.

지금까지 클래스와 메서드에 대해서 정의하고 정리하였습니다. 이제는 어떠한 경우가 발생하더라도 클래스와 메서드를 활용하여 구현 할 수 있을 것이라고 믿습니다. 만약 잘 안되신다면.. 뒤에 정리해둔 블로그를 차근 차근 읽어 주시기를 부탁 드리겠습니다.

Comments