Java interface

김국민·2025년 3월 6일

인터페이스란?

인터페이스란 일종의 추상 클래스이다
추상클래스보다 추상화 정도가 높다.
추상 클래스와 다르게 오직 상수와 추상 메서드만 멤버로 가질 수 있다

추상클래스가 부분적으로 완성된 미완성 설계도라면 인터페이스는 구현된 것은 없고 밑그림만 그려져 있는 기본 설계도라 할 수 있다

인터페이스 선언하기

interface 인터페이스 이름{
public static final 상수이름 = 값;
public abstract 메서드이름(매개변수);
}

인터페이스 멤버들은 제약사항이 있다

  • 모든 멤버 변슈는 public static final 생략가능
  • 모든 메서드는 public abstract 생략 가능
    생략하면 컴파일러가 자동으로 추가해줌

인터페이스는 클래스와 다르게 다중상속이 가능

interface Moveable{
	void move(int x, int y);
}

interface Attackable{
	void attack(Unit u);
}

interface Fightable extends Movable, Attackable{}

인터페이스도 추상클래스처럼 그 자체로 인스턴스를 생성할 수 없으며 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 하는데 추상클래스와 다른점은 extends가 아니라 implements를 사용한다

abstract class Fighter implements Fightable{
	public void move(int x, int y)
}

class Fighter extends Unit implements Fightable{
	public void move(int x, int y){}
    public void attack(Unit u){}
}

인터페이스 다중상속

다중상속은 장점도 있지만 단점이 더 크다고 판단해서 자바에서는 다중상속을 허용하지 않는다. 인터페이스를 이용하면 다중 상속이 가능하지만 인터페이스로 다중상속을 구현하는 경우는 거의 없다.

자바에서는 한쪽만 상속을 받고 나머지 한 쪽은 클래스 내에 포함시켜 내부적으로 인스턴스를 생성해서 사용한다

public class Tv{

	protected boolean power;
    protected int channel;
    protected int volume;
    
    public void power(){//생략}
    public void channelUp(){//생략}
    public void channelDown(){}
    public void volumeUp(){}
    public void volumeDown(){}
    
}

public class VCR{
	protected int counter;
    public void play(){}
    public void stop(){}
    public void reset(){}
    public int getCounter(){}
    public void setCounter(){}
}


public interface IVCR(){
	void play();
    void stop();
    viud reset();
    int getCounter();
    void setCounter();
}

IVCR 인터페이스를 구현하고 Tv클래스로부터 상속받는 TVCR클래스를 작성한다. 이때 VCR클래스 타입의 참조변수를 멤버변수로 선언하고 IVCR 인터페이스의 추상메서드를 구현하는데 사용한다.

public class TVCR extends Tv implements IVCR{
	VCR vcr = new VCR();
    public void play(){
    	vcr.play()
        }
        ...이하생략

인터페이스 장점

  1. 개발시간 단축

  2. 표준화 가능

  3. 서로 관계없는 클래스들에게 관계 맺어줌

  4. 독립적인 프로그래밍 가능

인터페이스의 본질적인 측면..

  • 클래스를 사용하는 쪽, 제공하는 쪽 이 있다
  • 메서드를 사용하는 쪽에서는 사용하려는 메서드의 선언부만 알면 된다

이 두 내용을 기억하자


클래스 A 클래스 B가 있다
클래스 A는 클래스 B의 인스턴스를 생서하고 메서드를 호출한다

이 경우 B가 이미 작성되어있어야 한다
또 B의 메서드가 변경되면 A도 변경되어야 한다.

-> 한쪽이 변경되면 다른쪽도 변경되어야 한다는 단점

만약 A가 B를 직접 호출하지 않고 인터페이스를 매개체로 해서 B의 메서드에 접근한다면 B에 변경사항이 있어도 A는 영향받지 않는다.

interface I{
	void methodB();
}

class B implements I{
	public void methodB(){
   	//생략
   }
}

이렇게 하면 A에서는 B를 사용하지 않고 메서드를 호출할 수 있다.

profile
개발지망생

0개의 댓글