class 자식클래스 extends 부모클래스 {
// 필드
// 생성자
// 메소드
}
❗주의사항
public 자식클래스() {
super();
}
super()
→ 부모의 기본 생성자 호출
상황 | super 호출 여부 |
---|---|
부모 클래스에 기본 생성자만 있을 때 | 자동 호출 → 생략 가능! |
부모 클래스에 명시적 생성자만 있을 때 | 반드시 super() 명시해야 함 |
✅ 메소드 재정의 방법
✅ 부모 메서드 호출
super.부모메서드();
public final class..
라고 선언 → 자식 클래스 생성 불가🤔 왜 자동 타입 변환이 필요할까?
필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기에!
Parent parent = new Child(); // 자동 타입 변환
Child child = (Child) parent; // 강제 타입 변환
🚨 제약 사항
🤔 공통적인 특성을 뽑아내서 추상 클래스로 만드는 이유는?
public abstract class 클래스 {
// 필드
// 생성자
// 메소드
}
✅ 실체 클래스 생성
추상 클래스 → 실체 클래스의 공통되는 필드와 메소드를 추출 ⇒ 객체 직접 생성 사용 ❌
People say = new People(); // People이 추상 클래스라면 이렇게 사용할 수 없음.
class Hong extends People { ... } // 새로운 실체 클래스를 만들기 위한 부모 클래스로만 사용된다.
이를 활용한 추가 실습을 진행해보쟈.
public abstract class HttpServlet {
public abstract void service();
}
HttpServlet 추상 클래스를 사용해서
public class HttpServletExample {
public static void main(String[] args) {
method(new LoginServlet());
method(new FileDownloadServlet());
}
public static void method(HttpServlet servlet) {
servlet.service();
}
}
와 같은 이미지의 결과가 나오도록 LoginServlet와 FileDownloadServlet 클래스를 선언하자.
public class FileDownloadServlet extends HttpServlet {
@Override
public void service() {
System.out.println("파일 다운로드합니다.");
}
}
--------------------------------------------------------
public class LoginServlet extends HttpServlet {
@Override
public void service() {
System.out.println("로그인 합니다.");
}
}
HttpServlet를 상속한 후 추상 메소드인 service()를 재정의해서 원하는 로직을 작성하기만 하면 간단하게 구현할 수 있다-!