개발_웹/Java

Java | 추상클래스(abstract) vs 인터페이스(interface)

zuyo 2017. 8. 15. 22:55
반응형

추상 클래스

  • abstract 선언한 클래스
  • 추상 메소드를 포함

 

추상 메소드

  • 선언은 되어 있으나 코드가 구현되어 있지 않은 껍데기만 있는 메소드
  • abstract 키워드와 함께 타입, 이름, 매개변수만 선언
  • 자식클래스에서 오버라이딩하여 사용

 

추상 클래스의 특징

  • 객체를 생성 불가 (선언은 가능 ex DObject obj;)
  • 추상메소드 뿐만이 아니라 일반 메소드 포함 가능

 

추상 클래스의 상속

추상 클래스를 상속받은 클래스도 추상 메소드를 전부 오버라이딩 하지 않으면 추상 클래스가 된다.

 

예시

// 추상 클래스
abstract class DObject {
	abstract public void draw();
}

// 추상 클래스를 상속한 클래스1
class Line extends DObject {
	public void draw() {
		System.out.println("Line draw");
	}
}

// 추상 클래스를 상속한 클래스2
class Circle extends DObject {
	public void draw() {
		System.out.println("Circle draw");
	}
}

class Memo {
	public static void main(String args[]) {
		DObject obj = new Line(); // 상속 클래스1 객체 생성 (업캐스팅)
		obj.draw();

	DObject obj2 = new Circle(); // 상속 클래스2 객체 생성 (업캐스팅)
	obj2.draw();
	}
}

결과

Line draw

Circle draw

 


인터페이스

  • 추상 클래스와 유사
  • interface 키워드를 사용하여 선언

 

특징

  • 메소드는 추상 메소드, 필드는 상수만으로 구성된다. (따라서 abstract 키워드 생략)
  • 모든 메소드는 public 이며 생략이 가능

void print(); = public abstract void print();

  • 상수도 public static final 생략 가능
  • 객체 생성 불가
  • 다중 상속 허용
  • 인터페이스들 끼리 상속이 가능(extends), 역시 다중 상속 가능

 

JDK 8부터..

  • default 메소드 (abstract 메소드가 아니라 일반 메소드처럼 쓸 수 있음)
  • static 메소드 포함 가능

 

인터페이스의 상속

  • JAVA는 클래스의 다중 상속은 지원하지 않으나 인터페이스의 다중 상속은 허용
  • 프로그램 수정 시 기존 인터페이스를 변경하는 것은 기존 인터페이스에 맞춰 작성된 코드에 문제를 발생시킬 수 있으므로, 인터페이스 수정이 필요한 경우엔 기존 인터페이스를 상속받아 새로운 인터페이스를 만든다.

 

인터페이스의 구현(상속)

  • 클래스에서 인터페이스의 추상메소드를 구현하는 것.
  • implements 키워드를 사용하여 클래스를 작성

 

※ 복수의 인터페이스를 상속하는 다중상속(다중구현) 시에는 상속받은 각 인터페이스의 모든 추상 메소드를 구현해줘야 한다.

 

※ 클래스 상속과 같이 쓸 수 있다

ex) public class SmartPhone extends MobilePhone implements PDA, MP3

 

예시

interface MobilePhone {
	boolean sendCall();
	boolean receiveCall();
	boolean sendSMS();
	boolean receiveSMS();
}

interface MP3 {
	void play();
	void stop();
}

public class Memo implements MobilePhone, MP3 { 
	/* 상속받은 인터페이스의 모든 메소드를 구현 */
	public boolean sendCall() {
		return false;
	}

	public boolean receiveCall() {
		return false;
	}

	public boolean sendSMS() {
		return false;
	}

	public boolean receiveSMS() {
		return false;
	}

	public void play() {
		return;
	}

	public void stop() {
		return;
	}
}

 

인터페이스와 추상클래스의 비교

 

추상클래스

인터페이스 

추상 메소드, 일반 메소드 포함 가능

추상 메소드만 포함 가능

상수, 변수 필드 포함 가능

상수 필드만 포함 가능

단일 상속만 가능

다중 상속 지원

 

추상클래스

추상클래스를 상속받는 서브클래스들은 부모인 추상클래스로부터 기능(일반 메소드, 변수)을 유전받고, 추가할 수 있다. 따라서 서브클래스들이 공통적인 요소를 필요로 한다면 추상클래스

 

인터페이스

클래스의 틀을 짜는게 목적이거나 다중상속을 필요로 한다면 인터페이스

반응형