본문 바로가기
Java/Java 기초문법

[JAVA 기초] 자바 인터페이스 (interface)

by dev수니 2021. 4. 9.
반응형

 

 

인터페이스는 abstract, final과 함께 대표적인 규제이다.
어떤 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의 메소드를 구현해야 한다. 만약 인터페이스에서 강제하고 있는 메소드를 구현하지 않으면 해당 파일은 컴파일조차되지 않는다.

 

 

인터페이스의 본질 "psf,pa"
1) 모든 변수는, public static final이다.
2) 모든 메서드는, public abstract이다.
----> 즉, 인터페이스는 본질상 "상수 + 추상메서드"의 구성이다.

 

 

 

인터페이스를 사용하는 경우 

"A프로그래머와 B프로그래머가 하나의 프로젝트를 진행할 때, A와 B가 서로의 클래스가 완성되지 않았어도 구현해야 할 기능들을 미리 협의하고 반환 타입까지를 정해놓으면(=인터페이스 작성), 서로의 작업 상황과 무관하게 각자 작업을 시작할 수 있다. 바로 이런 약속 같은 것이 '인터페이스' 이다."

 

 

 

 


 

 

 1  인터페이스 (interface)

 

 

다음 예제를 통해 인터페이스 변수의 본질을 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package interface_;
 
interface Inter {
    int num = 7;
   void m1();  // 인터페이스 내 메서드 정의X
}
class Int1 implements Inter{
    public void m1() {}        // 메서드 오버라이딩, public 을 붙이지 않을 경우 에러
}
public class Interface1 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Int1 i1 = new Int1();
        // i1.num = 3;        // final 변수
        // Inter.num = 3;    // final 변수
        System.out.println(i1.num + " " + Inter.num);
    }
}
cs
7 7

인터페이스에서 변수 num과 메서드 m1을 정의해주고 줄7에서 인터페이스를 구현하는 객체를 생성해주었다. 그리고 줄8에서 인터페이스 메서드를 오버라이딩하여 재정의해주었다. 인터페이스 메서드를 오버라이딩 해주지 않으면 오류가 발생한다. 또한 public 도 붙이지 않으면 에러가 발생한다.

 

그리고 줄13에서 인터페이스를 구현하는 객체 Int1의 인스턴스를 생성시켜주었고 줄14와 15를 보면 인터페이스 변수가 final 변수인것을 확인할 수 있다. 그리고 줄16에서 Inter.num에 접근가능한 것을 보고 static 변수인것도 확인 할 수 있다.

 

따라서 인터페이스 변수static final , 메서드public 의 특성을 가진 것을 확인할 수 있다. 

 

 

 

 

 

 

 

 

Ex 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package interface_;
 
interface Animal{
    void eat();        // 메서드 임의로 선언
    void travel();
}
class Mamal implements Animal{
    public void eat() {            // 메서드 오버라이딩 public 메서드
        System.out.println("Mamal eats.");
    }
    public void travel() {
        System.out.println("Mamal travels.");
    }
}
 
public class Inter_pu {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Mamal obj = new Mamal();
        obj.eat();
        obj.travel();
    }
}
cs
Mamal eats.
Mamal travels.

인터페이스 Animal 을 구현하는 객체 Mamal을 선언 후 Animal 내의 메서드 eat() 과 travel()을 오버라이딩해주었다. 인터페이스 메서드public 이기때문에 재정의시 public을 붙여주었다.

 

 

 

 

 

 

 

Ex 예제

인터페이스의 static 메서드를 실행하는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
package interface_;
interface i7 {
    void m1();   // p.a.
    static void m2() {    // static 메서드 선언
        System.out.println("i7 의 스태틱 메서드 m2 실행됨.");
    }
}
public class Interface_StaticM {
    public static void main(String[] args) {
        i7.m2();
    }
}
cs
i7 의 스태틱 메서드 m2 실행됨.

static 이기 때문에 인스턴스 생성하지 않아도 메모리상에 존재하여 메인에서 호출되는 모습이다.

 

 

 

 

 


 

 

 2  디폴트 메서드 (default method)

 

디폴트 메서드는 자바8버전 이후 추가된 것으로, 인터페이스를 구현하는 클래스는 자동으로 이 메서드를 갖게 된다.

 

Ex 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package interface_;
 
interface i2 {
    void m2();   // p.a.
    default void m3() {     // default 메서드
        System.out.println("디폴트 메서드 m3().");
    }
}
class A2 implements i2 {
    public void m2() {
        System.out.println("m2().");
    }
}
public class Interface_defaltm {
    public static void main(String[] args) {
        A2 obj = new A2();
        obj.m2();
        obj.m3();
    }
}
cs
m2().
디폴트 메서드 m3().

 

 

 

 

 


 

 

 3  여러 인터페이스 구현

 

인터페이스를 구현하는 클래스여러 인터페이스를 구현할 수 있다. 다음 예제를 통해 확인하자.

 

 

Ex 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package interface_;
 
interface I {
    void z();
}
interface E {
    void x();
}
class A implements I {
    public void z() { System.out.println("I를 상속받은 클래스 C"); }
}
class B1 implements I,E {    // 여러 인터페이스 구현가능. 메서드 z()와 x()를 모두 구현해야함.
    public void x() { System.out.print("E를 상속받은 클래스 E1 & ");}
    public void z() { System.out.print("I를 상속받은 클래스 B1");}
}
 
public class Interfa_Mul {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        A a1 = new A();
        B1 b1 = new B1();
        a1.z();
        b1.x();
        b1.z();
    }
}
cs

 

I를 상속받은 클래스 C
E를 상속받은 클래스 E1 & I를 상속받은 클래스 B1

 

위와 같이 줄12에서 인터페이스 I와 E를 구현하는 클래스를 생성하였다. 두 인터페이스를 구현하므로 메서드 z()와 x()모두 구현해야 에러가 발생하지 않는다.

 

 

 

 

 

 

 


 

 

 4  인터페이스의 상속

 

인터페이스는 인터페이스를 상속할 수 있다. 다음 예제를 통해 확인하자.

 

Ex 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package interface_;
 
interface I3{
    String a = "안녕하세요";
    public void x(int a, int b);
}
interface I4 extends I3{
    public void z();
}
class C4 implements I4{
    public void x(int a, int b) { System.out.println(a*b+"= a*b & I3 상속받았습니다."); }
    public void z() { System.out.println("I4 상속받았습니다."); }
}
 
public class Interface_Inhe {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        C4 c4 = new C4();
       c4.x(5,7);
       c4.z();
    }
}
cs
35=a*b & I3 상속받았습니다.
I4 상속받았습니다.

인터페이스 I3생성 후 그 안에 변수 a와 매개변수를 a,b를 갖는 메서드 x() 를 선언해주었다. 그리고 줄7에서 인터페이스I3을 상속하는 인터페이스 I4를 생성하고 그 안에 메서드 z() 를 선언해주었다.

 

그리고 인터페이스 I4를 구현하는 클래스 C4를 생성해주었다. C4 클래스가 인터페이스 I4를 구현하고 I4는 인터페이스 I3를 상속받기 때문에 C4 클래스에서는 메서드 x()z()를 모두 구현해주어야 한다.

 

따라서 줄11과 12에서 x()와 z()를 모두 구현해주었다. 그리고 메서드 x()는 인터페이스에서 매개변수를 두개 갖기 때문에 메서드 오버로딩이 불가능하다. ( ****개변수의 갯수를 변경할 수 없음.**** )

 

 

 

 

 

 

반응형

댓글