java day11
중첩 클래스
중첩 클래스
중첩 클래스는 클래스 내부에 선언한 클래스를 말하며 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있음.
class ClassName{
class Name{ // 중첩 클래스
}
}
인터페이스도 클래스 내부에 선언할 수 있는데, 이런 인테페이스를 중첩 인터페이스라고 함. 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서임.
class ClassName{
interface Name{ // 중첩 인터페이스
}
}
내부 클래스(Inner class)
내부 클래스는 static 키워드 없이 중첩 선언된 클래스를 말하며, 클래스 또는 메소드 안에 또 다른 클래스를 만드는 것으로 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없음.
class OuterClass {
private int num1 = 10;
public void method1() {
System.out.println("num1 : " + num1);
}
class InnerClass { // innerClass 생성
private int num2 = 20;
public void method2() {
System.out.println("InnerClass.num1 : " + num1);
// InnerClass.num1 : 10
System.out.println("InnerClass.num1 : " + num2);
// InnerClass.num1 : 20
}
}
public void printInner() {
InnerClass innerClass = new InnerClass();
innerClass.method2();
}
}
public class InnerClass {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.method1(); // num1 : 10
outerClass.printInner();
System.out.println();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
// innerClass 선언 방법
innerClass.method2();
}
}
실행결과
num1 : 10
InnerClass.num1 : 10
InnerClass.num1 : 20
InnerClass.num1 : 10
InnerClass.num1 : 20
로컬 클래스(local class)
중첩 클래스는 메소드 내에서도 선언할 수 있는데, 이것을 로컬클래스라고 함. 로컬 클래스는 접근 제한자 및 static를 붙일 수 없고 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언할 수 있고 정적 필드와 메소드는 선언할 수 없음. 지역 변수는 접근 할 수 없지만, final로 선언된 상수는 접근 가능함.
public class LocalClass {
private int num1 = 10;
public void method1() { // 3번. 메소드 내
int num2 = 20;
class Local { // 로컬 클래스 생성
private int num3 = 30; // 인스턴스 필드
public void method2() { // 6. 인스턴스 메소드
System.out.println("num1 : " + num1); // num1 : 10
System.out.println("num2 : " + num2); // num1 : 20
System.out.println("num3 : " + num3); // num1 : 30
}
}
Local local = new Local(); // 4. 로컬 클래스 객체 선언
local.method2(); // 5. method2() 호출
local.num3 = 10;
}
public static void main(String[] args) {
LocalClass localClass = new LocalClass(); // 1. 객체 선언
localClass.method1(); // 2번. method1() 호출
}
}
실행결과
num1 : 10
num2 : 20
num3 : 30
static 클래스
static 클래스는 static 키워드로 선언된 클래스를 의미하며, 모든 종류의 필드와 메소드를 선언할 수 있음. 외부 클래스에 관계없이 객체를 생성할 수 있음.
public class StaticClass {
static class Static{ // static 클래스 생성
int num = 0; // 인스턴스 필드
public void plus(){ // 3. 인스턴스 메소드
num++;
}
}
public static void main(String[] args) {
StaticClass.Static Static = new StaticClass.Static();
// 1. static 클래스 객체 생성
Static.plus(); // 2. 메소드 호출
System.out.println(Static.num); // 4. 1
}
}
실행결과
1
익명 클래스(anonymous class)
익명 클래스는 클래스를 정의하지 않고 객체를 정의할 때 사용되며, 1회용 클래스이므로 재활용이 불가능함.
interface Inter2{
String method2();
}
class TestClass2 implements Inter2 {
public String method2(){
return "실명 클래스";
}
}
class TestClass3{
public void method3(Inter2 inter2){
// 인터페이스인 Inter2를 구현한 객체(TestClass2)만 진입 가능
System.out.println(inter2.method2());
}
}
public class Anonymous {
public static void main(String[] args) {
TestClass2 testClass2 = new TestClass2();
TestClass3 testClass3 = new TestClass3();
testClass3.method3(testClass2);
testClass3.method3(new TestClass2(){
// 참조변수 없이 직접 구현하는 방법
@Override
public String method2() {
return "익명객체";
}
});
}
}
실행결과
실명 클래스
익명객체