[ITWILL : JAVA]기본클래스 이외에 자바 구성요소1 : 추상클래스, 인터페이스
ITWILL학원 : 17강 JAVA BY 윤미영강사
1. 추상클래스(Abstract Class)
- 슈퍼클래스에서 메서드의 선언부까지는 작성가능하지만 구현부는 어떻게 될지 확정되지 않아 작성하기 어려울때 사용
- 서브클래스들에서 어차피 재정의해서 사용하기 때문에 슈퍼클래스에서 아직 작성할 수 없는 메서드에 대해 선언부에 abstract를 추가 작성하고 구현부를 세미콜론(;)으로 대체한다.
- 이를 abstract method design pattern 프로그래밍기법이라고 한다.
1 | abstract class A { |
- 추상클래스도 클래스이기에 클래스 구성요소(멤버변수, 메서드, 생성자)를 다 갖춰야하고 그 중 특이하게 abstract메서드를 가지는 클래스를 말한다.
- 참조변수로 사용가능
- 객체생성 불가능 : 구현부가 없어서 호출될 수 없기때문에 즉 abstract메서드때문에 미완성
- 미완성을 어떻게 완성시킬까?
- 상속하여 재정의! 상속관계의 @override해줘야한다.
- 반드시 재정의해줘야한다.
- 재정의를 통해 서브클래스를 객체생성해서 사용할 수 있다.
1 | class B extends A { |
- 장점 : 재사용성 향상
참고링크 : 추상 클래스 및 추상 메서드(abstract class and abstract method)
2. 인터페이스
두 시스템 간에 만나는 접점이라는 의미.
모든 메서드가 abstract메서드인 클래스를 인터페이스라고 한다.
자주 사용하는 인터페이스 : GUI(Graphic User Interface).
인터페이스이름의 첫글자는 대문자.
인터페이스는 클래스가 아니라서 클래스와 구성요소의 차이가 있다.
객체생성 불가능 : abstract메서드가 있어서, 즉 메서드가 미완성
미완성을 어떻게 완성시킬까?
- 재구현! 클래스의 재구현을 통해서 객체생성할 수 있다.
2-1. 인터페이스와 클래스 차이점
- 인터페이스와 클래스는 정의법과 구성요소의 차이가 있다.
- 인터페이스 정의시에 왜 예약어가 생략가능할까?
- 컴파일러입장에서는 final과 abstract가 너무나 당연하기때문에
1 | //클래스 정의법 |
- 인터페이스와 클래스 차이
- 인터페이스 : 다중구현 가능 (헷갈릴까봐 다중상속이라고하지않고 다중구현이라고부른다)
- 클래스 : 다중상속 불가능
- 인터페이스는 객체 생성이 가능할까?
NOPE! 클래스로 구현한 뒤 클래스를 객체생성할 수있다(업캐스팅)
2-2. 구현(implements)
- 클래스의 구현을 통해서 인터페이스를 사용할 수 있다.
- 키워드는 implements 사용!
- abstract 예약어 생략가능. 따라서 abstract 예약어 안써도 다 생략되어있다고 생각하면됨
- 왜냐면, 인터페이스안에는 일반변수와 일반메서드 사용할 수 없기 때문에
- 인터페이스의 모든 abstract method를 재구현하기 위해서 단축키
alt + shift + s
를 통해Override/implements method
를 클릭한 뒤 abstract method를 tick해서 재구현해준다.
1 | //구현 키워드는 implements |
2-3. 인터페이스의 필요성
만들어놓은 라이브러리를 사용하기 위해 인터페이스를 시용한다.
- 구현의 강제로 표준화
- 인터페이스를 통해 간접적인 클래스 사용으로 손쉬운 모듈교체지원
- 서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
- 모듈 간 독립적 프로그래밍으로 개발 시간 단축
- stub : 아직 개발되지 않은 코드를 임시로 대치하는 역할.
2-4. 인터페이스에 추가할 수 있는 다양한 메서드
- JDK 1.8버전에서부터 default메서드와 static메서드가 추가되었다.
- default()메서드 : 구현부가 포함된 일반 메서드
- interface클래스 구현한 뒤 디폴트메서드는 오버라이딩필요없이 사용가능.
- 중요 : 접근제어자는 public만 사용가능
- 문제점 : 인터페이스 다중구현할때 디폴트메서드가 이름이 똑같은 경우 우선순위를 어떻게 두는가? => 아래 규칙으로 충돌을 회피한다.
- 조상클래스의 메서드가 가장 높은 우선순위. 조상클래스의 메서드와 인터페이스의 디폴트메서드가 충돌하면 디폴트메서드는 무시된다.
- 하나의 인터페이스에서 디폴트메서드를 제공되고 다른 이터페이스에 충돌하는 메서드가 있는 경우(디폴트메서드가 아니더라도) 서브클래스는 반드시 조상의 메서드를 재정의해야한다.