티스토리 뷰
1. 추상 클래스(Abstract Class)란?
💡 추상 메소드
: 메소드의 기능이 없고 메소드의 헤더부만 존재하는 불완전한 메소드
💡 추상 메소드를 0개 이상 포함하는 클래스로 스스로 자신의 생성자를 활용한 인스턴스 생성이 불가능.
따라서 추상 클래스는 불완전한 클래스라고 볼 수 있다.
상속을 활용해 하위 클래스 타입의 인스턴스를 이용해서 인스턴스를 생성해야 한다.
추상 메소드를 하나라도 포함하면 불완전하다고 볼 수 있는 클래스이므로 반드시 추상 클래스가 되어야 한다.
2. 추상 클래스를 사용하는 이유
💡 스스로 인스터는 만들지 못하지만 다형성 적용을 위한 부모 타입 역할을 해낼 수 있다.
추상 메소드를 포함한 추상 클래스는 추상 메소드를 통해 자식 클래스에 오버라이딩에 대한 강제성을 부여할 수 있다.
(추상 클래스를 상속받는 자식 클래스는 반드시 추상 메소드를 오버라이딩 해야 한다.)
이는 필수 기능을 정의해 일관된 인터페이스(동일 기능)를 제공함에 있어 도움이 된다.
package com.ohgiraffers.section02.abstractclass;
public class Application {
public static void main(String[] args) {
/* 수업목표. 추상클래스와 추상메소드에 대해 이해할 수 있다. */
/* 필기.
* 추상클래스와 추상메소드
* < 추상클래스 >
* 추상메소드를 0개 이상 포함하는 클래스를 추상클래스라고 한다.
* 쉽게 말해 불완전한 클래스라고 생각할 수 있다.
* 불완전한 클래스는 별도로 생성자를 통해 객체를 생성하지 못한다.
* (단, 자식 클래스의 객체가 생성될 때는 내부적으로 생성될 수 있다.)
*
* 필기.
* < 추상메소드 >
* 메소드의 헤드(head)부만 있고 바디(body)부가 없는 메소드를 추상메소드라고 한다.
* 쉽게 말해 불완전한 메소드라고 생각할 수 있다.
* 불완전한 메소드를 하나라도 가진 클래스는 반드시 추상클래스가 되어야 한다.
* ex) public abstract void method();
* */
// 개념만 알자! 개발할 때는 사용 많이 안한다!
// 추상 = 불완전한
// Product product = new Product(); // 추상클래스는 객체 생성 X
/* 설명. abstract 메소드를 구현한 온전한 자식 클래스는 인스턴스(객체)를 생성할 수 있다. */
SmartPhone smartPhone = new SmartPhone();
Product smartPhone2 = new SmartPhone(); // 추상클래스도 다형성 적용 됨(타입은 물려준다.)
smartPhone.abstractMethod();
smartPhone2.abstractMethod(); // 동적바인딩에 의한 자식클래스의 오버라이딩 메소드 실행
}
}
// 실행 결과
Product 클래스로부터 물려받은 abstractMethod를 오버라이딩한 메소드 호출됨...
Product 클래스로부터 물려받은 abstractMethod를 오버라이딩한 메소드 호출됨...
package com.ohgiraffers.section02.abstractclass;
public abstract class Product { // 객체를 생성하지 못해서 오류 발생, 객체를 만들 필요가 없는 클래스
private int nonStaticField;
private static int staticField;
public Product() {
}
public void nonStaticMethod() {
}
public static void staticMethod() {
}
/* 설명. 추상메소드가 하나 이상 존재하면 해당 클래스는 반드시 추상클래스가 된다. */
public abstract void abstractMethod(); // 규약? 자식이 재정의해서 바디부를 만든다.
}
package com.ohgiraffers.section02.abstractclass;
public class SmartPhone extends Product{ // 오류가 규약! -> 오버라이드해라!
public SmartPhone() {
/* 설명. 추상클래스라도 자식 객체를 위해서는 객체가 생성된다. */
super();
}
/* 설명. 추상메소드를 물려받은 자식 클래스(온전한)는 반드시 오버라이딩 해야한다.(강제성 부여, 규약) */
@Override
public void abstractMethod() {
System.out.println("Product 클래스로부터 물려받은 abstractMethod를 오버라이딩한 메소드 호출됨...");
}
/* 설명. 추가적인 메소드도 작성할 수 있다. */
public void printSmartPhone() {
System.out.println("SmartPhone 클래스의 printSmartPhone 메소드 호출함...");
}
}
3. 추상 클래스와 인터페이스의 공통점과 차이점
3-1. 추상 클래스와 인터페이스의 차이점
구분 | 추상 클래스 | 인터페이스 |
상속 가능 범위 | 단일 상속 | 다중 상속 |
키워드 | extends 사용 | implements 사용 |
추상 메소드 갯수 | abstract 메소드 0개 이상 | 모든 메소드는 abstract |
abstract 키워드 명시 | 명시적 사용 | 묵시적으로 abstract |
3-2. 추상 클래스와 인터페이스의 공통점
구분 | 추상 클래스 | 인터페이스 |
자체 인스턴스 생성 | 생성 불가 | 생성 불가 |
다형성 적용 시 상위 타입 활용 가능 유무 |
가능 | 가능 |
'한화시스템 > 백엔드' 카테고리의 다른 글
[BE] JAVA_API_Object (0) | 2024.07.19 |
---|---|
[BE] JAVA_인터페이스 (0) | 2024.07.18 |
[BE] JAVA_다형성 (0) | 2024.07.17 |
[BE] JAVA_상속_오버라이딩 (0) | 2024.07.17 |
[BE] JAVA_상속_superkeyword (0) | 2024.07.17 |