1. 추상클래스
- 선언만 있고 정의가 없는 하나 이상의 메소드(추상 메소드)를 갖는 클래스로 하위 클래스(자식 클래스)에서 오버라이딩(Overriding)할 것으로 예상되는 메소드에 대해 메모리 낭비 없이 미리 호출 계획을 세워두기 위해 생성하는 클래스
- 클래스가 적어도 하나 이상의 추상 메소드를 포함할 때, 그 클래스는 클래스 앞에
abstract키워드를 붙여 추상 클래스로 명시해야 하며, 추상 클래스로 선언한 경우에는 불완전한 형태의 클래스이므로 객체 생성 불가능 - 즉, 추상 클래스는 독립적으로 존재할 수 없기 때문에 상속을 위해서 존재하며 추상 클래스를 상속받는 하위 클래스에서는 (하위 클래스 인스턴스 생성을 하기 위해서는) 반드시 추상 메소드를 오버라이딩(Overriding) 해야 함
abstract키워드는 클래스와 메소드에서만 사용할 수 있으며 멤버 변수나 로컬 변수에서는 사용할 수 없음
· 형식 및 구조
[접근제어 지시자] abstract class 클래스명
{
[접근제어 지시자] abstract 자료형 메소드명([매개변수],...);
}
2. 인터페이스
- 클래스를 위한 템플릿으로써의 기능을 수행하는 추상 클래스의 한 종류. 완전히 미완성(다 비어있는)된 채로 남겨져 인터페이스 안에 존재하는 그 어떤 메소드도 몸체(정의부)가 없기 때문에 사실상 실행 부분이 존재하지 않음
- 인터페이스는 클래스와 달리 다중 상속이 가능하며 인터페이스 자체도 상속됨. 기존의 C++ 언어 등에서 지원되는 다중 상속이 사용 과정에서 많은 문제점을 노출시켰기 때문에 자바에서는 다중 상속의 개념을 인터페이스라는 개념으로 변형하여 인터페이스를 통해 다중 상속을 구현하는 방법을 지원
- 인터페이스는 상수(
public static final 변수)와 추상 메소드만 가질 수 있음 - 인터페이스의 멤버 변수는
static final을 별도로 명시하지 않아도 자동으로static final인 상태이며, 인터페이스 안의 메소드들은 접근제어지시자를 명시하지 않아도public abstract으로 설정되어 클래스에서 구현(implements)함으로써 바로 접근이 가능 - 하나 이상의 인터페이스를
implements하는 것(다중상속)이 가능하며, 인터페이스를 implements 한 클래스는 인터페이스의 모든 메소드를 Overriding 해야함 - 인터페이스는 다른 인터페이스를 상속받을 수 있으며 이 때,
extends키워드를 사용
클래스 extends 클래스
클래스 extends 추상클래스
인터페이스 extends 인터페이스
인터페이스 extends 인터페이스, 인터페이스, ...
추상클래스 implements 인터페이스
추상클래스 implements 인터페이스, 인터페이스, ...
클래스 implements 인터페이스
클래스 implements 인터페이스, 인터페이스, ...
· 예시
interface Demo
{
public static final double PI = 3.141592;
public int a = 10;
public void print();
}
// 인터페이스를 구현하는 클래스 (-> print() 메소드 재정의)
class DemoImpl implements Demo
{
@Override
public void print()
{
System.out.println("인터페이스 메소드 재정의...");
}
public void write()
{
System.out.println("클래스에 정의된 메소드...");
}
}
// main() 메소드를 포함하는 외부의 다른 클래스
public class Test117
{
public static void main(String[] args)
{
//Demo ob = new Demo(); //-- 생성 불가~!!!
//-- 인터페이스는 인스턴스를 생성할 수 없음
// 업 캐스팅
Demo ob = new DemoImpl(); //-- 업 캐스팅
ob.print();
//--==>> 인터페이스 메소드 재정의...
//ob.write();
//--==>> 에러 발생(컴파일 에러)
// cannot find symbol
// 다운 캐스팅
((DemoImpl)ob).write();
//--==>> 클래스에 정의된 메소드...
System.out.println(Demo.PI); //-- static
//--==>> 3.141592
System.out.println(Demo.a); //-- static
//--==>> 10
//Demo.a = 300; //-- final
//--==>> 에러 발생(컴파일 에러)
}
}
→ JDK 1.5(5.0)에서는 인터페이스 메소드를 오버라이딩(Overriding) 할 때, @Override 어노테이션(annotation)을 사용할 수 없음. 이는 JDK 1.6(6.0) 이후부터 적용 가능한 문법
'Java' 카테고리의 다른 글
| [JAVA] Chapter 10. JDBC 프로그래밍 절차 (0) | 2023.12.07 |
|---|---|
| [JAVA] Chapter 9. JDBC 개념 (0) | 2023.12.05 |
| [JAVA] Chapter 6. 상속 (0) | 2023.11.07 |
| [JAVA] Chapter 5. 객체와 클래스 (0) | 2023.11.07 |
| [JAVA] Chapter 4. 배열 (0) | 2023.11.07 |