티스토리 뷰

728x90
반응형

목표

자바의 인터페이스에 대해 학습하기.

 

스터디 목차

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

 

 

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

 

인터페이스란

- 구현된 것은 없고 밑그림만 있는 설계도

- 일반 메서드 또는 멤버 변수를 가질 수 없고, 오직 추상 메서드와 상수만을 멤버로 가질 수 있다.

- 자바 인터페이스는 기본적으로 추상메서드의 모음이다.

 

추상클래스는 클래스 내 추상 메소드가 하나 이상 포함되는 경우이다. 반면 인터페이스는 모든 메서드가 추상 메소드인 경우를 말한다.

 

인터페이스 작성방법

class 대신 interface라는 키워드를 사용한다.

class와 같이 접근제어자로 public이나 default를 사용할 수 있다.

 

public interface 인터페이스 이름{
	void 메서드이름();
}

 

인터페이스 제약사항

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

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

 

 

 

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

 

구현 한다는 의미의 implements를 사용한다.

반드시 인터페이스에 명시되어 있는 추상메서드들을 모두 구현해야 한다.

만약 인터페이스의 메서드중 일부만 구현한다면, 추상클래스로 선언되어야 한다.

상속과 구현을 동시에 할 수 있다.

 

class 클래스이름 implements 인터페이스이름 {
	// 인터페이스에 정의된 추상 메서드를 구현
}

abstract class 클래스이름 implements 인터페이스이름 {
	// 인터페이스에 정의된 추상 메서드의 일부만 구현
}

class 클래스이름 extends 조상클래스이름 implements 인터페이스이름 {

}

 

 

 

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

 

다형성에 대해 학습할 때 자손클래스의 인스턴스를 조상타입의 참조변수로 참조하는 것이 가능하다.

인터페이스 역시 이를 구현한 클래스의 조상이라 할 수 있으므로 해당 인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며, 인터페이스 타입으로의 형변환도 가능하다.

 

인터페이스 Fightable 클래스 Fighter가 구현했을 때 , 다음과 같이 Fighter 인스턴스를 Fightable 타입의 참조변수로 참조하는 것이 가능하다.

물론 Fightable타입의 참조변수로는 인터페이스 Fightable에 정의된 멤버들만 호출이 가능하다.

 

Fightable f = (Fightable)new Fighter();
또는
Fightable f = new Fighter();

 

따라서 인터페이스는 메서드의 매개변수의 타입으로 사용될 수 있다.

 

void attack(Fightable f){
 ...
}

 

인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것이다.

그래서 attack메서드를 호출할 때는 매개변수로 Fightable 인터페이스를 구현한 클래스의 인스턴스를 넘겨주어야 한다.

즉, attack ( new Fighter() ) 와 같이 할 수 있다는 것이다.

 

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) { /* 내용 생략 */}
	public void attack(Fightable f) { /* 내용 생략 */}
}

 

 

 

4. 인터페이스 상속

 

인터페이스 상속

인터페이스는 인터페이스로부터만 상속 받을 수 있다. (Object와 같은 최고 조상이 없다.)

여러개의 인터페이스로부터 상속 가능 (다중 상속 가능)

 

interface Movable {
	void move(int x, int y);
}

interface Attackable {
	void attack(Unit u);
}

interface Fightable extends Movable, Attackable {
}

 

 

 

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

 

default 메서드

자바 8이 등장하면서 interface에 대한 정의가 몇가지 변경되었다.

인터페이스에서 메서드가 default 키워드로 선언되면 메서드가 구현될 수 있다. 또한 이를 구현하는 클래스는 default 메서드를 오버라이딩 할 수 있다.

 

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;
    }
}

 

인터페이스가 변경이되면, 인터페이스를 구현하는 모든 클래스들이 해당 메소드를 구현해야 하는 문제가 있다. 이런 문제를 해결하기 위하여 인터페이스에 메서드를 구현해 놓을 수 있도록 하였다.

 

 

 

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

 

static 메서드

메서드가 static으로 선언되면 메서드가 구현될 수 있다. 그러나 구현하는 클래스에서 재정의 불가능 하다.

 

public interface Calculator {
	public int plus(int i, int j);
    public int multiple(int i, int j);
    default int execPlus(int i, int j){ 
    	return i + j;
    }
    static int execMulti(int i, int j){
    	return i * j;
    }
}

 

반드시 클래스명으로 메서드를 호출해야 한다.

 

public static void main(String[] args){
	Calculator cal = new CalculatorImpl();
    cal.execPlus(3,9);
    cal.execMulti(3,9); // 에러 Calculator.execMulti(3,9) 이렇게 호출해야함

 

  • interface의 default 메소드

- interface에서도 메소드 구현이 가능하다.

- 참조 변수로 함수를 호출할 수 있다.

- implements한 클래스에서 재정의가 가능하다.

 

  • interface의 static 메소드 

- interface에서 메소드 구현이 가능하다.

- 반드시 클래스 명으로 메소드를 호출해야 한다.

- 재정의 불가능!

 

 

 

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

 

Java8은 인터페이스에 default method 및 static method 라는 두 가지 새로운 기능을 제공한다.

하지만 이것은 여전히 불편하다 왜냐하면 단지 특정 기능을 처리하는 내부 method 일뿐인데도 외부에 공개되는 public method로 만들었어야 했다.

interface를 구현하는 다른 interface 또는 class가 해당 method에 액세스하거나 상속 할 수 있는것을 원하지 않는다.

 

Java9 Private Interface Method는 interface에 private method / private static method라는 새로운 기능을 제공하여 문제를 해결한다. 이제 중복 코드를 피하고 interface에 대한 캡슐화를 유지 할 수 있다.

 

public interface IMyInterface{
    private void method1(String arg){
       ...
    }
    private static void method2(Integer arg){
       ...
    }
}

 

 

 

 

 

Reference


enjoyplaying.tistory.com/33

 

인터페이스(interface)란?

인터페이스란? · 구현된 것은 아무 것도 없는 밑그림만 있는 기본 설계도. · 일반 메서드 또는 멤버 변수를 가질 수 없고, 오직 추상 메서드와 상수만을 멤버로 가질 수 있다. → 추상 클래스보

enjoyplaying.tistory.com

m.blog.naver.com/PostView.nhn?blogId=clown7942&logNo=110135151388&proxyReferer=https:%2F%2Fwww.google.com%2F

 

▣ JAVA - 인터페이스를 이용한 다형성

[참조] 남궁성의 자바(java) 초보스터디 | 네이버 카페 7.6 인터페이스를 이용한 다형성 다형성에 대해 학...

blog.naver.com

programmers.co.kr/learn/courses/5/lessons/241

 

자바 입문 - 인터페이스의 default method

자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 강의를 다 들었는데, 지금 내가 코딩 테스트 준비를 하고 있다면? 15년차 Java 전문 리더가 직접 이끄는 온라

programmers.co.kr

www.popit.kr/%EB%82%98%EB%A7%8C-%EB%AA%A8%EB%A5%B4%EA%B3%A0-%EC%9E%88%EB%8D%98-java9-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EB%B3%B4%EA%B8%B0/

 

나만 모르고 있던 - Java 9 (Java9 빠르게 훑어 보기) | Popit

지난 9월 공식 릴리즈된 Java9에 대해서 알아 보고자 구글링 통해서 찾은 문서중 괜찮은 문서 가 있어서 발번역해 봅니다. 본 문서는 Java9의 신규기능과 변경사항에 대해 빠르게 훑어 보는것을 목

www.popit.kr

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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