위로 아래

추상 메소드와 추상 클래스

추상 메소드 (abstract method)

  1. 구상 메소드(concrete method) : 구체적인 기능을 가지고 있는 메소드.
  2. 추상 메소드 : 구체적인 내용 없이, 호출 방법만 있는 메소드.
  3. 자식 클래스에서 반드시 '구현'해야 한다. (안 하면 오류)
//구상 메소드
public int adder (int n1, int n2) { return n1+n2; }

//추상 메소드
abstract public int adder (int n1, int n2);

 

추상 클래스

  1. 추상 메소드가 있는 클래스
  2. 추상 클래스로는 객체 생성 불가능. (new 불가능)
  3. 일반 필드나 일반 메소드도 가지고 있을 수 있음.
  4. 상속 시, 잊지 말고 추가해야 하는 기능을 암시하는 용도. 자식 클래스에서 구상 메서드로 바꾸고 나서 객체 생성에 사용.
abstract class Unit {   //추상 클래스
	String name;
	int hp;
	abstract void doMove();   // 추상 메소드
}

 

 


인터페이스

기본형

interface Coin {
	int PENNY = 1;   // public static final 생략
    
}

 

특징

  1. 다형성을 위해서 만들어졌다.
  2. 인터페이스는 public 이어야 한다. 안 써도 자동으로 public이 된다.
  3. 상속
    1. 다중 상속 가능. (인터페이스가 여러 개의 부모 인터페이스를 상속 받는다)
    2. 다중 구현 가능. (클래스가 여러 개의 부모 인터페이스를 한 번에 구현한다)
    3. 인터페이스끼리 상속 된다.
    4. 클래스가 인터페이스를 상속 받을 수 있다(인터페이스 구현)
    5. 인터페이스가 클래스를 상속 받을 순 없다.
  4. 인터페이스는 일종의 추상 클래스이다
    1. 인터페이스가 직접 인스턴스를 생성할 수는 없다.
    2. 생성자도 가질 수 없다
    3. 사용하려면 인터페이스 구현 클래스를 만들어야 한다.
  5. 타입 변환
    1. 부모 클래스처럼 타입(자료형)으로는 사용될 수 있다.
    2. 메소드의 매개변수 타입이 인터페이스이면, 해당 인터페이스의 어떠한 구현 객체(해당 인터페이스 타입인 구현 클래스 객체들)도 사용할 수 있다. 
  6. 추상 메소드와 상수만 가지고 있다.
    1. 모든 필드는 public static final이어야 한다. 상수니까 (생략 가능. 컴파일러가 자동으로 추가.)
    2. 모든 메소드는 public abstract이어야 한다. 추상 메소드니까 (생략 가능. 컴파일러가 자동으로 추가.)
  7. 익명 구현 객체(annonymous class의 instance)를 사용할 때에는, interface로 객체를 생성한 것 같은 표현법을 사용할 수 있다.
  8. 점선 하얀 화살표 이용

 

인터페이스 상속, 구현

//상속
interface 자식인터페이스 extends 부모인터페이스{
}

//구현
class 자식클래스 implements 부모인터페이스 {
}

 

 

 


인터페이스 구현 클래스

인터페이스 구현 클래스 기본형

interface A {}   // 인터페이스 A

class C1 implements A {}   // 인터페이스 A 구현하는 C1 클래스

특징

  1. 클래스에서 인터페이스 구현 : implements 키워드 사용하여 구현할 인터페이스를 지정한 후, 추상 메소드를 모두 오버라이드하여 내용을 완성.
  2. 구현 클래스의 객체를 생성할 시, 자료형을 부모 인터페이스로 정할 수 있다. A obj = new C1();
  3. 디폴트 메소드, 스태틱 메소드
    1. 인터페이스는 원래 구현된 메소드를 못 갖는데, 디폴트 메소드, 스태틱 메소드는 인터페이스 안에서 구현된 메소드로 존재할 수 있다.  (자바8부터)
    2. 이미 구현 중인 클래스들이 있는 인터페이스에 추상 메소드를 추가할 경우, 구현 중인 클래스에서도 일일이 추상 메소드 구현을 다시 해주어야 한다. 그러나 디폴트 메소드를 추가하면, 구현 중인 클래스도 인터페이스의 디폴트 메소드를 상속 받으므로 다시 구현해 줄 필요가 없다.
    3. 디폴트 메소드 : 인스턴스 메소드로, 오버라이딩이 가능하고, 객체 생성 후 호출 가능.
    4. 스태틱 메소드 : 스태틱(정적) 메소드로, 오버라이딩 불가능하고, 객체 생선 전 구현되지 않은 인터페이스만 있어도 호출 가능.

 

인터페이스 기본 문법 종합 예시

더보기
----------------------부모 인터페이스 Controllable.java 파일-----------------------
public interface Controllable {
	default void repair() { 
		show("장비를 수리한다.");
        // default 메소드. class에서 구현해주지 않아도 자동 상속되어 class의 객체가 쓸 수 있다.
	}
	
	static void reset() {
		System.out.println("장비를 초기화한다.");
        // static 메소드. class에서 구현할 수 없다. 인터페이스를 호출해서 바로 쓸 수 있다.
	}
	
	private void show(String s) {
		System.out.println(s);
        // 자바 9부터 가능.
	}
	
	void turnOn();   // 추상 메소드. 구현 클래스에서 구현해주어야만 한다.
	void turnOff();   // 추상 메소드. 구현 클래스에서 구현해주어야만 한다.
}
----------------------자식 인터페이스 RemoteControllable.java 파일-----------------------
public interface RemoteControllable extends Controllable{
	void remoteOn ();
	void remoteOff ();
}
----------------------인터페이스 구현 클래스 Computer.java 파일-----------------------
public class Computer implements Controllable {
	public void turnOn() {
		System.out.println("컴퓨터를 켠다.");
	}
	public void turnOff() {
		System.out.println("컴퓨터를 끈다.");
	}
}
----------------------인터페이스 구현 클래스 Computer.java 파일-----------------------
public class TV implements Controllable{
	@Override
	public void turnOn() {
		System.out.println("TV를 켠다.");
	}
	@Override
	public void turnOff() {
		System.out.println("TV를 끈다.");
	}
}
---------------------부모 인터페이스 Portable.java 파일-----------------------
public interface Portable {
	void inMyBag();
}
----------------------인터페이스 구현 클래스 Notebook.java 파일-----------------------
public class Notebook extends Computer implements Portable{
	public void inMyBag() {
		System.out.println("노트북은 가방에 있다.");
	}
	
	public void turnOn() {
		System.out.println("노트북을 켠다.");
		System.out.println("노트북을 끈다.");
	}
}
----------------------메인 클래스 ControllableDemo.java 파일-----------------------
public class ControllableDemo {
	public static void main(String[] args) {
		TV tv = new TV ();
		Computer com = new Computer();
		Notebook n = new Notebook();
		
		tv.turnOn();  // 결과 TV를 켠다.
		tv.turnOff();  // 결과 TV를 끈다.
		tv.repair();  // default 메소드. 결과 장비를 수리한다.
		com.turnOn();  // 결과 컴퓨터를 켠다.
		com.turnOff();  // 결과 컴퓨터를 끈다.
		com.repair();  // default 메소드. 결과 장비를 수리한다.
		n.turnOn();  // 결과 노트북을 켠다.
		n.turnOff();  // 결과 노트북을 끈다.
		n.inMyBag();  // 노트북은 가방에 있다.
		
		Controllable.reset();   // static 메소드. 인터페이스에서 직접 호출해야한다.
		// 결과 장비를 초기화한다.
	}
}