본문 바로가기
교육, 학습/멀티캠퍼스_풀 스택

JAVA문법 - 인터페이스 개념, abstract 클래스와의 비교(설계적 관점에서 사용이유)

by 개발하는 경제학도 2022. 1. 10.

강의 소개

현재 수강하고 있는 멀티캠퍼스 k-digital 지능형 웹서비스 풀 스택 과정을 수강하며 적은 내용입니다.

교재로는 자바의 정석을 사용하고 있습니다.


 

인터페이스

인터페이스

다른 클래스를 작성할 때 기본이 되는 틀을 제공한다. 일종의 추상 클래스로 일반적인 추상 클래스보다 추상화 정도가 높다. 

클래스는 다중 상속을 받는 것(부모 클래스가 여러 개인 것)을 금지한 반면, 인터페이스로 다중 상속을 구현할 수 있다.

 

interface 인터페이스이름{
	public static final 변수타입 상수이름 = 값; // 인터페이스는 변수로 상수만 가진다. (앞의 public static fianl 생략가능)
    public abstract 메서드이름(매개변수); // 인터페이스는 메서드로 추상메서드만 가진다. (앞의 pubic abstract 생략가능
}

 

- 특징

실제 구현된 것이 전혀 없는 기본 설계도이며, 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.

인스턴스를 생성할 수 없다. (new로 생성할 수 없다. 추상 메서드 때문에)

추상 메서드(abstract + 메서드)와 상수(final + 변수)만을 멤버로 가질 수 있다.

더보기

-> 내부의 메서드가 모두 추상 메서드이다. (인터페이스의 메서드는 모두 public abstract로 인식된다. 생략도 가능하다)

-> 인터페이스에 선언된 상수들은 모두 'public static final + 변수'이기 때문에(public static final도 생략 가능) 인터페이스. 변수로 접근할 수 있다.

 

다중 상속이 가능하다. (클래스와의 차이점)

인터페이스를 구현받은 클래스는 인터페이스에 정의된 추상 메서드를 완성해야 한다.

인터페이스는 Object 클래스와 같은 최고 조상이 없다.

상속과 동시에 구현이 가능하다(클래스는 extends로 상속 받음과 동시에, implements로 구현할 수 있다)

 

[상속과 구현이 동시에 일어난 예시]

class Fighter extends 클래스이름 implement 인터페이스이름1, 인터페이스이름2 / *, .. */
	/*구현할 메서드 생략*/
}

 

- 인터페이스의 상속

인터페이스를 상속받는 것을 구현이라 하며, implements를 사용한다. (클래스 상속 시 extends 사용하는 것과 차이점이다.)

하지만 인터페이스들 간의 상속은 extends를 사용한다.

/* implements :클래스에서 인터페이스 구현 */
class 클래스이름 implements 인터페이스이름
	/*구현할 메서드 생략*/
}

/* extends: 인터페이스들 간의 상속 */
interface 인터페이스2 extends 인터페이스1 {
	/*메서드 생략*/
}

 

- 사용 이유

개발 시간을 단축시킬 수 있다.

표준화가 가능하다. (일관되고 정형화된 프로그램의 개발)

서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다(서로 상속관계이거나, 같은 부모 클래스를 갖고 있지 않은 클래스 간 관계를 맺어줄 수 있다)

독립적인 프로그래밍이 가능하다. (인터페이스를 이용하여 클래스의 선언과 구현을 분리시킬 수 있다. 따라서 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다. 인터페이스를 이용해서 클래스 간의 간접적인 관계를 맺으면 한 클래스의 변경이 다른 클래스에 영향을 미치지 않는다)

 

- jdk 1.8 버전부터 추가된 문법

1) default 메서드

디폴트 메서드는 인터페이스를 상속하는 모든 클래스에서 공통으로 갖는 기능을 구현한 메서드이다.

디폴트 메서드는 인터페이스 내부에서 구현부(바디를 가진) 일반 메서드이다.

(이미 구현이 된 메서드이기 때문에 오버 라이딩이 필수가 아닌 메서드이다. 이런 디폴트 메서드는 일반 메서드이기 때문에 인터페이스의 원칙을 위반한다.)

interface MyInterface {
	void method();  // public abstract 가 생략된 추상 메서드
    default void method() {}  // 디폴트 메서드(추상 메서드 x)
}

 

2) static 메서드

static 메서드이기 때문에 객체 생성 없이 사용할 수 있다. 프로그램 시작 시 사용 준비가 완료되는 메서드다.

 

 

인터페이스와 추상 클래스 차이점 (설계적, 기능적, 제어자 관점)

인터페이스

- 설계적인 관점

인터페이스는 설계적인 관점에서 형용사적 의미를 가진다.(자주 사용하는 Serializable 인터페이스의 경우처럼 able 등 형용사 형태로 이름을 가지고 있는 경우가 많다.) 클래스가 여러 개 있을 때, 다른 부모 클래스를 상속받고 있더라도 동일한 기능을 구현해야 할 때 사용한다.

따라서 중요한 기능을 인터페이스의 디폴트 메서드로 구현한 다음, 여러 클래스에서 이 기능을 사용할 수 있도록 implements로 구현시킬 수 있다.

- 기능적 관점

인터페이스는 다중 상속이 가능하다는 중요한 포인트가 있다.

static 메서드와 default메서드를 제외한 모든 메서드가 추상 메서드이다.

- 제어자(= 접근자) 관점

인터페이스에 선언된 변수들은 모두 'public static final' 이 붙어 상수이다.

인터페이스의 메서드는 모두 public abstract로 public이 항상 붙는다.

 

추상 클래스

- 설계적인 관점

설계적인 관점에서 추상 클래스는 명사적인 의미를 갖는다. 예를 들어 Person이나, Student 같은 명사들이다. 상속을 통해 Person 클래스는 Student라는 클래스에서 구체화되는 것이며, 두 클래스 간에는 'is - a' 관계가 있다.

-기능적 관점

추상 클래스는 단일 상속만 가능하다. (모든 클래스는 단일 상속만 가능하다)

추상 클래스는 추상 메서드가 1개 이상만 포함되면 된다. (단 1개의 추상 메서드만 가져도 추상 클래스가 된다.)

- 제어자(= 접근자) 관점

public, protected, private 등 다양한 제어자를 가질 수 있다.

non-static, non-final 변수를 사용하고 싶은 경우에는 추상 클래스를 사용한다.

 

 

인터페이스와 추상 클래스의 공통점

인터페이스, 추상 클래스 모두 내부의 추상 메서드를 자식에서 구현하도록 강제한다.

인스턴스를 생성할 수 없다. (추상 메서드를 가지고 있기 때문이다.)

 

 

출처: 자바의 정석(남궁 성 저), 멀티캠퍼스

댓글