2008. 8. 13. 14:32

Part 4. 상속 IV 인터페이스

여러가지 다양한 기능을 하는 하위 클래스를 설계하기 위해서 다중상속이 가능한 인터페이스가 필요하다.
인터페이스 내에는 상수 또는 추상메서드만 포함될 수 있다.
정의
접근_지정자 interface 인터페이스 이름{
상수;
접근_지정자 추상메서드();
}
인터페이스에 속한 모든 메서드는 추상메서드이므로 명시적으로 abstract 지시어를 붙이지 않아도 추상 메서드로 인식한다.
===================================================================================
package pack01;
// 추상 클래스 2개 
abstract class Hello{
 public abstract void sayHello();
}
abstract class Goodbye{
 public abstract void sayGoodbye();
}
// 서브 클래스 1개 : extends 다음에는 한개의 슈퍼클래스만 상속 가능
class SubTest extends Hello, Goodbye { // 컴파일 에러
 public void sayHello(){
 }
 public void sayGoodbye(){
 }
}*/
public class Ex01 {
 public static void main(String[] args) {
 
 }
}
===================================================================================
package pack02;
//추상 클래스 1개, 인터페이스 1개 
abstract class Hello{
 public abstract void sayHello();
}
interface Goodbye{
 void sayGoodbye();
}
// 서브 클래스 1개 : extends 다음에는 한개의 슈퍼클래스만 가능
class SubTest extends Hello implements Goodbye {
 public void sayHello(){
 }
 public void sayGoodbye(){
 }
}
public class Ex01 {
 public static void main(String[] args) {
 
 }
}
===================================================================================
package pack03;
// 인터페이스 2개
interface Hello{
 void sayHello();
}
interface Goodbye{
 void sayGoodbye();
}
// implements 다음에는 여러개의 인터페이스를 기술할 수 있다.
class SubTest implements Hello, Goodbye {
 public void sayHello(){
 }
 public void sayGoodbye(){
 }
}
public class Ex01 {
 public static void main(String[] args) {
 
 }
}
===================================================================================
package pack04;
interface Hello{
 void sayHello();
}
interface Goodbye extends Hello{
 void sayGoodbye();
}
class SubTest implements Goodbye{
 public void sayHello(){
 }
 public void sayGoodbye(){
 }
}
public class Ex01 {
 public static void main(String[] args) {
 }
}
=============================  도형의 넓이 계산  ==================================
package pack05;
interface IColor{
 int RED=1; // static final이 생략된
 int GREEN=2; // 이름이 있는 상수
 int BLUE=3;
}
// 동일한 접근방식을 위한 표준안을 제공하기 위해서
abstract class Shape{
 double area; // 추상클래스에 면적을 저장할 변수 선언
 abstract void Calc();
 void prn(){ // 일반 메소드도 정의
  System.out.println(area);
 }
}
// 면적만 구하는 원에서 색상도 있는 원으로 업그레이드
class Circ extends Shape implements IColor{
 int color;
 Circ(){
  color=RED;
 }
 int r=5;
 void Calc(){
  area=r*r*Math.PI;
 }
}
class Rect extends Shape{
 int w=10, h=10;
 void Calc(){
  area=w*h;
 }
}
public class Ex01 {
 public static void poly(Shape ref){ // 업캐스팅 후에는
  // 반지름이 5인 원의 면적
  // 다운캐스팅은 2번 형 검사를 한다.
  // 1. 컴파일시의 발생하는 형검사는 캐스트 연산자로 가능
  // 2. 런타임시 발생하는 형검사는 instanceof 연산자로
  if(ref instanceof Circ){
   Circ c=(Circ)ref;
   System.out.println("반지름이 "+c.r+" 인 원의 면적");
  }
  else if(ref instanceof Rect){
   Rect r=(Rect)ref;
   System.out.println("너비가 "+r.w+" 높이가"+r.h+" 인 사각형의 면적");
  }
  /*Circ c=(Circ)ref;
  System.out.println("반지름이 "+c.r+" 인 원의 면적");*/
  ref.Calc(); // 오버라이딩한 함수를 호출하면 인스턴스에
  ref.prn(); // 의해서 호출될 함수가 결정된다.
 }
 public static void main(String[] args) {
  poly(new Circ());
  poly(new Rect());
  /*Circ c=new Circ();
  c.Calc();
  c.prn();
  Rect r=new Rect();
  r.Calc();
  r.prn();*/
 }
}
===================================================================================