다형성/ 인터페이스
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());
}
}