[Java] 인터페이스

rara_kim·2022년 6월 12일
0

Java

목록 보기
11/39

인터페이스(Interface)

자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 된다.
하지만 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않는다.

자바에서는 인터페이스(interface)라는 것을 통해 다중 상속을 지원하고 있다.
인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미한다.

추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함하지만, 인터페이스(interface)는 오로지 추상 메소드상수만을 포함한다.

자바8에 와서는 default 메소드static 메소드도 추가로 지원하고 있다.

💡인터페이스 멤버의 제약사항
1. 모든 멤버변수는 public static final이어야 하며, 생략할 수 있다.
2. 모든 메소드는 public abstract이어야 하며, 생략할 수 있다. (자바8 부터 static 메소드와 디폴트 메소드는 예외)

  접근제어자 interface 인터페이스이름 {
      public static final 타입 상수이름 =;
      public abstract 타입 메소드이름(매개변수);
          ... 
  }
  
  
  //인터페이스의 구현
  calss 클래스이름 implements 인터페이스이름 {
          ...
  } 

상속과 인터페이스 동시사용

상속(inheritance)과 인터페이스(interface)의 동시 사용으로 다중 상속과 같은 효과를 볼 수 있다.

interface School {
    public static final int MAX_CLASS = 20;
    public static final int MAX_PERSON_PER_CLASS = 40;
    public abstract void printSchool();
}


class Student implements School {
    public void printSchool() {
        System.out.println("00 University");
    }
}


class Person {
    public String name;
    public void printName() {
        System.out.println("Name: " + name);
    }
}


class Student2 extends Person implements School {
    Student2(String name) {
        this.name = name;
    }

    public void printSchool() {
        System.out.println("11 University");
    }
}


public class Main {
    public static void main(String[] args) {
		//인터페이스 기본 사용
        Student s1 = new Student();
        s1.printSchool();                             //00 University 출력
        System.out.println(s1.MAX_CLASS);             //20 출력
        System.out.println(s1.MAX_PERSON_PER_CLASS);  //40 출력


		//다중 상속처럼 사용하기
        Student2 s2 = new Student2("A");
        s2.printSchool();   //11 University 출력
        s2.printName();     //Name: A 출력
    }
}
profile
느리더라도 꾸준하게

0개의 댓글