본문 바로가기
자바(Java)

자바 입문하기16 - 내부클래스

by codeyaki 2022. 1. 12.
반응형

해당 강의를 보고 정리한 것입니다.

https://programmers.co.kr/learn/courses/5

 

자바 입문

자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 이 강의의 내용을 책으로 만나고 싶으시면 여기를 눌러 책 정보를 확인하세요. 강의를 다 들었는데, 지금

programmers.co.kr


내부클래스

: 클래스 안에 선언된 클래스, 중첩된 클래스 혹은 인스턴스 클래스(instance class)라고 불림.

 

위치에 따라 4가지 형태가 있음

1. 클래스 안에 인스턴스 변수, 즉 필드를 선언하는 위치에 선언되는 경우. 중첩 클래스 혹은 인스턴스 클래스라고 한다.

  • 내부에 있는 Cal 객체를 생성하기 위해서는,
    밖에는 InnerExam1의 객체를 만든 후 InnerExam1.Cal cal = t.new Cal(); 과같은 방법으로 Cal 객체를 생성한 후 사용
public class InnerExam1 {
	class Cal{
		int value = 0;
		public void plus() {
			value++;
		}
	}
	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으로 정의된 경우. 정적 중첩 클래스 또는 static 클래스라고 한다.

  • 필드 선언할 때 스태틱한 필드로 선언한 것과 같다. 이 경우에는 InnerExam2 객체를 생성할 필요 없이
    new InnerExam2.Cal()로 객체를 생성할 수 있다.
public class InnerExam2 {
	static class Cal{
		int value = 0;
		public void plus() {
			value++;
		}
	}
	public static void main(String[] args) {
		InnerExam2.Cal cal = new InnerExam2.Cal();
		cal.plus();
		System.out.println(cal.value);
	}
}

3. 메서드 안에 클래스를 선언한 경우, 지역 중첩 클래스 또는 지역 클래스라고 한다.

  • 메서드 안에서 해당 클래스를 이용할 수 있다.
public class InnerExam3 {
	public void exec() {
		class Cal{
			int value = 0;
			public void plus() {
				value++;
			}
		}
		Cal cal = new Cal();
		cal.plus();
		System.out.println(cal.value);
	}
	public static void main(String[] args) {
		InnerExam3 t = new InnerExam3();
		t.exec();
	}
}

4. 익명 클래스

  • 일회용 클래스를 만들 때 사용(람다 함수와 비슷?)

추상 클래스 Action

//추상 클래스 Action
public abstract class Action {
	public abstract void exec();
}

추상 클래스 Action을 상속받은 클래스 Myaction & 객체 생성

//추상클래스 Action을 상속받은 클래스 MyAction
public class MyAction extends Action {
	public void exec() {
		System.out.println("exec");
	}

}
public class ActionExam {

	public static void main(String[] args) {
		Action action =new MyAction();
		action.exec();
	}
}

Action클래스를 따로 생성하지 않고 익명 클래스를 사용해 객체를 객체 생성 방법

public class ActionExam {

	public static void main(String[] args) {
		Action action = new Action() {
			public void exec() {
				System.out.println("exec");
			}
		};
	}
}
  • 생성자 다음에 {}가 나오면, 해당 생성자 이름에 해당하는 클래스를 상속받는 이름 없는 객체를 만든다는 것을 뜻함
  • {} 안에는 메서드를 구현하거나 메서드를 추가할 수 있다.
    이렇게 생성된 이름 없는 객체를 action이라는 참조 변수가 참조하도록 하고, exec() 메서드를 호출
  • Action을 상속받는 클래스가 해당 클래스에서만 사용되고 다른 클래스에서 사용되지 않는 경우에 사용
반응형