본문 바로가기
자바과정/Java

Java 기초 - 7일차

by Parkej 2021. 2. 15.

추상 클래스와 인터페이스

abstract & Interface

 

package abs;
// abstract 추상화
public abstract class Abstract {

	public abstract void disp() ; // 추상 메소드
	
	public void output() {
		System.out.println("추상클래스안에 있는 메소드");
	}
}

/*
 * 추상클래스
 * : 아직 구체화가 덜된 클래스
 * : 추상메소드가 하나이상 존재하는 클래스. (여러개 가능)
 * : 객체를 생성할 수 없는 클래스. 예외 : 익명내부클래스
 * 
 * : 오직 상속을 목적으로 제공.
 * : 상속받은 sub class도 객체를 생성할 수 없다.
 *  - sub class 객체생성을 하고자 할 경우 추상메소드(구체화가 안된부분)를 
 *  꼭 오버라이딩을 해서 사용하면 객체를 생성할 수 있다.(추상화)
 *  
 *  추상메소드
 *  : 이름만 정의되어있는 메소드
 *  : abstract 키워드를 꼭 붙여서 사용
 *  
 *  추상클래스도 abstract 꼭 붙여서 만들어야한다.
 *  
 *  인터페이스
 *  : 다중상속을 대체. (1차목표)
 *  : 상수, 추상메소드로만 구성.
 *  : 추상클래스보다 더 추상화된 모델.
 *  : 식당 메뉴판과 같다.
 *  : 인터페이스를 받은 클래스에서 구현.(추상메소드를 오버라이딩) - 강제성 발생
 *  : 갯수제한없이 클래스에 줄 수 있다. 
 *  
 *  : 인터페이스끼리는 상속이 가능한데 다중상속도 가능하다. (모호성이 발생하지 않는다.)
 *  : implements 여러개 가능.
 *  : 인터페이스는 동적바인딩 가능.
 * 
 */

 

 

package abs;


public class AbsTest extends Abstract{ // 추상클래스 메소드를 끌어온거니 추상클래스화가 된거임. 

	public static void main(String[] args) {
		
//		Abstract abs; // 레퍼런스 선언
//		Abstract abs = new Abstract();
		
		AbsTest abs = new AbsTest();
		abs.disp();
		abs.output();
	}

	@Override // 오버라이딩 
	public void disp() {
		System.out.println("오버라이딩 메소드");
	}

}
/*
 * 추상클래스는 객체성성을 할수없다.
 * 상속을 목적으로 사용되어지는 클래스
 * 강제성을 가지고 있음.
 * 
 * Is a 관계 서브클래스로 내려올수록 구체화되는 단계 
 * 공통 : 
 *  1. 슈퍼클래스는 서브클래스의 공통된 것을 담고 있어야 함.(강제성)
 *  2. 
 */

 

----------- 동적바인과 추상클래스

package day7abs;

public abstract class Area { // 추상클래스
	
	public abstract void draw(); // 정의만 해놓음
}




package day7abs;

public class Circle extends Area {

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("Circle drwa..");
	}

}



package day7abs;

public class Rect extends Area{

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("Rect drwa..");
	}

}



package day7abs;

public class Tri extends Area{

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("Tri drwa..");
	}
	
	public void Tri() {
		System.out.println("tri");
	}
}



package day7abs;

public class MainTest {
	public static void main(String[] args) {
		Tri tri = new Tri(); // 정적바인딩.
		Rect rect = new Rect();
		Circle cir = new Circle();
		
//		tri.draw();
//		rect.draw();
//		cir.draw();
		
		Area area;
		area = tri; // 동적바인딩
		area.draw();
//		area.Tri(); // 인식을 할 수 없다. 
		
		area = rect;
		area.draw();
		
		area = cir;
		area.draw();
		
		
		
//		Area a = new Tri();
		
		
		
	}
}

/*
 * 동적바인딩.
 * : 부모의 레퍼런스로 자식객체를 접근하는 방식.
 * : 자식만 알고있는것들은 동적바인딩 접근이 안됨.
 * : 부모가 원래 알고있는것만 접근가능
 */

 

 

인터페이스

 

package interFace;

public interface A extends B,C{ // 인터페이스는 자동으로 됨 ㅋ
	// 상수 + 추상메소드
	final static int a = 10; // 선언과 동시에 꼭 초기화를 해야함. static : 오직 한개
	abstract void disp();
}

/*
 * final (키워드가 붙으면 상수)
 * 1. field => 자동으로 상수화
 * 2. method => 오버라이딩 금지(자식한테 너 무조건 내꺼써)
 * 3. Object => 상속금지(is ~ a 금지) has ~ a 로만 => String class
 */



package interFace;

public interface B {
	void dispB();
}




package interFace;

public interface C {
	void dispC();
}




package interFace;

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();
		
		
	}

	@Override
	public void dispB() {
		// TODO Auto-generated method stub
		System.out.println("dispB");
	}

	@Override
	public void dispC() {
		// TODO Auto-generated method stub
		System.out.println("dispC");
	}

	@Override
	public void disp() {
		// TODO Auto-generated method stub
		System.out.println("dispA");
	}


}

인터페이스 상속

반응형

댓글