- 클래스 안에 클래스는 만드는 것을 의미한다.
- 클래스 내부에 만든 클래스를 Inner Class 라고 부르며 Inner 클래스를 감싸고 있는 클래스를 Outer Class 라고 부른다.
- 클래스 안에 클래스를 만든 개념
- 클래스 내부의 클래스는 외부 클래스의 객체를 통해서 생성할 수 있다.
- 특정 클래스에 정의된 멤버를 자주 사용하는 경우 사용한다.
class OuterClass1 {
int outerMemberA = 100;
public void outerMethodA() {
System.out.println("outerMethod!");
// 내부 클래스의 멤버를 사용 불가
System.out.printf("innerMemberA : %d\n", innerMemberA);
innerMethodA();
}
class InnerClass1 {
int innerMemberA = 200;
public void innerMethodA() {
System.out.println("innerMethod!");
}
public void innerMethodB() {
// 외부 클래스에 정의된 멤버를 사용한다.
System.out.printf("outerMemberA : %d\n", outerMemberA);
outerMethodA();
}
}
}
- 메서드 내부에 클래스를 작성하여 사용하는 클래스
- 메서드의 수행이 끝나면 클래스가 메모리에서 사라지기 때문에 메서드 외부에서는 클래스를 사용할 수 없다.
class OuterClass3 {
// 지역 중첩클래스 타입의 멤버변수 선언
// 사용 불가
InnerClass3 in30;
public void outerMethod3() {
// 지역 중첩 클래스
class InnerClass3 {
}
// 지역 중첩 클래스 객체 생성
InnerClass3 in3 = new InnerClass3();
System.out.println(in3);
}
// 다른 메서드에서 사용
// 사용 불가
public void outerMethod30(InnerClass3 in33) {
InnerClass3 in33;
}
}
클래스의 이름이 없다는 뜻이다.
익명 중첩 클래스는 상속관계의 클래스는 만드는 것이다.
특정 클래스를 상속받은 클래스를 만듬과 동시에 객체를 생성할 때 사용한다.
메서드 overriding 때문에 사용한다.
특정 클래스를 상속받은 클래스의 객체를 단 하나만 만들어 사용할 때 사용한다.
SuperClass100 s100 = new SuperClass100() {
public void superMethod100() {
System.out.println("overriding된 메서드");
}
};
class SuperClass100 {
public void superMethod100() {
System.out.println("superMethod100");
}
}
추상 메서드를 하나라도 가지고 있는 클래스
// 추상 클래스
// 추상 메서드를 가지고 있는 클래스
// 클래스 앞에 abstract를 붙여준다.
abstract class TestClass1 {
public void testMethod1() {
System.out.println("일반 메서드");
}
// 추상 메서드
// 코드를 작성하는 몸체 부분이 없는 메서드
// 메서드 앞에 abstract 키워드를 붙여준다.
public abstract void testMethod2();
}
//추상 클래스를 상속받아 구현한 클래스
class TestClass2 extends TestClass1 {
@Override
public void testMethod2() {
// TODO Auto-generated method stub
System.out.println("TestClass2에서 구현한 testMethod2");
}
}
추상 메서드로만 구현되어 있는 것을 가르킨다.
인터페이스를 통해 반드시 구현해야 할 메서드를 동시에 여러 개를 구현할 수 있다.
interface TestInterface1 {
// 인터페이스에 정의한 변수는 static final 변수이다.
int a1 = 100;
// 메서드
// 인터페이스에 정의한 메서드는 추상 메서드이다.
public void testMethod1();
// 인터페이스에 static 메서드를 정의할 수 있다.
public static void testMethod100() {
System.out.println("testMethod100");
}
}
// 인터페이스를 구현한 클래스
// 인터페이스는 다수를 구현할 수 있다.
class TestClass1 implements TestInterface1, TestInterface2 {
@Override
public void testMethod1() {
// TODO Auto-generated method stub
System.out.println("TestClass1의 testMethod1");
System.out.printf("a1 : %d\n", a1);
}
@Override
public void testMethod2() {
// TODO Auto-generated method stub
System.out.println("TestClass2의 testMethod2");
}
// testMethod100 메서드는 static 메서드이므로 Overriding할 수 없다.
}