[ITWILL : JAVA]기본클래스 이외에 자바 구성요소1 : 추상클래스, 인터페이스

ITWILL학원 : 17강 JAVA BY 윤미영강사

1. 추상클래스(Abstract Class)

  • 슈퍼클래스에서 메서드의 선언부까지는 작성가능하지만 구현부는 어떻게 될지 확정되지 않아 작성하기 어려울때 사용
  • 서브클래스들에서 어차피 재정의해서 사용하기 때문에 슈퍼클래스에서 아직 작성할 수 없는 메서드에 대해 선언부에 abstract를 추가 작성하고 구현부를 세미콜론(;)으로 대체한다.
  • 이를 abstract method design pattern 프로그래밍기법이라고 한다.
1
2
3
4
5
6
abstract class A {
//멤버변수, 메서드, 생상자
public abstract void 메서드이름();
}

//abstract()메서드는 중괄호없이 세미콜론만.
  • 추상클래스도 클래스이기에 클래스 구성요소(멤버변수, 메서드, 생성자)를 다 갖춰야하고 그 중 특이하게 abstract메서드를 가지는 클래스를 말한다.
  • 참조변수로 사용가능
  • 객체생성 불가능 : 구현부가 없어서 호출될 수 없기때문에 즉 abstract메서드때문에 미완성
  • 미완성을 어떻게 완성시킬까?
    • 상속하여 재정의! 상속관계의 @override해줘야한다.
    • 반드시 재정의해줘야한다.
    • 재정의를 통해 서브클래스를 객체생성해서 사용할 수 있다.
1
2
3
4
5
6
class B extends A {
@Override
public void 메서드이름(){
//구현부작성
}
}
  • 장점 : 재사용성 향상

참고링크 : 추상 클래스 및 추상 메서드(abstract class and abstract method)

2. 인터페이스

  • 두 시스템 간에 만나는 접점이라는 의미.

  • 모든 메서드가 abstract메서드인 클래스를 인터페이스라고 한다.

  • 자주 사용하는 인터페이스 : GUI(Graphic User Interface).

  • 인터페이스이름의 첫글자는 대문자.

  • 인터페이스는 클래스가 아니라서 클래스와 구성요소의 차이가 있다.

  • 객체생성 불가능 : abstract메서드가 있어서, 즉 메서드가 미완성

  • 미완성을 어떻게 완성시킬까?

    • 재구현! 클래스의 재구현을 통해서 객체생성할 수 있다.

2-1. 인터페이스와 클래스 차이점

  1. 인터페이스와 클래스는 정의법과 구성요소의 차이가 있다.
  • 인터페이스 정의시에 왜 예약어가 생략가능할까?
  • 컴파일러입장에서는 final과 abstract가 너무나 당연하기때문에
1
2
3
4
5
6
7
8
9
10
11
12
//클래스 정의법
class A{
멤버변수
메서드
생성자
}

//인터페이스 정의법
interface Interf {
상수(final 생략가능)
abstract()메서드(abstract 예약어 생략가능)
}
  1. 인터페이스와 클래스 차이
  • 인터페이스 : 다중구현 가능 (헷갈릴까봐 다중상속이라고하지않고 다중구현이라고부른다)
  • 클래스 : 다중상속 불가능
  1. 인터페이스는 객체 생성이 가능할까?
    NOPE! 클래스로 구현한 뒤 클래스를 객체생성할 수있다(업캐스팅)

2-2. 구현(implements)

  • 클래스의 구현을 통해서 인터페이스를 사용할 수 있다.
    • 키워드는 implements 사용!
  • abstract 예약어 생략가능. 따라서 abstract 예약어 안써도 다 생략되어있다고 생각하면됨
    • 왜냐면, 인터페이스안에는 일반변수와 일반메서드 사용할 수 없기 때문에
  • 인터페이스의 모든 abstract method를 재구현하기 위해서 단축키 alt + shift + s를 통해 Override/implements method를 클릭한 뒤 abstract method를 tick해서 재구현해준다.
1
2
3
4
5
6
7
8
//구현 키워드는 implements
class interA implements Interf{
//멤버변수, 메서드, 생성자

//인터페이스가 가지고있는 모든 abstract method를 재구현해야함.
@Override
void method(){}
}

2-3. 인터페이스의 필요성

만들어놓은 라이브러리를 사용하기 위해 인터페이스를 시용한다.

  • 구현의 강제로 표준화
  • 인터페이스를 통해 간접적인 클래스 사용으로 손쉬운 모듈교체지원
  • 서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
  • 모듈 간 독립적 프로그래밍으로 개발 시간 단축
    • stub : 아직 개발되지 않은 코드를 임시로 대치하는 역할.

2-4. 인터페이스에 추가할 수 있는 다양한 메서드

  • JDK 1.8버전에서부터 default메서드와 static메서드가 추가되었다.
  • default()메서드 : 구현부가 포함된 일반 메서드
    • interface클래스 구현한 뒤 디폴트메서드는 오버라이딩필요없이 사용가능.
    • 중요 : 접근제어자는 public만 사용가능
    • 문제점 : 인터페이스 다중구현할때 디폴트메서드가 이름이 똑같은 경우 우선순위를 어떻게 두는가? => 아래 규칙으로 충돌을 회피한다.
        1. 조상클래스의 메서드가 가장 높은 우선순위. 조상클래스의 메서드와 인터페이스의 디폴트메서드가 충돌하면 디폴트메서드는 무시된다.
        1. 하나의 인터페이스에서 디폴트메서드를 제공되고 다른 이터페이스에 충돌하는 메서드가 있는 경우(디폴트메서드가 아니더라도) 서브클래스는 반드시 조상의 메서드를 재정의해야한다.