학원/JAVA

10/11 18-5 InnerAnonymousClass(내부 무명 클래스)

도원결의 2022. 10. 11. 21:53

InnerAnonymousClass


[익명 클래스]
말 그대로 정말 이름이 없는 클래스
GUI프로그래밍 시 주로 사용(이벤트 처리하기 위해서)
이 클래스는 *****부모 클래스의 메소드를 오버라이딩하는 것이 주 용도 임****
이거도 아주 특의한 것이 *** 메소드 안에 정의된 클래스라는 것 *****
이름이 없어서 부모클래스의 생성자를 빌려서 인스턴스화 한다***
외부클래명$1.class,외부클래명$2.class 등.... 으로 생성됨 즉 클래스명이 없기때문에 만들어진 순서대로 인덱스가 부여돼서 내부클래스명이 된다.
[형식]
부모클래스명 인스턴스변수 = new 부모클래스명( ) { 이렇게 빌려서 인스턴스화 ? 직접 봐야 이해하겠으
};
**** 반드시 ;을 붙여라

class Person{ =>부모클래스
String name;
public Person(String name){
this.name = name;
}
@Override
public String toString() {
return "이름:"+name ; => 내 입맛대로 tostring 오버라이딩
}
}////// Person

class Student extends Person{ =>자식클래스
String stNumber; =>확장된 멤버변수
public Student(String name,String stNumber) { => 멤버변수들 초기화
super(name);
this.stNumber = stNumber;
}
String get(){
retrun String.format("%s,학번:%s",super.toString(),stNumber);
}
@Override
public String toString() {
return get();
}
}////Student

[추상클래스]
abstract class AbstractClass{
abstract void abstractMethod();
}
[인터페이스]
interface Inter{
void abstractMethod();
}


메인
이름이 있는 자식클래스 일반적인 이질화
Person person = new Student("홍길동","2022학번");
System.out.println(person);
자식에게 접근 = 형변환하기
Student student = (Student)person;
System.out.println(student.stNumber);
System.out.println(student.get()); ===> 일반적으로 이렇게 했었지...
Person person2 = new Person("가길동"); => 이거도 일반적인 동질화
System.out.println(person2.getClass().getName()); => 변수의 타입 패키지 보여주는 메소드!
=>출력

innerclass22.Person

익명클래스 함 해보자
Person anony = new Person("나길동") ; 여기서
Person anony = new Person("나길동") { }; => { } 이거 더 붙이면 익명 클래스라네?!! 틀린그림찾기야 뭐야
Person anony = new Person("나길동") { => 익명클래스 시작
[확장멤버들]
int newVar;
void newMethod() {
System.out.println("확장메소드");
}
@Override
public String toString( ) {
newMethod()
return super.toString()+",newVar:"+this.newVar;
}

}; =>익명클래스 끝! ; 꼭 붙여야 한당당당!!!
이게 person 타입의 익명클래스가 부모의 생성자를 빌려서 인스턴스화 한거라고 한다! 바로 이질화!!
System.out.println(anony.getClass().getName());
==> 출력
innerclass22.InnerAnonymousClass$1
옹? 이거 더이상 person 타입이 아님 ! 외부클래스가 됐네?)
자식에서 새롭게 정의한 멤버(int newVar, newMethod...)에는 접근은 안돼... 이름이 없으니까 다운캐스팅 할 수 없지
진짜로 오버라이딩해서 쓰는게 목적인겨!!
System.out.println(anony);
==>출력
확장메소드
이름:나길동,newVar:0

다시해보자
Student anony2 = new Student("박길동", "2021학번") {
int age =1; =>확장변수
@Override
String get() {
return super.get()+",익명 클래스의 새 멤버:"+age;
}
@Override
public String toString() {
return get();
}
};
System.out.println(anony2);
==> 출력
이름:박길동,학번:2021학번,익명 클래스의 새 멤버:1


++ 익명클래스가 추상클래스를 상속받았을 때
Abstract Class ac = new Abstract Class(){
@Override
void abstractMethod() {
System.out.println("추상메소드 오버라이딩 : 추상클래스");
}
};
ac.abstractMethod();
===> 출력
추상메소드 오버라이딩 : 추상클래스

+++ 이번엔 인터페이스 상속받았을 때
Inter inter = new Inter(){
@Override
public void abstractMethod() {
System.out.println("추상메소드 오버라이딩 : 인터클래스");
}
};
inter.abstractMethod();
==> 출력
추상메소드 오버라이딩 : 인터클래스