코딩은 실력보다 시력이지

빅데이터교육과정/JAVA

DAY 8. interface와 추상클래스

Listeria 2021. 2. 16. 02:15

 추상 클래스
  : 아직 구체화가 덜 된 클래스
   : 추상 메소드가 하나 이상 존재하는 클래스.
   : 객체를 생성할 수 없는 클래스, 예외 : 익명 내부 클래스(anonymous)
   : 오직 상속을 목적으로 제공.
   : 상속받은 sub class도 객체를 생성할 수 없다.
   -> sub class 객체 생성을 하고자 할 경우 추상메소드(구체화가 안 된 부분)를 꼭 오버라이딩 해서 사용하면 객체를 생성할 수 있다.(추상화)
   : 이름만 정의되어 있는 메소드
   : abstract 키워들르 꼭 붙여서 사용
   : 추상 클래스도 abstract를 꼭 붙여서 만들어야한다.
 

 추상 클래스는 객체 생성을 할 수 없으며 상속을 목적으로 사용되어지는 클래스이다.
    사용이유
  1. 공통되는걸 부모 클래스가 가지고 있어야함.
  2. sub class에 어떤 기능을 강제로 만들게 할 때.
 

//추상 메소드, 클래스 예시
public abstract class AbsClassEx {

	public abstract void disp(); // 추상 메소드

	public void output() {
		System.out.println("추상클래스");
	}
}


   
  동적 바인딩
   : 부모의 레퍼런스로 자식 객체를 접근하는 방식.
   : 바인딩할 때 부모들을 한번만 호출 해두면 그 아래에 코드는 굳이 바꿔 쓸 필요가 없기때문에 중복 코딩을 막을 수 있다.

public class MainTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Tri tri = new Tri();			//정적 바인딩
		Rect rect = new Rect();
		Circle circle = new Circle();

		Area area;
		area = tri;	//동적 바인딩
		area.draw();
		
		area = rect;
		area.draw();
		
		area = circle;
		area.draw();
		
	}

}


   
  인터페이스
   : 다중 상속을 대체.
   : 상수, 추상메소드로만 구성
   : 추상 클래스보다 더 추상화 된 모델
   : 식당 메뉴판과 같다
   : 인터페이스를 받은 클래스에서 구현.(추상 메소드를 오버라이딩)
   : 갯수제한이 클래스에 사용할 수 있다.
   : 인터페이스 끼리는 상속이 가능한데 다중 상속도 가능하다.(모호성이 발생하지 않는다)
   : implement 가능
   : 동적 바인딩 가능

//interface의 예시.
package Inter;

public class InterTest implements A{
	
	public static void main (String[] args) {
		
/*		InterTest it = new InterTest();
		
		it.disp();
		it.dispB();
		it.dispC();
		*/
		A a = new InterTest();	//동적 바인딩
		a.disp();
		a.dispB();
		a.dispC();
		
		B b = new InterTest();
		b.dispB();
		
	}
	
	@Override
	public void disp() {
		System.out.println("dispA");
		
	}
	
	@Override
	public void dispB() {
		System.out.println("dispB");
	}
	
	@Override
	public void dispC() {
		System.out.println("dispC");
	}
}
/////////////////////
package Inter;
public interface A extends B,C{
// 상수 + 추상 메소드
	int a = 10;	//상수화 
	void disp(); // abstract가 생략되어있다.
}
/////////////////////
package Inter;

public interface B {

	void dispB();
}
//////////////////////
package Inter;

public interface C {
	
	void dispC();
}