JAVA 기초 (39) 내부 클래스

코린이서현이·2023년 8월 16일
0

Java

목록 보기
40/46

😼들어가면서😼

내부 클래스 - 클래스의 내부에 선언한 클래스
1. 인스턴스 내부 클래스 - 외부 클래스 내부에서만 생성해서 사용하는 클래스
2. 정적 내부 클래스 - 외부 클래스 생성과 무관하게 사용할 수 있어여하고 정적 변수도 
이용해야할때 static
3. 지역 내부 클래스 - 메서드 내부에 클래스를 정의해서 사용하는 클래스
4. 익명 내부 클래스 - 이름이 없는 클래스 
메서드로 반환을 할수도 있고, 인스터스 변수 형태로 반환을 하기도 한다.

📕 내부 클레스

클래스 내부에 선언한 클래스

📖 인스턴스 내부 클래스

인스턴스 변수를 선언할 때와 같은 위치에 선언하고 static이 붙지 않는다.

✅ 특징

  • 인스턴스 변수처럼 외부 클래스의 객체가 먼저 생성되어야지 인스턴스 내부 클래스에 접근이나 생성이 가능하다.
  • 인스턴스 클래스 내부에는 static 변수와 static 메소드는 선언할 수 없다.
  • private으로 선언된것이 아니라면 다른 클래스에서 인스턴스 내부 클래스를 선언 할 수 있다. (외부참조)
//외부클래스.내부클래스 참조변수 = 외부클래스참조변수.new 내부 클래스 생성자();
OuterClass_ins.InnerClass inner = outer.new InnerClass();
  • 외부 클래스의 멤버를 호출하는 방법: 외부클래스명.this

class OuterClass_ins {
  void outerMethod() {
    System.out.println("외부 클래스 메소드");
  }

  class InnerClass {
    public void innerMethod() {
      System.out.println("인스턴스 내부 클래스의 메소드");
      //외부 클래스 메소드
      OuterClass_ins.this.outerMethod();
    }
  }
}

📒 외부 클래스에서 인스턴스 내부 클래스를 사용하는 방법

  • static이 아닌 클래스는 인스턴스를 생성하고 나서 사용할 수 있다.
class OuterClass_ins {

  InnerClass inner;

  public OuterClass_ins() {
    inner = new InnerClass();
  }

  void outerMethod() {
    System.out.println("외부 클래스 메소드");
    inner.innerMethod();
  }

  class InnerClass {

    public void innerMethod() {
      System.out.println("인스턴스 내부 클래스의 메소드");
    }
  }
}

public class InstanceInnerClass {
  public static void main(String[] args) {
    OuterClass_ins outer = new OuterClass_ins();

    outer.outerMethod();

  }
}

⚒️ 활용방법

  1. 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용된다.

⚠️ 주의사항

인스턴스 내부 클래스를 쓰면 캡슐화와 은닉성, 논리적 그룹화, 인스턴스 멤버 접근이 쉽다는 장점이 있지만 중첩된 구조로 코드 복잡성이 증가할 수 있고, 외부 참조를 사용할 경우 시간&공간 성능이 낮아지며 메모리 누수가 발생할 수 있다는 취약점이 있기 때문에 지양하는 것이 좋을 것 같다.

📖 정적 내부 클래스

static 키워드가 붙은 내부 클래스, 내부 클래스가 외부 클래스 생성과 무관하게 사용할 수 있어야하고 정적 변수도 사용할 수 있어야할 때 사용한다.

  • 인스턴스 멤버와 static 멤버 모두 선언할 수 있다.
  • 일반적인 static 메서드와 동일하게 외부 클래스의 인스턴스 멤버에는 접근 할 수 없고, static 멤버에는 접근 할 수 있다.
  • 외부 클래스의 인스턴스를 생성하지 않고도 생성할 수 있다.

🔍 정적 내부 클래스는 기존의 static과는 다르다

보통 static은 메모리에 하나만 올라가지만, 정적 내부 클래스는 그렇지 않다.
내부 static 클래스는 일반 클래스처럼 초기화를 할때마다 다른 객체가 만들어진다.

🔍 내부 클래스는 static 클래스로 선언하자.

내부 클래스에서 외부의 인스턴스멤버를 사용할 일이 없다면 static 클래스로 선언하는 것이 좋다. tatic이 아닌 내부 인스턴스 클래스는 외부와 연결이 되어 있어 '외부 참조'를 갖게되어 메모리를 더 먹고, 느리며, 또한 GC 대상에서 제외되는 여러 문제점을 일으키기 때문이다.

📖 지역 내부 클래스 = 로컬 클래스

지역 변수와 같은 성질을 지닌다.

  • 지역 변수처럼 해당 메서드 내부에서만 한정적으로 사용된다.
  • 접근 제한자와 static을 붙일 수 없다.
  • 지역 내부 클래스에서 사용하는 메소드의 지역변수와 매개변수는 상수로 자동 컴파일이 된다.
    따라서 지역 내부 클래스에서 메소드의 지역변수와 매개변수 값을 변경할 수 없다.

class OuterClass {
  int num = 1;

  public void outerMethod() {
    int Mnum = 2;
    class LocalInnerClass {
      int lnum = 3;

      void innerMethod() {
        num +=3;
        //상수로 취급되어 변경할 수 없다.
        //Mnum += 3;
        lnum += 3;
      }
    }

    LocalInnerClass inner = new LocalInnerClass();
    inner.innerMethod();
  }
}
  • 그러나 지역 내부 클래스라고 하더라도 외부 참조가 있을 경우에는 메서드 호출이 끝나도 메모리가 사라지지 않는다.

📖 익명 내부 클래스

클래스 이름을 사용하지 않는 클래스
딱 한번만 객체를 생성하고 싶을 때 사용한다. (일회성이다.)
➡️ 인스턴스 변수에 익명 내부 클래스를 대입한다.
➡️ 메서드에서 익명 내부 클래스를 반환한다.

  • 클래스의 선언과 동시에 객체를 생성한다.
  • 생성자가 존재하지 않는다.
  • 익명 클래스는 뒤에 세미 콜론을 붙여야한다.

😙마무리 하면서😙

공부를 미루지 말자!
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글