개발 공부/JAVA

java 추상 클래스 / 인터페이스/ 중첩클래스

공부하는개발자_ 2023. 5. 31. 09:48

 

 

추상클래스 : abstract class 클래스명
메소드 또는 멤버 중에 하나라도 abstract라면 멤버를 담고 있는 클래스는 자동으로 추상 클래스가 된다. 
(추상 클래스라고 해서 추상 메서드가 반드시 포함되어야 하는 것은 아니다)
new로 객체 생성불가

 

추상메소드

abstract ( ) : 하위 클래스에서 반드시 재정의(오버라이딩) 해야한다 (=>상속을 강제하고 있음을 의미)

추상메서드를 포함하고 있는 클래스는 반드시 추상 클래스가 되어야 한다.

 

 

final 메소드 : 하위 클래스에서 재정의 불가

public abstract class Test{

       abstract void m( ) ;

       final void m1( ) {  }
}

class TestChild1 extends Test{  }   ERROR <- 이유: m() 재정의 안됨

class TestChild2 extends Test{ void m( ){ } void m1( ){ } } ERROR <- m1( )재정의 금지된 메소드를 재정의함.

 

public abstract class A{ void m( ){ }    void m1(){}  }

public class Achild extends A{ }  OK

new A( );   ERROR

 

public final class F{ void m( ) { }  void m1( ){ }  }

public class Fchile extends F{ }   ERROR

new F( );  OK

 

객체 생성 불가한 경우

1) 추상 클래스일때

2) 생성자가 private으로 선언되어있을때 

 

인터페이스

시스템에 접속할 수 있는 접속장치

제공자 : 인터페이스로 부터 구현된 하위 클래스를 만들면서 인터페이스가 가지고 있는 메소드를 오버라이딩 하면됨

인터페이스의 모든 메소드는 추상 메소드여야 하며, 다중 상속을 받을 수 있게 하는 것이 인터페이스의 특징이다.

클래스와 인터페이스를 구현하는 예약어는 implements이다.

다형성 구현에 주된 기술로 이용됨.

객체를 만들 수 없다.

 

 

upcasting됨

a = new B();
a = new C();

a = new D();

 

b= (B)a;   //downcasting
b.b();   //OK

b.a(); //B의 overriding된 a( )호출

 

d =(D)b; // upcasting되지 않았기때문에 downcasting불가

d.d( );

d.b( );

d.a( );

 

Instance Of 

자식객체였는지 확인하는 연산

 

중첩클래스 (Nested Class)

내부에 선언한 클래스. 
재사용성이 떨어짐. 
사용하는 이유 : inner class는 outer class의 멤버변수와 메소드를 자신의 것처럼 사용 가능. 
 ex) 이벤트 핸들러는 재사용성이 떨어져서 inner class형태로 사용한다