본문 바로가기

Java/개념정리

객체지향개념(4)_추상클래스&메서드, 인터페이스

1. 추상 클래스

  • 클래스가 설계도라면 추상 클래스는 미완성 설계도
  • 추상메서드를 포함하고 있는 클래스
  • 인스턴스 생성 불가능
  • 다른 클래스를 작성하는 데 도움을 줄 목적으로 작성된다.
    • 여러 클래스에 공통적으로 사용될 수 이쓴ㄴ 추상 클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아 만든다.

2. 추상 메서드

  • 선언부만 있고 구현부가 없는 메서드
  • 일반 메서드가 추상메서드를 호출할 수 있다.
  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용
  • 추상클래스를 상속받는 자손클래스에서 추상메서드의 구현부를 완성해야 한다.

3. 인터페이스

  • 일종의 추상클래스 (추상클래스 보다 추상화 정도가 높다.)
  • 실제 구현된 것이 전혀 없는 기본 설계도
  • 추상 메서드와 상수만을 멤버로 가질 수 있다. (8버전 부터는 디폴트 메서드 추가 가능)
  • 인스턴스를 생성할 수 없고 클래스 작성에 도움을 줄 목적으로 사용된다.
  • 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.
  • 다중 상속이 허용된다.
모든 멤버변수는 public static final이 생략되어 붙는다.
모든 메서드는 public abstarct가 생략되어 붙는다.

다형성

  • 인스턴스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
  • 인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.
    • 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 사용한다.
  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
    • 인터페이스를 구현한 클래스의 인스턴스를 반환한다.
interface Repairable {}
class GroundUnit extends Unit {
	GroundUnit(int hp) {
		super(hp);
	}
}


class Unit {
	int hitPoint;
	final int MAX_HP;
	Unit(int hp) {
		MAX_HP = hp;
	}

}

class Tank extends GroundUnit implements Repairable {
	Tank() {
		super(150);		
		hitPoint = MAX_HP;
	}

	public String toString() {
		return "Tank";
	}
	//...
}

class Marine extends GroundUnit {
	Marine() {
		super(40);
		hitPoint = MAX_HP;
	}
	//...
}

class SCV extends GroundUnit implements Repairable{
	SCV() {
		super(60);
		hitPoint = MAX_HP;
	}

	void repair(Repairable r) {
		if (r instanceof Unit) {
			Unit u = (Unit)r;
			while(u.hitPoint!=u.MAX_HP) {

				u.hitPoint++;
			}
	}	

}
class RepairableTest{
	public static void main(String[] args) {
		Tank tank = new Tank();
		Marine marine = new Marine();
		SCV	scv = new SCV();

		scv.repair(tank);	
		scv.repair(dropship);
//		scv.repair(marine);	 marine 클래스는 repairable 인터페이스를 구현하지 않아 사용불가
	}
}

 

추상 클래스와 인터페이스의 차이점

8버전 이후 인터페이스 또한 구현된 메소드를 가질 수 있다. 기능은 비슷한 반면 필요에 의해 둘을 구분해서 사용한다.

  인터페이스 추상 클래스
public 이외의 다른 접근 제어자가 필요할 때   o
다중 상속이 필요할 때 o  
관련성이 높은 클래스 간에 코드를 공유할 때   o

자바의 정석 7장