본문 바로가기

언어공부/Java

자바 내부클래스 (inner class), 내부인터페이스

자바 내부클래스에 대해서 알아보자

내부클래스(inner class)

내부 클래스는 클래스 내에 선언된 클래스이다. 클래스에 다른 클래스를 선언하는 이유는 두 클래스가 긴밀한 관계에 있기 때문이다. 한 클래스를 다른 클래스의 내부 클래스로 선언하면 두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 클래스를 감춤으로서 코드의 복잡성을 줄일 수 다는 장점(캡슐화)이 있다.

 

인스턴스 클래스와 정적 클래스에는 선언할 수 있는 변수 및 메소드가 다르다.
지역 클래스에는 정적변수와 정적메소드는 선언할 수 없다.

 

컴파일 된 class파일명이 다르다.

 

여기서 A는 외부클래스, B와 C는 내부 클래스(외부클래스$내부클래스명.class 파일로 컴파일), D는 지역클래스(외부클래스명$번호 지역클래스명.class파일로 컴파일)이다.  이때 내부 클래스는 A를 제외하고 다른 클래스에서 잘 사용되지 않아야 한다.

 

호출하는 방법.

 

내부클래스는 클래스 내에 선언된다는 점을 제외하고는 일반적인 클래스와 다르지 않다. 내부클래스도 클래스이기 때문에 static, abstract나 final과 같은 제어자를 사용할 수 있을 뿐만 아니라, private, protected 접근제어자도 사용이 가능하다. 호출할때는 외부클래스.내부클래스타입으로 객체를 생성해서 호출할 수 있다.

 

인스턴스 내부클래스와 정적 내부클래스의 접근 가능한 변수 및 메소드

 

인스턴스 내부클래스 B에서는 외부클래스의 인스턴스 변수&메소드와 정적 변수&메소드 모두 접근이 가능하지만, 정적 내부클래스 C에서는 외부클래스의 정적변수와 정적메소드에만 접근이 가능하다.

 

jdk 1.8에서 로컬(지역)클래스에서의 final을 생략해도 상수로 인식된다.

 

로컬 클래스에서는 jdk1.8부터 final을 생략해도 상수로 인식되어 값을 변경하려고 하면 에러가 발생한다. 1.8이전이라면 final상수로 값을 변경하지 못하게 막는 것이 좋다.

 

내부 인터페이스

아래의 예제처럼 클래스 안에 내부 인터페이스도 작성할 수 있다.

 

 

Button클래스에 OnClickListener 내부 인터페이스를 작성하고, setOnClickListener메소드로 해당 인터페이스를 구현한 클래스를 받아 실제 가리키는 객체를 매개변수의 객체로 하며, touch메소드로 객체의 오버라이딩 된 onClick메소드를 호출하게 한다.

 

출력화면