Kim VamPa

[JAVA 스터디] 8주차 과제 : 인터페이스 본문

스터디/자바 스터디

[JAVA 스터디] 8주차 과제 : 인터페이스

Kim VamPa 2021. 1. 9. 12:54
728x90
반응형

목차 

1. 인터페이스란?

2. 인터페이스 정의하는 방법

3. 인터페이스 구현하는 방법

4. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

5. 인터페이스 상속

6. 인터페이스의 기본 메소드(Default Method), 자바8

7. 인터페이스의 static 메소드, 자바8

8. 인터페이스의 private 메소드, 자바9

 

 

1. 인터페이스란?

 인터페이스는 일종의 추상클래스 입니다. 클래스가 객채(Instance)의 명세서 혹은 설계서라고 한다면 추상클래스는 미완성 설계도 입니다. 추상 클래스는 멤버(변수, 메서드)를 가진다는 점은 일반 클래스와 다를바 없지만 추상 클래스의 메서드는 구현부는 작성하지 않고 선언부만 작성하는 '추상 메서드'를 가진다는 점이 다릅니다.

 인터페이스를 일종의 추상클래스라고 하였지만 추상화 정도가 더 높아서 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없습니다. 인터페이스는 오직 추상메서드와 상수만을 가집니다.

 

 

2. 인터페이스 정의하는 방법

 인터페이스의 작성은 클래스의 작성과 비슷합니다. 단지, 선언부의 class 키워드 대신 interface를 작성한다는 것이 다릅니다. 인터페이스에 사용 할 수 있는  접근 제어자는 public 도는 default가 있습니다. 구현부에서는 상수와 추상메서드만을 사용 할 수 있는데 상수는 'public static final' 키워드를 추상 메서드는 'public abstract' 키워드를 사용하여 선언합니다. 해당 키워드들은 인터페이스에 모든 멤버에 예외없이 적용되는 사항이기 때문에 생략할 수도 있습니다. (생략된 키워드들은 컴파일시 컴파일러가 자동으로 추가합니다.)

 

일반 클래스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
class 클래스 이름{
 
    // 멤버변수
    변수타입 변수명;
 
    // 메서드
    반환타입 메서드명(매개변수타입 매개변수명){
        
        // 구현부
 
        return 반환타입 값;    
    }    
 
}

 

 

추상 클래스

 

1
2
3
4
5
6
7
8
9
interface 인터페이스명{
 
    // 멤버변수
    public static final 변수타입 변수명 = 값;
 
    // 메서드
    public abstract 반환타입 메서드명(매개변수타입 매개변수명);
 
}

 

 

3. 인터페이스를 구현하는 방법

 인터페이스 자체만으로는 인스턴스를 생성 할 수 없습니다. 인터페이스는 상속을 통해 자신의 추상메서드 구현부를 완성 해줄 클래스를 정의 함으로써 사용이 가능합니다. 단, 일반적으로 상속을 사용하기위해 클래스에 'extends'를 흔히 사용하였지만 인터페이스에서의 상속은 구현을 한다는 의미에서 'implements'를 사용합니다. 

 인터페이스를 구현하는 class는 반드시 인터페이스의 추상메서드를 모두 구현해야만합니다. 만약 인터페이스의 일부 추상 메서드만 구현을 하고시팓면 class 구현부 앞에 'abstract'를 붙여 주어야만 합니다.

 

인터페이스

 

1
2
3
4
5
6
7
8
9
10
11
public interface TestInterface {
 
    public static final int var1 = 1;
    
    public abstract void testMethod1();
    
    public abstract void testMethod2();
    
    public abstract void testMethod3();
    
}

 

 

인터페이스 구현 클래스(추상 메소드 모두 구현)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class TestImplements implements TestInterface{
 
    @Override
    public void testMethod1() {
        
        System.out.println("인터페이스의 추상 메서드 구현1");
        
    }
 
    @Override
    public void testMethod2() {
        
        System.out.println("인터페이스의 추상 메서드 구현2");
        
    }
 
    @Override
    public void testMethod3() {
        
        System.out.println("인터페이스의 추상 메서드 구현3");
        
    }
 
}

 

 

인터페이스 구현 클래스(추상 메소드 일부 구현)

 

1
2
3
4
5
6
7
8
9
10
public abstract class TestImplements2 implements TestInterface {
 
    @Override
    public void testMethod2() {
        
        System.out.println("인터페이스의 추상 메서드 구현2");
        
    }    
    
}

 

 

4. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

 인터페이스 타입의 참조 변수를 선언하여 인터페이스를 구현한 클래스의 인스턴스를 참조하는 것이 가능합니다. 단 이와 같이 인터페이스 타입의 참조 변수를 사용해서 클래스에 접글 할때는 클래스에 인터페이스에 없는 메서드는 사용 하지 못합니다.

 

1
2
3
4
5
6
 
    인터페이스 참조변수 = new 구현클래스();
 
    // 인스턴스 메서드 접근 가능.
    구현클래스.메서드();
 

 

 

인터페이스

 

1
2
3
4
5
6
7
8
9
10
11
public interface TestInterface {
 
