2015 학년도 2 학기
1. 추상메소드 선언은되어있으나코드구현되어있지않은메소드 abstract 키워드사용 메소드타입, 이름, 매개변수리스트만선언 public abstract String getname(); public abstract void setname(string s); 2. 추상클래스 abstract 키워드로선언한클래스 종류 추상메소드를포함하는클래스 ( 반드시, abstract 로선언 ) 추상메소드가없지만 abstract 로선언한클래스
추상클래스는객체를생성할수없다 abstract class DObject { public DObject next; 결과는? public DObject(){ next = null; abstract public void draw(); class AbstractErr{ public static void main(string[] args){ DObject obj; obj = new DObject(); obj.draw();
추상클래스의필요성 계층적상속관계를갖는클래스구조를만들때 설계와구현분리 슈퍼클래스에서는개념적특징정의 서브클래스에서구체적행위구현 추상클래스의상속 추상클래스를상속받아, 추상메소드를구현하지않으면서브클래스도추상클래스화 서브클래스도 abstract 로선언해야함. but, 서브클래스에서추상메소드구현시서브클래스는추상클래스화되지않음
해결 1.
class DObject { public DObject next; public DObject() { next = null; public void draw() { System.out.println( DObject draw ); abstract class DObject { public DObject next; 추상클래스로수정 public DObject() { next = null; abstract public void draw(); class Line extends DObject { public void draw() { System.out.println( Line ); class Rect extends DObject { public void draw() { System.out.println( Rect ); class Circle extends DObject { public void draw() { System.out.println( Circle );
다음추상클래스 Calculator 를상속받은 GoodCalc 클래스를구현하라. 결과값은
import java.util.scanner; abstract class Calculator { public abstract int add(int a, int b); // 두정수의합을구하여리턴 public abstract int subtract(int a, int b); // 두정수의차를구하여리턴 public abstract double average(int[] a); // 배열에저장된정수의평균을구해실수로반환 class GoodCalc extends Calculator { public int add(int a, int b) { return a+b; public int subtract(int a, int b) { return a - b; public double average(int[] a) { double sum = 0; for (int i = 0; i < a.length; i++) sum += a[i]; return sum/a.length; public static void main(string [] args) { Calculator c = new GoodCalc(); System.out.println(c.add(2,3)); System.out.println(c.add(2,-3)); System.out.println(c.average(new int [] {2,3,4 ));
인터페이스 (interface) 모든메소드가추상메소드인클래스 인터페이스는상수와메소드만가짐 ( 필드 X) 인터페이스선언 interface 키워드로선언된클래스 ex) public interface SerialDriver{ 인터페이스의특징 메소드선언에 abstract키워드를사용하지않아도됨 인터페이스의속성 public, static, final 으로가정 ( 생략가능 ) but 정의해주는게좋다. 객체생성불가 레퍼런스변수타입으로사용가능
인터페이스를이용하여다중상속구현 클래스는다중상속불가 인터페이스는명세서와같음 구현은블랙박스와같아인터페이스의사용자는구현에대해알필요없음 정의와구현을분리하여, 작업자가다양한구현을할수있음 구현 1 사용자 인터페이스 구현 2
인터페이스간상속가능 인터페이스가인터페이스를상속하여확장된인터페이스작성가능 다중상속허용
인터페이스구현 implements 키워드사용 여러개의인터페이스동시구현가능 상속과구현이동시에가능 interface USBMouseInterface { void mousemove(); void mouseclick(); public class MouseDriver implements USBMouseInterface { // 인터페이스구현 void mousemove() {... void mouseclick() {... // 추가적으로다른메소드를작성할수있다. int getstatus() {... int getbutton() {...
interface USBMouseInterface { void mousemove(); void mouseclick(); interface RollMouseInterface{ void roll(); public class MouseDriver implements USBMouseInterface, RollMouseInterface { void mousemove() {... void mouseclick() {... void roll(){ // 추가적으로다른메소드를작성할수있다. int getstatus() {... int getbutton() {...
다음의클래스를상속받고인터페이스를구현하는 SmartPhone 을작 성하여라
비교 내용 일반메소드포함가능 추상클래스 상수, 변수포함가능 모든서브클래스에공통된메소드가있는경우는추상클래스가적합 모든메소드가추상메소드 인터페이스 상수만포함가능 다중상속지원
인터페이스타입의객체참조변수에인터페이스를포함하는클래스의객체를할당 (!) 가능 단, 인터페이스타입의객체참조변수를통해서는인터페이스에선언된속성만접근가능.
결과는?
다형적참조 (polymorphic reference) 시점에따라다른유형의객체를가리킬수있는참조변수 하나의다형적참조를통해호출되는특정메소드는호출때마다바뀔수있음 상속을통한다형성 참조변수는한객체를가리킬수있고, 다른경우에는상속에의해관련이있는다른객체를참조할수있음
인터페이스를통한다형성 인터페이스의이름이한참조변수의데이터형으로사용가능 인터페이스를참조하는변수는그인터페이스를구현하는어떤클래스의어느객체를참조하기위해사용가능