앞서서 여러번 적었다시피 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있다는 문제로 자바에서는 다중상속이 불가능하다.
하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있다.
인터페이스
interface
인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하게된다. 인터페이스(interface)는 오로지 추상 메소드와 상수만을 포함할 수 있다.
인터페이스 선언은 다음과 같다.
public interface 인터페이스클래스명 {
public static final 변수 변수명 = 값;
public abstract 메소드이름(매개변수);
}
단, 클래스와는 달리 인터페이스의 모든 필드는 public static final이어야 하며, 모든 메소드는 public abstract여야한다.
이 부분은 모든 인터페이스에 공통으로 적용되는 부분이므로 이 제어자는 생략할 수 있다.
이렇게 생략된 제어자는 컴파일 시 자바 컴파일러가 자동으로 추가됨.
위에서 인터페이스를 통해서 다중상속을 지원해준다했지만 사용방법이 동일하지는 않다.
인터페이스를 적용할 땐, 아래와 같이 클래스 선언문 뒤에 implements라는 예약어를 쓴 후 사용하려고하는 인터페이스를 적어줘야한다.
<기본문법>
public class example implements 인터페이스클래스명{}
<상속과 구현을 동시에 할 수 있다.>
class 자식클래스 extend 부모클래스 implements 인터페이스1, 인터페이스2...
적용하는 법이 다른만큼 사용법도 다르다.
implements라는 예약어는 사전적으로 "구현하다"는 의미이다. 상속이 아니라 말그대로 클래스 내에서 구현을 해야한다.
또한 인터페이스는 인터페이스로부터만 상속을 받을 수 있으며, 여러 인터페이스를 상속받을 수 있다.
인터페이스의 장점
인터페이스를 사용하면 다중 상속이 가능할 뿐만 아니라 다음과 같은 장점을 가질 수 있다.
1. 클래스의 기본틀을 제공하여 개발 시간을 단축할 수 있다.
2. 표준화가 가능하다.
3. 코드의 종속성을 줄이고 유지보수성을 높이도록해줘서 클래스간의 결합도를 낮출 수 있다.
추상메소드
abstract method
자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미한다.
추상 메소드를 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다.
추상 메소드는 선언부만이 존재하며, 구현부는 작성되어 있지 않다.
바로 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것.
모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고, 이를 받아 사용하는 쪽에서는 자신에게 필요한 부분만을 재정의하여 사용함으로써 생산성이 향상되고 배포 등이 쉬워지기 때문이다.
추상클래스
abstract class
하나 이상의 추상 메소드(abstract method)를 포함하는 클래스이다.
반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야 한다.
abstract class 클래스명 {
abstract 반환타입 메소드명();
}
추상 클래스는 동작이 정의되어 있지 않은 추상 메소드를 포함하고있어 인스턴스를 생성할 수 없다.
추상 클래스는 먼저 상속을 통해 자식 클래스를 만들고, 만든 자식 클래스에서 추상 클래스의 모든 추상 메소드를 오버라이딩해야 자식 클래스의 인스턴스를 생성할 수 있게 된다.
추상 클래스는 추상 메소드를 포함하고 있다는 점을 제외하면, 일반 클래스와 모든 점이 같다.
생성자와 필드, 일반 메소드도 포함할 수 있습니다.
추상 클래스 장점
- 상속을 통해 중복코드 줄일 수 있다.
- 자식 클래스에 추상 메소드의 구현을 강요하기 때문에 표준화 정도를 높임
- 공통 사항을 한 곳에서 관리할 수 있기 때문에 개발 및 유지보수가 용이해짐
enum
서로 연관된 상수들의 집합을 의미한다.
기존에 상수를 정의하는 방법이였던 final static string 과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용해서 같은 효과를 낼 수있다.
Enum의 장점
1. 코드가 단순해지며, 가독성이 좋다.
2. 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장된다.
3. enum class를 사용해 새로운 상수들의 타입을 정의하여 정의한 타입이외의 타입을 가진 데이터값을 컴파일시 체크
4. 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 알 수 있습니다.
public class Example {
//기존 상수 선언방법
public static final String MALE = "MALE";
public static final String FEMALE = "FEMALE";
public static void main (String[] args) {
String gender1;
gender1 = Example.MALE;
gender1 = Example.FEMALE;
//MALE, FEMALE이 아닌 상수 값이 할당 될 때
//컴파일시 에러가 나지 않음. -> 문제점 발생.
gender1 = "boy";
////////////////////////////////////////
Gender gender2;
gender2 = Gender.MALE;
gender2 = Gender.FEMAL;
//컴파일 시 의도하지 않는 상수 값을 체크할 수 있음.
//Enum으로 정의한 상수값만 할당 받을 수 있음.
gender2 = "boy";
}
}
//enum class를 이용한 선언방법.
enum Gender {
MALE,FEMAL;
}
'언어 > JAVA' 카테고리의 다른 글
15장 Nested 클래스 (0) | 2021.10.27 |
---|---|
14장 예외처리 (0) | 2021.10.24 |
12장 object (0) | 2021.10.22 |
11장 API (0) | 2021.10.21 |
10장 상속 (0) | 2021.10.19 |