SyntaxHighlighter.all(); [자바] 객체지향 프로그래밍Ⅱ - 인터페이스(Interface) :: 게을러지고 싶어 부지런한 개발자

인터페이스(Interface)란?


-구현된 것은 아무 것도 없고 밑그림만 그려져 있는 '기본 설계도'


-추상메서드와 상수만을 멤버로 가질 수 있음

(원래는 인터페이스의 모든 메서드는 추상메서드이어야 하는데, JDK1.8부터 인터페이스에 static 메서드와 default 메서드의 추가를 허용하는 방향으로 번경됨!!!!) 


-인터페이스에 선언된 모든 추상메서드들은 클래스에서 구현되어야만 함 

(즉, 인터페이스에서는 기본 설계도로써 선언만 해놓고,인터페이스 설계도의 구현은 해당 인터페이스를 상속받는 클래스별로도 작성함) 

 


인터페이스 작성 

-interface를 키워드 사용


1
2
3
4
interface 인터페이스 이름 {
    public static final 타입 상수이름 = 값;
    public abstract 메서드이름(매개변수목록);
}
cs


-모든 멤버변수는 public static final이며, 이를 생략 가능

-모든 메서드는 public abstract 이며, 이를 생략 가능


생략된 제어자는 컴파일 시에 컴파일러가 자동적으로 추가해주므로 에러 발생 X 




인터페이의 상속

인터페이스의 상속 : 클래스가 인터페이스를 구현한다는 의미의 'implements' 키워드 사용  

 - 인터페이스는 인터페이스로부터만 상속 받을 수 있으며, 클래스와 달리 다중상속 가능

 - 클래스의 상속과 마찬가지로 자손 인터페이스는 조상 인터페이스의 정의된 멤버를 모두 상속 받음 

-인터페이스를 상속받는 클래스는 상속과 구현을 동시에 할 수 있음 


(설명)  

-->'Seolhyun 클래스는 Person클래스를 상속받으며, 동시에 Character인터페이스를 구현한다.'

 

1
2
3
4
5
class Seolhyun extends Person implements Character {

    public void move(int x, int y) {
        System.out.println("설현이 움직입니다.");
    }
}
cs




예시1) 장난감 인터페이스 



Toy.java  (인터페이스) : 장난감 작업 명세서만 있는 껍데기

1
2
3
4
5
6
7
public interface Toy {
    
    public void walk();
    public void run();
    public void alarm();
    public void light();    
}
cs



ToyAirplane.java (클래스) : 인터페이스에서 선언 된 메소드들을 ToyAirplane 클래스 성격에 맞게 구현 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class ToyAirplane implements Toy {
 
    @Override
    public void walk() {
        System.out.println("The airplane can walk");        
    }
 
    @Override
    public void run() {
        System.out.println("The airplane can not run");
    }
 
    @Override
    public void alarm() {
        System.out.println("The airplane has alarm function");
        
    }
 
    @Override
    public void light() {
        System.out.println("The robot has no light function");                        
    }
}
cs


ToyRobot.java (클래스) : 인터페이스에서 선언 된 메소드들을 ToyRobot 클래스 성격에 맞게 구현 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class ToyRobot implements Toy {
 
    @Override
    public void walk() {
        System.out.println("The robot can walk");
    }
 
    @Override
    public void run() {
        System.out.println("The robot can not run");        
    }
 
    @Override
    public void alarm() {
        System.out.println("The robot has alarm function");        
    }
 
    @Override
    public void light() {
        System.out.println("The robot has light function");                
    }
        
}
cs


Mainclass.java (실행하는 메인클래스) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainClass {
 
    public static void main(String[] args) {
        //둘 다 Toy로 동일한 데이터 타입 가진 객체 생성 
        Toy robot = new ToyRobot();
        Toy airplane = new ToyAirplane();
        
        //객체를 참조하는 레퍼런스를 배열에 담기 
        Toy toys[] = {robot, airplane};
 
        for (int i = 0; i < toys.length; i++) {
            toys[i].walk();
            toys[i].run();
            toys[i].alarm();
            toys[i].light();
            System.out.println();
        }
    }
}
cs



실행 결과

 The robot can walk

The robot can not run

The robot has alarm function

The robot has light function


The airplane can walk

The airplane can not run

The airplane has alarm function

The robot has no light function



인터페이스의 디폴트(default) 메서드와 static 메서드 

원래는 인터페이스에 메세드 선언 시 추상 메서드 선언만 가능했으나, JDK1.8부터는 디폴트 메소드 & static 메세드 추가 가능.


 왜 필요할까? 

인터페이스가 변경 되면 인터페이스를 구현(즉 implement)하는 모든 클래스들은 변경되거나 새로 추가된 해당 메서드들을 모두 구현해야 하는 문제 있어 번거로움. 이를 해결하기 위해 디폴트 메서드와 static 메서드 등장!  


예시)

-원래 인터페이스에는 추상메소드들 선언만 해주고, 해당 인터페이스를 구현하는 클래스에서 따로 추상메소드들을 구현해야 하나, default메소드 & static 메소드들은 선언 및 구현 함께

-따라서 클래스에도 또 다시 구현 할 필요는 없음 


-예시에서 default 메소드와 static 메소드 호출방식에 유의해서 보길 바람

인터페이스에서 정의한 static메소드는 반드시 인터페이스명.메소드 형식으로 호출해야한다


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
27
28
29
30
31
32
33
34
35
36
37
    //Calculator 인터페이스
    public interface Calculator {
        public int plus(int i, int j);           //추상메소드 선언만  
        public int multiple(int i, int j);       //추상메소드 선언만 
        
        default int exec(int i, int j){            //default 메소드는 선언 및 구현 
            return i + j;
        }
        public static int exec2(int i, int j){   //static 메소드는 선언 및 구현 
            return i * j;
        }
    }
    
    //Calculator인터페이스를 구현한 MyCalculator클래스
    public class MyCalculator implements Calculator {
        @Override
        public int plus(int i, int j) {
            return i + j;
        }
        @Override
        public int multiple(int i, int j) {
            return i * j;
        }
    }
 
    //인터페이스에서 정의한 static메소드는 반드시 인터페이스명.메소드 형식으로 호출해야한다.  
 
    public class MyCalculatorExam {
        public static void main(String[] args){
            Calculator cal = new MyCalculator();
            int value = cal.exec(510);  //default메소드 호출 
            System.out.println(value);
 
            int value2 = Calculator.exec2(510);  //static메소드 호출 
            System.out.println(value2);
        }
    }
cs


인터페이스의 장점

인터페이스를 사용하면 다중 상속이 가능할 뿐만 아니라 다음과 같은 장점을 가질 수 있습니다.

 

1. 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능합니다.

2. 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있으므로, 개발 시간을 단축할 수 있습니다.







+ Recent posts