쌓고 쌓다

[JAVA] 인터페이스(interface) 본문

프로그래밍/java

[JAVA] 인터페이스(interface)

승민아 2021. 12. 28. 20:19

인터페이스(interface)

인터페이스는 interface 키워드를 사용하여 일종의 규격을 정의하는 것이다.

interface Animal
{
    public static final int age = 999; // 상수 필드, public static final 생략 가능
    public abstract void Sound(); // 추상 메소드, public abstract 생략 가능
    public default void Print() // default 메소드, public 생략 가능
    {
        System.out.println("default 메소드");
    }
    
}

 

인터페이스의 구성

멤버 변수(필드)는 만들 수 없다.

default, private, static 메소드들은 모두 인터페이스에 코드가 작성되어 있어야 한다.

클래스에서 인터페이스를 작성할때 public이여야한다.

 

추상 메소드 : public abstract로 정해져 있고, 생략 가능 ( 다른 접근 지정자로 지정 불가능 )

default 메소드 : public으로 고정되어 있으며, 생략 가능

private 메소드 : 인터페이스 내에서만 호출 가능

static 메소드 : 접근 지정자가 생략되면 public이다.

 

인터페이스의 구성 요소

  • 상수 : public static final만 가능. (생략 가능)
  • 추상 메소드 : 추상 메소드는 public만 가능 (public abstract 생략 가능)
  • 추상 메소드가 아닌 메소드들
  • 1. default 메소드
  • 2. private 메소드
  • 3. static 메소드
  • 추상 메소드가 아닌 메소드들은 아래 코드로 자세히 설명
import java.util.Scanner;

interface Test
{
	public static final int MAX=10; // 상수는 public static final만 가능
	
	public abstract void Print(); // 추상메소드 public만 가능 (public abstract 생략 가능)
	
	//추상 메소드가 아닌 메소드들
	// 1. default 메소드 (default는 추상 메소드가 아니다를 의미)
	public default void Print2() // public 접근 지정자만 허용 (생략 가능)
	{
		System.out.println("Hello");
	}
	
	// 2. private 메소드
	private void print3() // 인터페이스 내에 메소드 코드가 작성되어야 함
	{ // private default void print3() -> default는 public만 가능하니 에러
		System.out.println("Hello");
	}
	//private void print4(); private는 구현되어있어야함 이건 에러
	
	// private 메소드를 호출하기 위해선 인터페이스 내에 있는 default메소드로만 호출 가능
	public default void wantPrint3()
	{
		print3();
	}
	
	// 3. static 메소드
	// public private 모두 지정 가능, 호출할때 이 인터페이스 이름으로 메소드 호출만 가능
	// public 생략하고 public static void print4() { } 할시 public으로 인식
	public static void print4()
	{
		System.out.println("Hello");
	}
	
}

public class Extest implements Test{
	
	public void Print()
	{
		System.out.println("Hello");
	}
	
    
	public static void main(String[] args) {
		Extest test1 = new Extest();
		Test.print4();
		// test1.print4(); test1으로 print4 존재하지 않음 불가능
	}

}

 

인터페이스의 구현

interface Animal
{
    public static final int age = 999; // 상수 필드, public static final 생략 가능
    public abstract void Sound(); // 추상 메소드, public abstract 생략 가능
    public default void Print() // default 메소드, public 생략 가능
    {
        System.out.println("default 메소드");
    }

}

class Person implements Animal
{
    public void Sound() // Animal 인터페이스의 추상 클래스 작성
    {
        System.out.println("사람입니다");
    }

    public void Speak() // 추가 메소드 작성 가능
    {
        System.out.println("룰루랄라");
    }
}

인터페이스의 구현은 인터페이스의 모든 추상 클래스를 구현한 클래스를 작성하는 것을 말한다.

inplements 키워드를 사용하여 인터페이스의 모든 추상 메소드를 구현한다.

Speak라는 메소드처럼 추가 메소드의 작성이 가능하며, default 메소드는 그대로 물려받는다.

인터페이스를 inplements로 받으면 모든 추상 클래스를 반드시 구현해야한다.

 

인터페이스의 다중 구현

interface Animal
{
    public static final int age = 999; // 상수 필드, public static final 생략 가능
    public abstract void Sound(); // 추상 메소드, public abstract 생략 가능
    public default void Print() // default 메소드, public 생략 가능
    {
        System.out.println("default 메소드");
    }
}

interface Phone
{
    public abstract void Call();
    
}

class Person implements Animal,Phone // 인터페이스의 다중 구현
{
    public void Sound() // Animal 인터페이스의 추상 클래스 작성
    {
        System.out.println("사람입니다");
    }

    public void Call() // phone 인터페이스의 추상 크랠스 작성
    {
        System.out.println("따르릉 따르릉");
    }

    public void Speak() // 추가 메소드 작성 가능
    {
        System.out.println("룰루랄라");
    }
}

클래스에 다중 구현이 가능한데 콤마를 이용해 구현할 인터페이스를 모두 작성해주면 된다.

 

인터페이스의 상속 ( 인터페이스끼리만 가능 )

인터페이스끼리의 상속은 extends 키워드를 이용한다.

interface Animal
{
    public static final int age = 999; // 상수 필드, public static final 생략 가능
    public abstract void Sound(); // 추상 메소드, public abstract 생략 가능
    public default void Print() // default 메소드, public 생략 가능
    {
        System.out.println("default 메소드");
    }

}

interface Skill extends Animal
{
    public abstract void Dance();
}

Skill 인터페이스에는 Sound, Print age의 멤버를 모두 가지게 된다.

 

인터페이스끼리 상속을 받을 때 다중 상속이 가능하다.

interface Animal
{
    public static final int age = 999; // 상수 필드, public static final 생략 가능
    public abstract void Sound(); // 추상 메소드, public abstract 생략 가능
    public default void Print() // default 메소드, public 생략 가능
    {
        System.out.println("default 메소드");
    }
}

interface Phone
{
    public abstract void Call();
    
}

interface Skill extends Animal,Phone // 인터페이스의 다중 상속
{
    public abstract void Dance();
}

Skill 인터페이스는 Animal, Phone 인터페이스의 다중 상속을 받고 있다.

 

물론 인터페이스의 구현과 클래스의 상속을 함께 가능하다.

interface Animal
{
    public static final int age = 999;
    public abstract void Sound();
    public default void Print()
    {
        System.out.println("default 메소드");
    }
}

interface Phone
{
    public abstract void Call();

}

class Smart
{
    // 비었다.
}


class Person extends Smart implements Animal,Phone // 상속과 인터페이스의 구현
{
    public void Sound()
    {
        System.out.println("사람입니다");
    }

    public void Call()
    {
        System.out.println("따르릉 따르릉");
    }

    public void Speak()
    {
        System.out.println("룰루랄라");
    }
}
Comments