Language/Java

내부 클래스

JUNGKEUNG 2021. 9. 25. 21:05
반응형

내부클래스란?


클래스내에서 선언된 클래스를 말한다

 

 

 

내부클래스의 장점


  • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다
  • 코드의 복잡성을 줄일 수 있다(캡슐화)

 

 

 

내부 클래스 사용 목적


내부 클래스를 사용하게 되면 비슷한 형태의 클래스들을 묶을 수 있어서 코드의 캡슐화를 증가시킬 수 있다. 또한, 내부클래스에서 외부 클래스의 멤버에 손쉽게 접근 할 수 있게 된다.

 

 

 

내부클래스의 종류와 특징


 

 

 

내부 클래스의 선언

class Outer{
	class InstanceIneer{} //인스턴스클래스
	static class StaticInner{} 스태틱 클래스
	
 void method1(){
		class LocalInner{} //지역클래스
	}
}

 

 

 

instance 멤버 내부 클래스


  • instance 멤버 내부 클래스는 클래스의 멤버와 동일한 위치에서 선언되는 내부 클래스
  • 멤버 변수나 메서드와 동일한 위치에서 선언되었기 때문에 다른 외부 클래스에서도 사용 가능
  • 내부 클래스의 객체 생성을 위해 외부 클래스 객체 생성이 필요
class Outside {        // 외부 클래스 (=Top Level Class)
	public class Inside {        // 내부 클래스 (일반 멤버 변수와 동일한 위치)  }
}

public class InnerClass {
	public static void main(String args[]) {
	Outside outer = new Outside();    // 내부 클래스의 객체 생성을 위해 외부 클래스 객체 생성
	Outside.Inside inner = outer.new Inside();
}

 

 

 

static 멤버 내부 클래스


  • 내부 클래스를 정의할 때도 static 예약어 사용 가능
  • 외부 클래스의 객체를 생성하지 않고도 내부 클래스 객체 생성 가능
class Outside {        // 외부 클래스 (=Top Level Class)

public static class StaticInside {        // static 내부 클래스

// ...

}

}

public class InnerClass {

public static void main(String args[]) {

Outside.StaticInside sinner = new Outside.StaticInside();

}

}

 

 

 

이름을 갖는 지역 내부 클래스


  • 메서드 내부에 정의된 클래스로서 지역 변수와 동일한 범위를 가짐 -> 클래스가 선언된 메서드 블록 내에서만 사용 가능
  • 클래스의 이름이 명시
class Animal {        // 외부 클래스 (=Top Level Class)

void performBehavior() {

class Brain {    // 이름을 갖는 지역 내부 클래스

// ...  지역 내부 클래스 정의

}

}

}

public class InnerClass {

public static void main(String args[]) {

 

 

 

이름이 없는 지역 내부 클래스 (=무명의 내부 클래스)


  • new 예약어 뒤에 명시된 클래스가 기존의 클래스인 경우, 자동적으로 이 클래스의 자식 클래스가 됨
  • 이름이 없는 지역 내부 클래스는 추상 클래스의 객체를 내부 클래스 형태로 생성할 때 자주 사용
  • 다른 내부 클래스에 비해 활용도가 높은 클래스
  • 추상 클래스는 추상 메서드를 포함하고 있기 때문에,

추상 클래스를 상속한 클래스가 만들어져 객체를 생성해야만 객체 생성이 가능 -> 무명의 내부 클래스를 사용하는 것이 편리

 

 

 

디폴트메서드와 static메서드


  1. 여러 인터페이스의 디폴트 메서드 간의 충돌
  • 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다
  1. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
  • 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

 

 

 

참고자료


자바의 정석

'Language > Java' 카테고리의 다른 글

예외 처리  (0) 2021.09.27
인터페이스  (0) 2021.09.26
싱글톤  (0) 2021.09.19
오버로딩 vs 오버라이딩  (0) 2021.09.19
추상화  (0) 2021.09.19