    public static final int var1 = 1;
    
    public abstract void testMethod1();
    
    public abstract void testMethod2();
    
    public abstract void testMethod3();
    
}

 

 

구현 클래스

 

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
public class TestImplements implements TestInterface{
 
    @Override
    public void testMethod1() {
        
        System.out.println("인터페이스의 추상 메서드 구현1");
        
    }
 
    @Override
    public void testMethod2() {
        
        System.out.println("인터페이스의 추상 메서드 구현2");
        
    }
 
    @Override
    public void testMethod3() {
        
        System.out.println("인터페이스의 추상 메서드 구현3");
        
    }
 
    public void classMethod1() {
        
        System.out.println("클래스 자신만의 메서드");
        
    }
}

 

 

인터페이스, 구현클래스 사용

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class App {
 
    public static void main(String[] args) {
        
        //TestInterface test1 = new TestInterface();
        // 인터페이스 잔체만으로 인스턴스 생성 x
        
        TestInterface test = new TestImplements();
        
        test.testMethod1();
        test.testMethod2();
        test.testMethod3();
        //test.classMethod1(); 사용불가
        
    }
    
}

 

 

5. 인터페이스 상속

 인터페이스 또한 상속이 가능하다. 단, 인터페이스는 인터페이스로부터만 상속받을 수 있습니다. 단, 인터페이스는 클래스의 Object 클래스와 같은 최고 조상은 없습니다.

 

1
2
3
4
5
 
public interface ChildInterface extends ParentInterface {
 
}
 

 

 

 인터페이스는 다중 상속 또한 가능합니다.

 

1
2
3
4
5
 
public interface ChildInterface extends ParentInterface1, ParentInterface2 {
 
}
 
cs

 

 

6. 인터페이스의 기본 메소드(Default Method), 자바8

 인터페이스는 추상메서드만을 선언할 수 있었지만 자바8 부터 Default 메소드, static 메소드 를 추가 할 수있게 되었습니다. 그중 Default 메소드는 추상 메서드의 기본적인 구현을 제공하는 메서드입니다. 추상메서드가 아니기 때문에 Default 메소드가 새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 됩니다. (변경하지 않아도 된다는 것이지 변경이 불가능하다는 것은 아닙니다. 다시말해 구현 클래스에서 해당 메소드를 Overriding 가능합니다. )단지 조상클래스에 새로운 메서드를 추가한 것과 동일한 효과를 냅니다. 

추가된 이유

 기존에 인터피에스에 메서드를 추가한다는 것은 추상메서드를 추가한다는 의미였습니다. 따라서 인터페이스에 메소드를 추가한다는 것은 인터페이스를 구현한 클래스들에 일일이 새로 추가된 메소드를 구현해야만 했습니다. 물론 설계한 인터페이스가 완벽해서 추 후 변경이 되지 않는다면 문제가 되지 않습니다. 하지만 아무리 설계를 잘해도 언젠가는 변경이 발생 할 수 밖에 없습니다. 이러한 불편함을 줄이기 위해 Defalut 메소드를 JDK의 설계자들이 고안하였습니다.

 

사용방법

 메서드 앞에 'default' 키워드를 붙이고, 메서드와 달리 일반 메서드처럼 구현부("{ }")가 있어야 합니다. 'default' 키워드는 생략이 불가능합니다.

 

1
2
3
4
5
 
default 반환타입 메소드명(){
 
}
 

 

 

7. 인터페이스의 static 메소드, 자바8

 앞서 말했듯이 자바8부터 인터페이스에 static 메소드를 생성이 가능합니다. 인터페이스의 static 메소드성질은 일반 클래스에서 사용하는 static메소드와 동일합니다. Default 메소드와 다르게 static 메소드는 구현하는 클래스에서는 인터페이스의 static 메소드를 변경하는 것이 불가능합니다. 해당 메소드는 일반클래스에서 사용한 것과 같이 인스턴스의 생성없이 '참조변수명.메소드()'를 통해서 접근이 가능합니다.

 

 선언 방식은 일반적으로 사용하는 static 메서드처럼 구현부를 포함하여 작성하면됩니다. 

 

1
2
3
4
5
 
static 반환타입 메소드명(){
 
}
 
cs

8. 인터페이스의 private 메소드, 자바9

 자바9 에서 추가적으로 private method와 private static method를 사용 할 수 있게 되었습니다. 해당 기능을 통해서 다른 인터페이스, 클래스가 숨기길 원하는 메소드에 대한 접근을 막을 수가 있게 되었습니다. private method는 해당 메소드를 가진 인터페이스 내의 메소드들만 호출이 가능하다.

 

1
2
3
4
5
6
7
8
9
 
private 반환타입 메소드명(){
 
}
 
private static 반환타입 메소드명(){
 
}
 

 

 

Reference

  • Java의 정석(남궁성 지음 / 도우출판 )

 

Date

  • 2021-01-09

 

728x90
반응형

'스터디 > 자바 스터디' 카테고리의 다른 글

[JAVA 스터디] 9주차 과제 : 예외 처리  (0) 2021.01.16
Comments