인터페이스란 무엇인가? 


인터페이스 예제를 들어 설명하겠다.


1. 유저는 게임을 한다.

2. 유저는 게임들 중의 하나인 오버워치를 플레이 한다.

3. 유저는 게임들 중의 하나인 스타크래프트를 플레이 한다.

4. 오버워치와 스타크래프트는 게임이다.


다음과 같이 정의된 내용을 만들어 보려고 한다.


먼저 OverWatch, StarCraft, User 라는 java파일의 클래스를 만들자.


1
2
3
4
// OverWatch.java
public class OverWatch extends User{
    
}
cs


1
2
3
4
// StarCraft.java
public class StarCraft extends User{
 
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// User.java
public class User {
    
    public static void main(String[] args) {
        
        User user = new User();
        OverWatch overwatch = new OverWatch();
        StarCraft starcraft = new StarCraft();
        
        user.play(overwatch);
        user.play(starcraft);
        
    }
    
    public void play(OverWatch overwatch){
        System.out.println("Game is overwatch / FPS");
    }
    
    public void play(StarCraft starCraft){
        System.out.println("Game is starcraft / Strategy Simulation");
    }
}
cs





User클래스에서 객체를 생성하고

play라는 메소드로 생성한 객체를 argument로 넣는다.


현재는 오버워치와 스타크래프트 딱 2가지만 게임을 추가했지만,


배틀그라운드, 리그오브레전드 등등 여러가지 게임을 추가한다고 해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void play(OverWatch overwatch){
    System.out.println("Game is overwatch / FPS");
}
 
public void play(StarCraft starCraft){
    System.out.println("Game is starcraft / Strategy Simulation");
}
 
public void play(BattleGround battleground){
    System.out.println("Game is battleground / FPS");
}
 
public void play(LOL lol){
    System.out.println("Game is lol / AOS");
}
cs



그러면 다음과 같이 메소드에 대한 인자값이 바뀌어 들어간다는 것을 확인할 수 있다.


게임이라는 객체가 하나하나 추가될때 마다 argument를 계속해서 바꿔주며 메소드에 추가해야하는 문제점이 발생한다.


어떤 게임이 추가되던 argument를 Game이라는 인자로 넣어서 메소드 인자를 다음과 같이 공통으로 빼버리자.


1
2
3
public void play(Game game){
    System.out.println(game.getGame()+" / "+game.getGameType());
}
cs


Game을 공통 인자로 빼기위해선 인터페이스를 생성하여 사용하면 된다.


1
2
3
4
public interface Game {
    public String getGame();
    public String getGameType();
}
cs


인터페이스는 다음과 같이 선언으로 사용할 수 있고

인터페이스 안에 메소드는 body가 없는 선언형태이다.


그럼 이 메소드의 내용은 어디서 알 수 있을까?


이 메소드의 내용은 인터페이스를 상속받는 java파일( OverWatch.java, StarCraft.java )에서 선언하여 채워주면 되는것이다.


인터페이스를 상속받는 모든 java파일은 인터페이스 안의 메소드를 상속받는다.


현재 인터페이스의 메소드는 getGame(), getGameType() 이다.


이 메소드를 인터페이스를 상속받는 OverWatch.java, StarCraft.java 에서 메소드에 대한 내용을 채워줘야 한다는 것이다.


각 java파일에서 인터페이스를 상속받는 방법은 implements이다. implements Game을 선언하면 Game 인터페이스를 상속받는 다는 뜻이다.


그럼 이 파일에 메소드의 내용을 넣어보자.



1
2
3
4
5
6
7
8
9
10
11
// OverWatch.java
public class OverWatch extends User implements Game{
    
    public String getGame(){
        return "Game is OverWatch";
    }
 
    public String getGameType() {
        return "FPS";
    }   
}
cs



1
2
3
4
5
6
7
8
9
10
11
// StarCraft.java
public class StarCraft extends User implements Game{
 
    public String getGame() {
        return "Game is StarCraft";
    }
 
    public String getGameType() {
        return "Strategy Simulation";
    }   
}
cs


그 다음 User.java 의 play 메소드에 인터페이스 인자와 메소드를 넣는다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class User {
    
    public static void main(String[] args) {
        
        User user = new User();
        OverWatch overwatch = new OverWatch();
        StarCraft starcraft = new StarCraft();
        
        user.play(overwatch);
        user.play(starcraft);
        
    }
    
    public void play(Game game){
        System.out.println(game.getGame()+" / "+game.getGameType());
    }
}
cs


어떤 인자를 받느냐에 따라 그 인자가 선언된 java파일의 메소드 내용이 출력하게 된다.


출력 결과


Game is OverWatch / FPS

Game is StarCraft / Strategy Simulation




+ Recent posts