[JAVA] InnerClass / OuterClass , 중첩클래스 - Engineer of NiagaraFramework

Tridium, NiagaraFramework, SCADA, HMI, PLC, Automation, SmartFAM etc.. About controls.
나이아가라 프레임워크 QnA : neverlikekami@gmail.com

2021년 7월 9일 금요일

[JAVA] InnerClass / OuterClass , 중첩클래스

개요
중첩 클래스 클래스 내부에 클래스를 만드는 것을 의미 프로그래밍을 할 때 여러 군데서 사용하는 클래스가 아니라면 파일을 새로 만들거나 코드의 아래부분으로 내려서 만들지 않고 바로 만들어서 바로 쓸수 있도록 하는 개념

경우에 따라서는 객체를 생성할 수 있는 부분이 클래스를 설계한 부분으로 한정 되는 경우도 있다. 클래스 내부에 만든 클래스를 Inner Class라고 부르며 Inner클래스를 감싸고 있는 클래스를 Outer Class라고 부른다.



    일반 중첩 클래스


    ⊙ 클래스 내부에 클래스를 만들어서 사용하는 경우

    ⊙ Inner 클래스의 객체를 만들기 위해서는 반드시 Outer클래스의 객체를 생성하고 이를 통해 Inner클래스를 만들어야함.

    ⊙ Inner클래스는 Outer클래스의 맴버에 접근할수있지만 Outer클래스는 Inner클래스의 멤버에 접근할수없다. Inner클래스의 멤버는 Outer클래스의 객체가 생성되어 있다는 가정하에 사용하므로 접근이 가능하지만 Outer클래스는 Inner클래스의 객체의 생성과 관계가 없으므로 Inner클래스에 대한 접근이 자유롭지 못하다.


    static 중첩 클래스


    ⊙ 일반 중첩클래스에서 Inner클래스가 static으로 정의된 경우

    ⊙ Inner 클래스가 static으로 정의 되어 있어 Outer클래스의 객체 생성 없이 바로 객체 생성이 가능

    ⊙ Inner 클래스에서는 Outer클래스에 정의된 멤버중에 static 멤버만 접근이 가능. Outer클래스의 객체생성없이 바로 Inner클래스의 객체를 생성하므로 Outer클래스의 객체가 생성되지 않았다는 가정하여 개발을 해야한다.

     

    메서드 내의 중첩 클래스


    ⊙ 클래스를 메서드 내부에 만든 경우를 의미

    ⊙ 메서드 내부에 만든 중첩 클래스는 다른 곳에서 참조 변수 조차 선언 할수 없다.

    ⊙ Inner 클래스에서는 클래스 내부에 선언한 변수만 사용할 수 있으며 클래스를 만든 메서드 내부에 있는 지역 변수중 final 변수만 접근이 가능. 그 외의 모든 변수는 접근이 불가능


    익명 중첩 클래스


     클래스로부터 객체 생성을 할 때 클래스 내부 코드를 바로 작성하는 것을 의미

    ⊙ 원본 클래스가 가지고 있는 메서드를 Overriding 해야 할 경우 상속 받은 클래스를 만들지 않고 바로 Overriding을 할수있다.

    ⊙ 추상 클래스라는 것을 이용할때 자주 사용하는 기법



    익명클래스(Anonymous classes)
    이름이 없는 일회용 클래스(무명클래스). 단 하나의 객체만을 생성할수있다. 
      


    클래스명 인스턴스명 = new 클래스명( ) {
     ...//원하는 메소드를 오버라이드해서 재정의한다. 
    };



     [코드] Inner클래스 예제

     Outer.java

     

    1. public class Outer {
    2.     private int height;
    3.     private int width;
    4.     public Outer(int h, int w){
    5.         this.height = h;
    6.         this.width = w;    
    7.     }  
    8.     public Inner getInner(){
    9.         return new Inner();
    10.     }  
    11.     class Inner{
    12.         private float sum = 0;
    13.         public float total(){          
    14.             return width*height/2;
    15.         }
    16.     }
    17. }
    18.  

     VarTest01_innerClass.java


    1. //내부클래스
    2. public class VarTest01_innerClass {
    3.     public static void main(String[] args) {
    4.         Outer outer = new Outer(100,200);
    5.         Outer.Inner inner = outer.getInner();
    6.         //내부 클래스도 외부 클래스의 멤버로 간주되며, 동일한 접근성을 갖는다.
    7.         System.out.println("inner 값: "+inner.total());//Outer 안에 Inner 클래스 불러오기
    8.     }  
    9. }
    10.  

     inner 값: 10000.0

     

     

     [코드] 익명클래스 예제

     Outer2.java

     

    1.  
    2. public class Outer2 {
    3.     public Outer2(){
    4.         System.out.println("외부 클래스 생성");
    5.     }
    6.     public Object getAnnoInnerObj()//Object 형을 반환하겠다.
    7.         return new Object(){ //익명클래스, 이름을 주지않는 class; 무명클래스
    8.    
    9.             public String toString(){ //toString()메소드 재정의
    10.                 return "이것은 AnonInner 클래스 객체";
    11.             }          
    12.         };// 중괄호 안에것은 구현한다.
    13.     }//getAnnoInnerObj()------------ 결과를 리턴시키기위한 목적.
    14. }
    15.  

     VarTest02_AnonymousClass.java

     

    1. //내부익명 클랙스
    2. public class VarTest02_AnonymousClass {
    3.     public static void main(String[] args) {
    4.         Outer2 outer = new Outer2();
    5.         Object obj = new Object()//일반 Object 인스턴스생성
    6.         Object anonObj = outer.getAnnoInnerObj();
    7.         //toString()메서드가 재정의된 Object객체 얻기
    8.         System.out.println(obj.toString())//toString()호출
    9.         System.out.println(anonObj.toString())//toString()호출
    10.     }
    11. }



    참조

    내용 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=javaking75&logNo=140188756890

    댓글 없음:

    댓글 쓰기

    Post list