2008. 8. 13. 14:32
Part 4. 상속 IV 인터페이스
2008. 8. 13. 14:32 in 수업/자바2JDK입문
여러가지 다양한 기능을 하는 하위 클래스를 설계하기 위해서 다중상속이 가능한 인터페이스가 필요하다.
인터페이스 내에는 상수 또는 추상메서드만 포함될 수 있다.
정의
접근_지정자 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();*/
}
}
===================================================================================
인터페이스 내에는 상수 또는 추상메서드만 포함될 수 있다.
정의
접근_지정자 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();*/
}
}
===================================================================================
'수업 > 자바2JDK입문' 카테고리의 다른 글
Part 5. 자바에서 자주 사용되는 클래스 II - Wrapper 클래스 (0) | 2008.08.19 |
---|---|
Part 5. 자바에서 자주 사용되는 클래스 I Object 클래스 (0) | 2008.08.14 |
Part 4. 상속 III 추상 클래스와 Final (0) | 2008.08.13 |
Part 4. 상속 II 생성자, 레퍼런스 형변환 (2) | 2008.08.11 |
상속을 이용한 클래스 설계 및 출력 (0) | 2008.08.08 |