카테고리 없음

다형성/ 인터페이스

장꾸꾸 2020. 10. 14. 13:17

25. 다형성(polymorphism)
    : super(부모)클래스와 sub(자식)클래스에 동일한 이름의 함수가 
      존재(Overriding)할 경우 super클래스의 참조변수로 sub클래스의 
      인스턴스를 참조할수 있다
=========================================================

26. 인터페이스(Interface): 다중상속가능
     : 자바는 단일상속만 지원하는데 이 단점을 보완하기 위해 나온 것       

       조건) 1. 추상클래스와 달리 모든 메소드가 추상메소드이다. 
               2. 모든 변수가 final이어야 한다  
       사실, 인터페이스를 사용하는 가장 큰 목적은 다형성이다.

  (1) 인터페이스의 특징.
          

  클래스 인터페이스
     
     


                 클래스        인터페이스
       ------------------------------------------
       키워드  class             interface
       상속    extends         implements
       함수    일반,abstract  abstract(모두다)
       변수    일반,final       final(모두다)
       상속    단일상속        단일,다중상속     
       abstract  생략X          생략O
       final       생략X          생략O
       --------------------------------------------                
       - class 대신에 interface 키워드 사용.
       - 멤버변수는 상수로 선언.즉 final 키워드를 사용한다는 것이고   변경할 수 없다(final은 생략가능.)
       - 멤버메소드는 몸통이 없음.즉 abstract메소드이고 모든 메소드가  abstract이므로 생략가능.
       - 부모의 인터페이스를 상속받을시는 extends 대신 implements 키워드 사용.
   (2)인터페이스 형식
        public interface 인터페이스이름{
                 상수선언. 상수선언이라 함은 final 키워드를 쓰는것.
                 이름뿐인 메소드 선언
        }

 

 

인터페이스는 하나로는 의미가 없음

각각의 고유기능이 있다.

 

파이널 변수는 변수으 ㅣ기능보다 고유한 이름을 붙여준다고 생각.

 

package interfaceex;

//인터페이스-------------------------------------------
interface Shape{
	/* final */ int r=10;
	/* abstract */ public void draw();
	/* abstract */ public void erase();
}
class Circle implements Shape{
	@Override
	public void draw() {
		System.out.println("반지름이 "+ r + "인 원을 그린다");
	}
	@Override
	public void erase() {
		System.out.println("원을 지운다");
	}
}
public class InterfaceEx1 {
	public static void main(String[] args) {
		Circle ob=new Circle();
		ob.draw();
		ob.erase();
	}
}
//추상 (미완성)클래스------------------------------------
/*
abstract class Shape{
	final int r=10;
	abstract public void draw();
	abstract public void erase();
}
class Circle extends Shape{
	@Override
	public void draw() {
		System.out.println("반지름이 "+ r + "인 원을 그린다");
	}
	@Override
	public void erase() {
		System.out.println("원을 지운다");
	}
}
public class InterfaceEx1 {
	public static void main(String[] args) {
		Circle ob=new Circle();
		ob.draw();
		ob.erase();
	}
}
*/
//일반 클래스------------------------------------------
/*
class Shape{
	final int r=10;
	public void draw() {}
	public void erase() {}
}
class Circle extends Shape{
	@Override
	public void draw() {
		System.out.println("반지름이 "+ r + "인 원을 그린다");
	}
	@Override
	public void erase() {
		System.out.println("원을 지운다");
	}
}
public class InterfaceEx1 {
	public static void main(String[] args) {
		Circle ob=new Circle();
		ob.draw();
		ob.erase();
	}
}
*/







 

 

package interfaceex;

