- 클래스에도 아웃소싱과 유사한 기법 적용 가능
-> 클래스 내부에 특정한 처리를 담당하는 클래스를 포함시킬 수 있음
- 내부 클래스 : 클래스 내에 정의된 또 다른 클래스
[내부 클래스 정의]
1. 내부 클래스 개요
- 클래스 내에 또 다른 클래스를 포함하는 기법
- 포함하는 클래스를 외부 클래스, 포함되는 클래스를 내부 클래스라 함
- 내부 클래스에서 외부 클래스의 접근은 제한 없이 가능
- 외부 클래스에서 내부 클래스의 멤버 변수나 메서드에 접근시 내부 클래스의 객체를 생성해야 함
class A { -> 외부 클래스
class B { -> 내부 클래스
}
}
- 컴파일 한 뒤에는 내부 클래스 파일이 별도로 생성됨
- 별도로 생성된 파일명 : 외부클래스명$내부클래스명.class
- GUI 프로그래밍에서 이벤트 처리에 활용
2. 내부 클래스 문법
class OuterExam { -> 외부 클래스
public OuterExam() { -> 생성자
System.out.println("외부 클래스의 생성자");
InnerExam inner = new InnerExam(); -> 내부 클래스 객체 생성
inner.printExam();
}
public void printOuter() {
System.out.println("외부 클래스의 메서드");
}
class InnerExam { -> 내부 클래스
public void printExam() {
System.out.prinln("내부 클래스 메서드");
printOuter(); -> 외부 클래스의 메서드를 호출(제한x이 호출 가능)
}
}
public static void main(String args[]) {
OuterExam outer = new OuterExam();
}
}
[내부 익명 클래스]
1. 내부 익명 클래스 개요
- 일반적으로 클래스는 정의와 생성이 분리되어 있음
- 내부 익명 클래스는 정의와 생성이 통합된 형태이며 클래스의 명칭이 없음
- 클래스의 인스턴스를 메서드 호출 시 매개변수에 넣을 때 사용
- 인스턴스 생성 후 레퍼런스를 유지할 필요가 없을 때 사용
- 익명 클래스는 클래스를 상속하거나 인터페이스를 구현할 때 사용할 수 있음
- 문법
new 부모클래스명(매개변수) {
클래스 정의;
}
2. 내부 익명 클래스 사용
class First {
public void printMsg() {
System.out.println("첫 번째 클래스");
}
}
public class TestMain {
public static void main(String args[]) {
First first = new First();
first.pringMsg();
first second = new First() { -> 별도의 클래스를 만들지 않고 즉석에서 클래서 정의, 생성
public void printMsg() {
System.out.println("오버라이딩한 첫 번째 클래스");
} -> 내부 익명 클래스(정의+생성) : second라는 객체를 한번 쓰고 말 때 사용
};
second.printMsg();
}
}
ex)
객체a.method(new B()); -> 매개변수로 B라는 객체를 직접 생성해서 넣을 수도 있음
+ 내부 익명 클래스 활용
public class HelloProgram {
interface HelloLanguage {
public void language();
}
public void helloLang() {
HelloLanguage javalang = new HelloLanguage() { -> javalang이라는 객체를 클래스를 따로 정의X고 즉석에서 생성
public void language() {
System.out.prinln("Java Language");
}
};
javalang.lanuage();
}
public static void main(String args[]) {
HelloProgram myhello = new HelloProgram();
myhello.helloLang();
}
}
[실습]
public class Exam16_1 {
public Exam16_1() {
Sysem.out.prinntln("외부 클래스의 생성자");
InnerExam inner = new InnerExam(); -> 외부 클래스에서 내부 클래스에 접근하기 위해 객체 생성 반드시!
inner.printExam();
}
public void printOuter() {
System.out.println("외부 클래스의 메서드");
}
class InnerExam {
public void printExam() {
System.out.println("내부 클래스 메서드");
printOuter();
}
}
public static void main(String[] args) {
Exam16_1 outer = new Exam16_1(); -> 생성함과 동시에 실행됨
}
}
외부 클래스의 생성자
내부 클래스 메서드
외부 클래스의 메서드
'프로그래밍 > 자바(java) 융합개발자 2차' 카테고리의 다른 글
[취성패] 자바 배우기 - 선수학습(문자열 클래스) (0) | 2020.12.13 |
---|---|
[취성패] 자바 배우기 - 선수학습(Object 클래스) (0) | 2020.12.13 |
[취성패] 자바 배우기 - 선수학습(인터페이스) (0) | 2020.12.13 |
[취성패] 자바 배우기 - 선수학습(추상 클래스) (0) | 2020.12.13 |
[취성패] 자바 배우기 - 선수학습(상속과 접근제어) (0) | 2020.12.13 |