객체를 직접 생성할 수 있는 클래스는 실체 클래스라 하고, 이러한 클래스들의 공통적 특성을 추출해 선언한 클래스는 추상 클래스라고 합니다. 추상 클래스는 실체 클래스의 공통되는 필드와 메서드를 추출해서 만들기 때문에 객체를 직접 생성하지 못합니다. 즉, new연산자를 사용해 인스턴스를 생성하지 못합니다. 추상 클래스는 실체 클래스에 상속하기 위한 부모 클래스로 사용됩니다. 쉽게 말해 클래스 선언 시에 extends뒤에 오는 클래스입니다.
추상 클래스 선언
abstract키워드를 이용해 클래스를 작성합니다.
추상 클래스도 일반 클래스처럼 필드, 생성자, 메서드를 선언할 수 있습니다.
접근제어자 abstract class 추상클래스명 {
}
//예시
public abstract class Animal {
}
추상 클래스의 목적
- 실체 클래스들의 공통된 필드와 메서드의 이름을 통일하기 위함
- 실체 클래스의 작성 시간 절약
추상 메서드(abstract method)
추상 메서드는 메서드의 선언부만 있고 실행 내용은 없는 메서드를 말합니다. 따라서 추상 메서드는 중괄호({})부분이 없습니다. 추상 클래스 작성 시 하위 클래스가 반드시 실행 내용을 작성하도록 하고자 할 때 추상 메서드를 사용합니다. 하위 클래스는 반드시 추상 메서드를 재정의(오버라이딩)해 실행 내용을 작성해야 합니다.
*추상 클래스에는 일반 메서드와 추상 메서드 모두 작성 가능
//추상메서드 작성법
public abstract 추상클래스명 {
// abstract키워드 사용해 선언
public abstract void 메서드명();
}
지난 글에서 객체지향 프로그래밍(OOP)의 주요 특징 중 하나인 '상속'을 알아보았습니다. 상속을 통해 자식 클래스는 부모 클래스의 메서드, 필드를 사용할 수 있어 코드의 중복을 줄여주고 클래스를 재사용할 수 있습니다. 하지만 자바에서 클래스 다중 상속을 지원하지 않기 때문에 하나의 클래스만 상속받을 수 있습니다. 자바에서는 인터페이스(Interface)를 통해 다중 상속(여러 클래스 상속 가능)을 지원합니다.
인터페이스는 객체의 사용 방법을 정의한 타입으로, 객체의 교환성을 놓여주어 다형성 구현에 매우 중요한 역할을 합니다. 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 함으로써 개발 코드는 객체의 내부 구조를 알 필요가 없고, 인터페이스의 메서드만 알고 있으면 됩니다. 메서드를 호출하는 매개체인 인터페이스를 두는 이유는 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위함입니다. 즉 코드 변경 없이 실행내용과 리턴 값을 다양화할 수 있게 됩니다.
인터페이스 선언
클래스 작성법과 동일한데, class키워드 대신 interface 키워드를 사용해 작성합니다.
인터페이스 안에서 사용할 필드는 상수(final)로 선언되어야 하며 메서드는 추상(abstract) 메서드로 선언되어야 합니다.
(자바7까지는 실행 블록이 없는 추상 메서드만 선언 가능했으나, 자바8부터 디폴트(default) 메서드와 정적(static) 메서드 선언가능)
*자바9부터 private메서드 사용 가능
인터페이스는 데이터를 저장할 수 없기 때문에 데이터 저장을 위한 인스턴스 또는 정적 필드를 선언할 수 없으며, 오직 상수 필드만 선언이 가능합니다.
접근제어자 interface 인터페이스명 {
//필드
public static final 변수타입 변수명 = 값;
//메서드
public abstract 메서드명(매개변수){
}
}
//예시
public interface MyInterface {
public static final int a = 0;
//abstract키워드 생략 가능
public void myMethod(int num) {
}
}
인터페이스 구현
인터페이스는 일반 클래스 상속과 다르게 extends가 아닌 implements 키워드를 사용하여 구현합니다.
//기본 문법
public class 클래스명 implements 인터페이스명 {
}
//예시
public class MyClass implements MyInterface {
}
인터페이스 상속
인터페이스는 다른 인터페이스를 상속할 수 있으며, 다중 상속이 가능합니다. 상속은 클래스 상속과 동일하게 extends키워드를 사용합니다.
public interface 하위인터페이스명 extends 상위인터페이스명1, 상위인터페이스명2 {
}
+) 참고
'STUDY > Java' 카테고리의 다른 글
Java | java 11 설치하기 (0) | 2020.12.15 |
---|---|
Java | Primitive Types ( + Overflow/Underflow ) (0) | 2020.08.24 |
Java | 접근 제어자/접근 제한자 ( Access Modifier ) (0) | 2020.05.14 |
Java | 객체 지향 프로그래밍(OOP : Object Oriented Programming)의 주요 개념 (0) | 2020.05.14 |
Java | 컬렉션 프레임워크 Collection Framework ( List / Set / Map ) (0) | 2020.05.12 |