추상 클래스와 인터페이스

초보개발·2021년 11월 18일
0

JAVA

목록 보기
4/15

추상(abstract) 클래스

추상(abstract)는 실체 간에 공통되는 특성을 추출한 것을 말한다. 고양이, 개, 새 등의 실체에서 공통되는 특성은 동물이며, 동물은 구체적인 실체라기보다 실체들의 공통되는 특성을 갖고 있는 추상적인 것이라고 볼 수 있다.

추상 클래스의 목적

  • 공통된 필드와 메소드의 이름을 통일할 목적
    • 데이터와 기능이 모두 동일한데도 이름이 다 다르게 되면 객체마다 사용 방법이 달라지게 된다.
  • 실체 클래스를 작성할 때 시간 절약
    • 공통적인 필드와 메소드(특징들)은 추상클래스에 선언하고, 다른 점만 실체 클래스에서 선언하면 실체 클래스를 작성하는데 시간을 절약할 수 있다.

추상 클래스의 선언

new 연산자로 직접 생성자를 호출할 수 없고, 자식 객체가 생성될 때 super()를 호출하여 추상 클래스 객체를 생성하므로 추상 클래스에서도 생성자가 반드시 필요하다.

public abstract class <클래스 이름> {
    // fields
    // constructor
    // methods
}

추상 메소드와 재정의

메소드의 선언만 공통적으로 갖고, 그 실행 내용은 실체 클래스마다 다시 정의해야할 때가 있다. 이런 경우를 위해 추상 클래스에서는 추상 메소드를 선언할 수 있다. 추상 메소드는 abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드를 말한다.

[public | protected] abstract <리턴 타입> <메소드 이름>(매개변수);
추상 메소드 선언
package ...;

public abstract class Animal { // 추상 클래스
    public String kind;
    public void walk() {
        System.out.println("걸어다닙니다.");
    }
    public abstract void sound(); // 추상 메서드
}
추상 메소드 재정의
package ...;

public class Dog extends Animal {
    public Dog() {
        this.kind = "포유류";
    }
    
    // 추상 메서드 재정의
    @override
    public void sound() {
        System.out.println("멍멍");
    }
}

인터페이스

인터페이스는 객체의 사용 방법을 정의한 타입이며, 개발 코드와 객체가 서로 통신하는 접점 역할을 해준다. 인터페이스를 통해 다양한 객체를 동일한 사용 방법으로 이용할 수 있다.

인터페이스의 선언

인터페이스는 객체로 생성할 수 없으므로 생성자를 가질 수 없으며 인터페이스는 상수 필드와 추상 메소드만을 구성 멤버로 가진다.

[public] interface <인터페이스 이름> {
    // 상수
    타입 상수이름 =;
    // 추상 메소드
    타입 메소드이름(매개변수,);
}
상수 필드

인터페이스에 고정된 값으로 실행 시에 데이터를 바꿀수 없다.
인터페이스에 선언된 필드는 모두 public static final의 특성을 갖고 생략하더라도 컴파일 과정에서 자동으로 붙게 된다.

[public static final] 타입 상수이름 =;
추상 메소드 선언

인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행된다. 그러므로 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언한다.(public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙음)

[public abstract] 리턴타입 메소드이름(매개변수,);

인터페이스 구현

개발 코드가 인터페이스 메소드를 호출하면 인터페이스 객체의 메소드를 호출한다. 객체는 인터페이스에서 정의된 추상 메소드와 동일한 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 갖고 있어야 한다. 이러한 객체를 인터페이스의 구현 객채라 하고 구현 객체를 생성하는 클래스를 구현 클래스라고 한다.

구현 클래스

기존 클래스와 달리 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시해야 한다.

public class <구현클래스이름> implements <인터페이스이름> {
    // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
public class <구현클래스이름> implements <인터페이스1>, <인터페이스2> {
    // 인터페이스1에 선언된 추상 메소드의 실체 메소드 선언
    // 인터페이스2에 선언된 추상 메소드의 실체 메소드 선언
}

0개의 댓글