상속 시리즈
2) Abstract <<
3) Interface
// 부모 클래스에서 print라는 함수를 만들건데,
// 이 클래스를 상속받을 사람들은
// 자기네들이 알아서 메소드를 작성할거니까 (==오버라이드)
// 내가 코드 구현은 하지 않고, 함수이름만 통일해주자!
메소드의 시그니처만 정의하고, 구체적인 구현은 없는 메소드 = 추상메소드(Abstract)
public abstract void print();
// 이름만 작성하고 메소드 내용은 작성 X, {}도 안써도 된다.
// 함수이름은 정해두고(통일), 내용은 각 클래스에서 작성
// abstract 뜻은 추상적이다~
// 클래스 이름 앞에 abstract도 작성
// 상속받은 클래스는 이 함수 꼭 구현해야해~
package entity;
public abstract class Parent {
// 이름과 나이를 저장하는 클래스를 만들기
String name;
int age;
public Parent() {
}
public Parent(String name, int age) {
this.name = name;
this.age = age;
}
public void hello(){
System.out.println(name+" 님, 안녕하세요?");
}
// 이 클래스에서 print라는 함수를 만들건데,
// 어차피 print 함수 만들면
// 이 클래스를 이용하는 사람들은
// 자기네들이 알아서 내용을 작성할거니까 (==오버라이드)
// 내가 코드 구현은 하지 않고, 함수이름만 정해주자!
public abstract void print();
// 아무것도 작성 안함 {}도 안써도된다.
// 함수이름은 정해두고(통일), 내용은 각 클래스에서 작성
// abstract 추상적이다~
// 상속받은 클래스는 이 함수 구현해야해~
}
Chlid 클래스를 만들면
꼭 구현해야하는 메소드가 있다는 경고가 뜬다.
abstract에 추상메서드가 있기 때문!
abstract 키워드의 특징
- 추상 클래스: abstract 키워드가 클래스 앞에 붙으면 해당 클래스는 추상 클래스가 된다.
- 추상 메소드: 메소드 선언 앞에 abstract 키워드가 붙으면 해당 메소드는 추상 메소드가 된다.
- 구현 강제: 추상 클래스나 추상 메소드를 사용하기 위해서는 반드시 상속하여 구현해야한다.
- 인스턴스화 불가: 추상 클래스는 직접 인스턴스화할 수 없다.
- 구체적 구현 필요: 추상 메소드를 포함한 클래스를 상속받은 하위 클래스는 반드시 해당 추상 메소드를 오버라이딩하여 구체적인 구현을 제공해야 합니다
abstract 키워드를 쓰는 이유
- 코드 재사용성 증대: 공통된 특성을 추상 클래스에 정의하여 중복 코드를 줄이고 재사용성을 높이기 위함
- 구조적 설계 강화: 클래스에 추상화를 접목시켜 더 구조적인 객체 설계가 가능
- 유지보수성 향상: 공통 사항을 한 곳에서 관리하여 개발 및 유지보수가 용이해짐
- 프로그램의 표준화: 자식 클래스에서 추상 메소드를 반드시 구현하도록 강제하여 프로그램의 표준화 수준을 높임
- 설계와 구현의 분리: 추상 클래스는 기본적인 틀을 제공하고, 구체적인 구현은 자식 클래스에 위임
- 다형성 구현: 추상 클래스를 통해 다형성을 효과적으로 구현
- 프레임워크 개발: 범용 라이브러리나 프레임워크 시스템을 설계하는 데 유용하게 사용
즉, 협업을 하기 위해서다!