강의 소개
현재 수강하고 있는 멀티캠퍼스 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 변수를 사용하고 싶은 경우에는 추상 클래스를 사용한다.
인터페이스와 추상 클래스의 공통점
인터페이스, 추상 클래스 모두 내부의 추상 메서드를 자식에서 구현하도록 강제한다.
인스턴스를 생성할 수 없다. (추상 메서드를 가지고 있기 때문이다.)
출처: 자바의 정석(남궁 성 저), 멀티캠퍼스
'교육, 학습 > 멀티캠퍼스_풀 스택' 카테고리의 다른 글
JAVA 문법 - 배열(array), 확장된 for문, 다차원 배열 (0) | 2022.01.11 |
---|---|
JAVA 문법 - 기본형 타입, 참조형 타입의 형변환(자동 형변환, 명시적 형변환) (0) | 2022.01.10 |
JAVA 문법 - 메서드 오버라이딩의 3가지 규칙, abstract와 final제어자 (0) | 2022.01.10 |
JAVA 문법 - abstract, 추상클래스, 추상메서드와 상속, 오버라이딩의 관계 (0) | 2022.01.09 |
JAVA 문법 - final 제어자(변수, 메서드, 클래스 별 의미) (0) | 2022.01.09 |
댓글