티스토리 뷰

  1. 내부 클래스

    • 클래스 내부에 선언된다는 특징 이외에는 일반 클래스와 동일하다.

    • 클래스 안에 다른 클래스를 선언하는 이유는 두 클래스가 서로 긴밀한 관계에 있기 때문이다.

    • 한 클래스를 다른 클래스의 내부 클래스로 선언하면 두 클래스의 맴버들 간에 서로 쉽게 접근할 수 있다는 장점이 있고, 외부에는 불필요한
      클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있다.

    • 장점

      1. 내부 클래스에서 외부 클래스의 맴버들을 쉽게 접근할 수 있다.
      2. 코드의 복잡성을 줄 일 수 있다.(캡슐화)
      class A{
        class B{
      
        }
      }
    • 내부 클래스의 종류는 변수의 선언위치에 따른 종류와 같다. 선언 위치에 따라 인스턴스 변수, 클래스변수, 지역변수로 구분된다.

      1. 인스턴스 클래스 : 외부 클래스의 맴버 변수 선언 위치에 선언되어, 인스턴스 맴버처럼 다루어 진다. 주로 외부 클래스의 인스턴스 맴버들과 관련된 작업에 사용
      2. 스태틱 클래스 : 외부 클래스의 맴버 변수 선언위치에 선언하며, static 맴버처럼 다루어진다. 주로 되부 클래스의 static맴버, static 메서드에서 사용될 목적으로 선언
      3. 지역 클래스 : 외부 클래스의 메서드나 초기화 블럭안에 선언, 선언된 영역 내부에서만 사용가능
      4. 익명 클래스 : 클래스의 선언과 객체의 생성을 동시하여 이름이 없다.
      class Outer{
        class InstanceInner{}
        static class StaticInner{}
      
        void myMethod(){
            class LocalInner{}
        }
      }
    • 내부 클래스도 static, final, public, abstract 등등 제어자를 사용가능하다.

    • 인스턴스 맴버로 내부 클래스가 정의되면 내부 클래스의 맴버 변수(static, local) 모두 접근가능하다. (심지어 private 변수도 접근가능)

    • 단, static으로 선언된 내부 클래스는 외부 클래스의 외부 클래스의 맴버 변수(local)에 접근이 불가능하다. 단, static 변수는 접근 가능

    • 메서드 내부에서 선언된 내부 클래스도 외부 클래스의 맴버 변수 모두 접근 가능하다. 단, 외부 클래스의 메서드 내에 있는 변수를 사용할 때는 final을 붙여주어야 한다.
      이는 외부 메서드 내부의 지역 변수가 사라질 때에도 내부 클래스가 참조하는 문제가 있기 때문이다.

      class InnerEx3{
        private int outer1 = 0;
        static int outer2 = 0;
        class InstanceInner{
            int iv = outer1;
            int iv2 = outer2;
        }
      
        static class StaticInner{
            int siv = outer1; // 에러
            static int scv = outer2;
        }
        void myMethod(){
            int lv = 0;
            final int LV = 0;
      
            class LocalInner{
                int lv = outer1;
                int lv2 = outer2;
                int lv3 = lv; // 에러 -> 단, jdk 1.8부터는 final을 자동으로 붙여줘서 에러는 아니다
                int lv4 = LV;
            }
        }
      }
    • this 사용시에는 가장 가까운 클래스에 붙는다.

    • 즉, inner 클래스에 사용시 inner 클래스의 this이고, 외부 클래스에 사용시 외부 클래스의 this이다.

    • 만약 내부 클래스에서 외부 클래스의 this를 사용하고 싶다면 OuterClass.this로 써주면 된다.

    • 이는 OuterClass.instanceName으로 inner 클래스에 접근할 수 있다는 것이다.

      class Outer{
        int value = 10;
        class Inner{
            int value = 20;
            void method(){
                int value = 30;``
                System.out.println(value); // 30
                System.out.println(this.value); // 20
                System.out.println(Outer.this.value); // 10
            }
        }
      }
      
      class InnerEx{
        public static void main(String args[]){
            Outer outer = new Outer();
            Outer.Inner inner = outer.new Inner();
            inner.method();
        }
      }
  2. 익명 클래스

    • 이름이 없고, 선언과 동시에 객체를 생성한다.

    • 즉, 일회성 클래스이다.

      new 조상클래스이름(){
            // 맴버선언
      }
      
      new 구현인터페이스이름() {
        // 맴버선언    
      }
    • 이름이 없기 때문에 생성자도 없으며, 조상 클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는
      동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다. 오직 단하나의 클래스를 상속 받거나 단 하나의 인터페이스만 구현할 수 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함