POST

JAVA 다형성 - 인터페이스와 추상클래스

자바에서는 다형성이 필수라면 필수일것이다.

그러므로 다형성에 대해 확실히 알아두고 제대로 사용할줄 알아야 한다.


다형성(Polymorphism)의 성립 조건

- 클래스 계층구조(상속관계)

- 메소드 재정의, 동적 바인딩

- 업케스팅 후  재정의 된 메소드 호출


위의 세가지 조건을 만족해야지 다형성이 성립 되었다고 할 수 있다.


추상클래스란? (abstract class)


일단 일반 적인 클래스는 세부적이며 아주 구체적이다. 

ex) 사자, 독수리, 금붕어 등


반면에 추상 클래스는 일반 클래스에 비해 구체적이지 않으며 약간 추상적이다.

ex) 포유류, 조류, 어류 등


추상클래스는 반드시 하나이상의 추상메소드를 가지며, 객체를 생성할 수 없다.

하지만 슈퍼클래스로 사용할 수는 있으며, 추상메소드를 사용하기 위해서는 반드시 해당 메소드를 재정의 해야만 한다.


추상메소드: 내용이 없는 비어있는 메소드


추상클래스나 추상메소드를 선언하기 위해서는 이름앞에 abstract이라는 키워드를 추가하면 된다.

아래의 코드를 작성하여 보자.

public class Test {

public static void main(String[] args) { // 메인 클래스내의 메인 메소드

Rectangle r = new Rectangle(); // 서브클래스 객체생성

Circle c = new Circle(); // 서브클래스 객체생성

r.draw(); // 서브클래스의 상속받은 메소드 호출

c.draw(); // 서브클래스의 상속받은 메소드 호출


}

}

abstract class Shape { // 추상클래스 (슈퍼클래스)

int x, y;

public void move(int x, int y){

this.x=x;

this.y=y;

}

public abstract void draw(); // 추상메소드

}


class Rectangle extends Shape { // 서브클래스

int width,height;

public void draw() { // 메소드 재정의

System.out.println("사각형 그리기 메소드");

}

}

class Circle extends Shape { // 서브클래스

int radius;

public void draw() { // 메소드 재정의

System.out.println("원그리기메소드");

}

}

위의 코드를 실행하면 아래와 같은 결과가 나타난다.


추상메소드는 단지 슈퍼클래스의 용도이며, 일반메소드도 포함될수 있으며 반드시 추상메소드를 구현하여야한다.


인터페이스란? (Interface)


추상클래스의 극단적인 경우이다.

인터페이스는 추상메소드들로만 이루어져 있으며, 메소드의 선언만 가능하다.

인터페이스의 메소드는 표준화된 공통기능을 가진다.

인터페이스를 사용하기위해서는 implements 키워드를 사용하여야한다.

인터페이스는 서로다른 클래스를 연결시켜주는 연결 장치라고 보면된다.

ex) PUBLIC INTERFACE 인터페이스 이름{}

class 클래스이름 implements 인터페이스 이름{}

 

아래의 코드를 작성하여 보자.


public class Test {

public static void main(String[] args) { // 메인 클래스내의 메인 메소드

/* 각클래스별로 객체생성 */

Television tv = new Television();

Refrigerator r = new Refrigerator();

/* 상속받은 메소드 호출 */

tv.turnOn();

r.turnOn();

tv.turnOff();

r.turnOff();

}

}


interface RemoteControl { // 인터페이스

public void turnOff(); // 메소드선언

public void turnOn(); // 메소드선언

}


class Television implements RemoteControl {

/* 상속받은 메소드 재정의 */

public void turnOff() { System.out.println("TV를 끔니다."); }

public void turnOn() { System.out.println("TV를 켭니다."); }

}


class Refrigerator implements RemoteControl {

/* 상속받은 메소드 재정의 */

public void turnOff() { System.out.println("냉장고를 끔니다."); }

public void turnOn() { System.out.println("냉장고를 켭니다."); }

}

위의코드를 실행하면 아래와 같은 결과가 나타난다.




'JAVA' 카테고리의 다른 글

JAVA GUI객체 스윙 (예제 이용)  (0) 2014.08.31
JAVA 배열에 들어 있는 데이터 정렬하기  (0) 2014.07.09
JAVA 배열(Arrays)의 활용과 팁(tip)  (0) 2014.06.09
JAVA 배열(Arrays)이란?  (0) 2014.06.07
JAVA 상속 - super 키워드  (0) 2014.06.02