abstract class Flyable{
	abstract public void fly();
}
abstract class Cryable{
	abstract public void cry();
}
class Eagle extends Flyable{
	@Override
	public void fly() {
		System.out.println("독수리는 날아 다닙니다");
		new CryableEx().cry();
	}
	//중첩클래스(inner class):클래스 안에서 또 다른 클래스를 정의 하는것
	//InterfaceEx2.java  --> InterfaceEx2.class / Cryable.class / Flyable.class
	//                       Eagle$CryableEx.class
	class CryableEx extends Cryable{
		@Override
		public void cry() {
			System.out.println("캬악~~~ 캬악~~~");
		}
	}
}
public class InterfaceEx2 {
	public static void main(String[] args) {
		new Eagle().fly();
	}
}

인터페이스로 만들면 아래와 같이 됨.

package interfaceex;

interface Flyable{
	abstract public void fly();
}
interface Cryable{
	abstract public void cry();
}
class Eagle implements Flyable, Cryable{
	@Override
	public void fly() {
		System.out.println("독수리는 날아 다닙니다");
	}
	//중첩클래스(inner class):클래스 안에서 또 다른 클래스를 정의 하는것
	//InterfaceEx2.java  --> InterfaceEx2.class / Cryable.class / Flyable.class
	//                       Eagle$CryableEx.class
	@Override
	public void cry() {
		// TODO Auto-generated method stub
		System.out.println("캬악~~~ 캬악~~~");
	}
}
public class InterfaceEx2 {
	public static void main(String[] args) {
		Eagle ob = new Eagle();
		ob.fly();
		ob.cry();
	}
}

 

 

연습문제 꼭 해보기

package interfaceex;
class User{
	protected String name;
	public User() {
		
	}
	public User(String name) {
		
	}
	@Override
	public String toString() {
		return "이름 : " + name ;
	}
}
//-----------------------------------
interface Score{
	public int sol = 20;//초깃값 20
	abstract public int getScore();
}
interface Print{
	abstract public String toPaint();
}
//-----------------------------------
public class InterfaceEx3 extends User implements Score,Print{    // User, Score, Print 상속
	int s;   
	public InterfaceEx3() {
	}
	public InterfaceEx3(String name, int s) {
		super();
		this.name = name;
		this.s = s;
	}
	@Override
	public String toPaint() {
		// TODO Auto-generated method stub
		return toString()+"\r\n"
				+ "점수 : "+getScore();
	}
	public InterfaceEx3(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}
	@Override
	public int getScore() {
		// TODO Auto-generated method stub
		return s*sol;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString();
	}
	public static void main(String[] args) {
		InterfaceEx3 ob=new InterfaceEx3("홍길동",3);
		System.out.println(ob.toPaint());
	}
}

under_original

package interfaceex;

/* class와 interface를 이용하여 성적처리
 *  클래스명 : User
 *  -name:String
 *  +User()
 *  +User(name:String)
 *  +toString():String    --> "이름 : 홍길동" 를  리턴
 *  
 *  인터페이스명 : Score
 *  +sol:int         (초깃값:20)
 *  +getScore():int
 *  
 *  인터페이스명 : Print
 *  +toPaint():String
 *  
 *  [출력화면]
 *  이름 : 홍길동
 *  점수 : 60점
 */
class User{
	private String name;
	
	public User(){
	}
	public User(String name){
		this.name=name;
	}
	public String toString(){
		return "이름 : " + name +"\n";
	}
}
//--------------------------------------------------------
interface Score{
	public int sol=20;
	public int getScore();       // 맞은수 * sol을 리턴
}
//--------------------------------------------------------
interface Print{
	public String toPaint();
}
//--------------------------------------------------------
public class InterfaceEx3 extends User implements Score,Print {   // User, Score, Print를 상속
	int s;      // 점수 변수
	
	public InterfaceEx3(String name, int s) {
		super(name);
		this.s=s;
	}
	@Override
	public String toPaint() {
		return super.toString()+"점수 : "+getScore() +"점";
	}
	@Override
	public int getScore() {
		return s*sol;
	}
	public static void main(String[] args) {
		InterfaceEx3 ob=new InterfaceEx3("홍길동",3);
		System.out.println(ob.toPaint());
	}
}