[Java] 중첩 클래스, 추상 클래스, 인터페이스

이주형·2023년 5월 9일
0

Java

목록 보기
5/10

📌 중첩 클래스

  • 클래스 안에 클래스는 만드는 것을 의미한다.
  • 클래스 내부에 만든 클래스를 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();
		}
	}
}

static 중첩 클래스

  • 장점 : ...
  • 단점 : 내부 클래스가 외부 클래스의 멤버를 자유롭게 사용할 수 있다는 특징이 사라져버린다. 오로지 외부 클래스에 정의된 static 변수나 메서드만 사용이 가능하다.

지역 중첩 클래스

  • 메서드 내부에 클래스를 작성하여 사용하는 클래스
  • 메서드의 수행이 끝나면 클래스가 메모리에서 사라지기 때문에 메서드 외부에서는 클래스를 사용할 수 없다.
  • 장점 : 메서드에서 사용하는 클래스를 작성할 때 다른 곳에 작성하지 않고 바로 작성해 사용할 수 있다.
  • 단점 : 메서드 내부에서만 사용이 가능하다.
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");
	}
}

추상 클래스는 구현되지 않은 메서드를 가지고 있기 때문에 객체 생성이 불가능하다.

상속과 Overriding에 강제성을 위해 사용한다.


📌 인터페이스

추상 메서드로만 구현되어 있는 것을 가르킨다.

인터페이스를 통해 반드시 구현해야 할 메서드를 동시에 여러 개를 구현할 수 있다.

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할 수 없다.
}

0개의 댓글