CHAPTER 17. Inner class 알아가기
1 ) Inner class의 정의
"클래스 안에 선언된 클래스"
특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언합니다. 이러한 내부 클래스는 외부 클래스(outer class)에 대해 두 개의 클래스가 서로 긴밀한 관계를 맺고 있을 때 선언할 수 있습니다.
2 ) Inner class 장단점
- 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있습니다.
-코드의 복잡성을 줄일 수 있습니다.
- 단점
-코드의 재사용이 어렵습니다.
-내부(중첩) 클래스입니다.(inner class, nested class)
3 ) 선언하는 위치에 따른 4가지 형태
내부 클래스는 필드와 마찬가지로 선언된 위치에 따라 다음과 같이 구분됩니다.
- 인스턴스 클래스(instance class)
- 정적 클래스(static class)
- 지역 클래스(local class)
- 익명 클래스(anonymous class)
그럼 각 클래스를 코드로 알아봅시다.
1. 중접클래스(인스턴스 클래스)
/*
* 1) 클래스 안의 멤버(필드)변수를 선언하는 위치에 선언되는경우,
* 이를 중첩클래스 또는 인스턴스 클래스라고한다.
* 먼저 외부클래스격인 InnerExam1을 먼저 생성후
* InnerExam1.Cal cal = t.new Cal(); 과 같은 방법으로
* 내부클래스객체를 생성한다.
*/
public class InnerExam1 {
class Cal{
int value = 0;
public void plus() {
value++;
}
}//end class Cal
public static void main(String[] args) {
InnerExam1 t = new InnerExam1();//외부객체 생성
InnerExam1.Cal cal = t.new Cal();//내부객체 생성
cal.plus();
System.out.println(cal.value);
}
}
2. 정적중첩클래스(static 클래스)
/*
* 2) 내부 클래스가 static으로 정의된 경우, 이를 정적 중첩클래스
* 또는 static클래스라고 한다.
* 멤버(필드) 선언할때 static 선언한 것과 같다.
* 이 경우에는 외부클래스를 생성할 필요없이
외부클래스이름.내부클래스이름으로
* 접근해 사용할 수 있다.
*/
public class InnerExam2 {
static class Cal{//내부 static class
int value = 0;
public void plus() {
value++;
}
}//end class Cal
public static void main(String[] args) {
//내부 static class에 접근할때는
//외부클래스이름.내부클래스이름 참조변수 = new
외부클래스이름.내부생성자이름
InnerExam2.Cal cal = new InnerExam2.Cal();
cal.plus();
System.out.println(cal.value);
}
}
3. 지역중첩클래스(지역 클래스)
/*
* 3)메소드 안에 클래스를 선언한 경우, 이를 지역중첩클래스
* 또는 지역클래스라고 한다.
* 메소드 안에서 해당 클래스를 사용할 수 있다.
*/
public class InnerExam3 {
public void exec() {//메소드
class Cal{//메소드 안에서 class 선언
int value = 0;
public void plus() {
value++;
}
}//end class Cal
Cal cal = new Cal();
cal.plus();
System.out.println(cal.value);
}//end method exec()
public static void main(String[] args) {
InnerExam3 t = new InnerExam3();
t.exec();
}
}
4. 익명클래스(무명내부클래스)
/*
* 4)익명클래스는 생성자() 다음에 클래스의 이름없이 블럭을
* 만들어{ } 코딩하고 클래스 블럭{};의 끝에 세미콜론(;)으로
* 처리하는 특징이 있다.
*/
abstract class Action{ //추상클래스
public abstract void exec();
}
public class ActionExam extends Action{ //자식클래스
@Override
public void exec() {
System.out.println("I am Child");
}
public static void main(String[] args) {
Action a = new ActionExam() {//익명내부클래스
String name = "kim";
@Override
public void exec() {
System.out.println("나는 " + name + " 이다.");
}
};//익명클래스의 블럭끝에는 세미콜론(;)으로 마무리한다.
a.exec();
}
}
※ 익명 클래스는 이벤트 처리 등 1회성으로 사용하는 간단한 코드에 자주 사용합니다.
또한 익명클래스에서는 인터페이스 구현까지 가능합니다. 인터페이스는 new 해서 객체 생성을 못하지만 익명 클래스 처리하면 자동적으로 인터페이스를 익명 클래스가 상속받아 Override 처리할 수 있습니다.
interface RemoteControl{//인터페이스는 인스턴스할 수 없다.
void turnOn();
void turnOff();
}
public class AnonymousClassTest {
public static void main(String[] args){
//interface는 new 해서 객체 생성을 못하지만
//아래처럼 무명클래스 처리하면 자동적으로 인터페이스를 무명 클래스가 상속 받아
// Override 처리 할 수 있다.
RemoteControl ac = new RemoteControl() {//익명클래스
@Override
public void turnOn() {
System.out.println("TV turnOn()");
}
@Override
public void turnOff() {
System.out.println("TV turnOFF()");
}
};//무명내부클래스
ac.turnOn();
ac.turnOff();
}
}
마치며
오늘은 내부 클래스에 대해 포스팅을 했습니다. 클래스의 종류 마다 차이점을 보여드리기 위해 코드를 한눈에 보기 쉽게 출력했습니다..!
확실히 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근은 할 수 있고 코드의 복잡성을 줄일 순 있지만, 실무에선 클래스가 중첩되는 걸 좋아하진 않습니다..! 하지만 꼭 알아두고 가야 하는 파트입니다.
'[ JAVA ] > JAVA' 카테고리의 다른 글
[ Java ] Thread (0) | 2023.01.05 |
---|---|
[ Java ] 예외처리(Exception Handling) (0) | 2023.01.04 |
[ Java ] Scanner (0) | 2022.12.29 |
[ Java ] Collection Framework (0) | 2022.12.28 |
[ Java ] Generic (0) | 2022.12.26 |