이상민
[혼공자바 4주차] Chapter 07 본문
07-1 상속
1. 상속의 개념
- 부모 클래스의 필드와 메서드를 자식 클래스가 물려받는 것.
- 코드 재사용을 높이고 유지 보수를 쉽게 만듦.
2. 상속 문법
// 자식 클래스 내용
}
- 한 클래스만 상속 가능 (자바는 단일 상속).
3. 부모 생성자 호출 (super)
- 자식 객체 생성 시 먼저 부모 객체가 생성됨.
- 부모 생성자를 명시적으로 호출하려면 super() 사용.
- 부모에 매개변수 있는 생성자가 있으면 반드시 super(매개변수)로 호출해야 함.
4. 메서드 오버라이딩 (재정의)
- 자식 클래스가 부모 클래스의 메서드를 다시 정의하는 것.
- 조건:
- 메서드 이름, 매개변수 동일
- 접근 제한자는 더 좁게 못 바꿈
- @Override 애너테이션 권장 사용
5. final 키워드
- final class: 상속 불가
- final method: 오버라이딩 불가







07-2 타입 변환과 다형성
1. 타입 변환(Type Conversion)
- 자동 타입 변환 (자동 형변환, Upcasting)
- Animal animal = new Cat(); 가능
- 자식 객체를 부모 타입으로 저장 가능
- 상속 관계에서만 가능
- 변수는 부모 타입이지만, 메서드는 자식 클래스에서 재정의된 것을 실행 (동적 바인딩)
- 강제 타입 변환 (다운캐스팅, Downcasting)
- 부모 타입으로 저장된 객체를 다시 자식 타입으로 변환할 때 사용
- 문법: 자식타입 변수 = (자식타입) 부모객체;
Parent parent = new Child();
Child child = (Child) parent;
2. 다형성 (Polymorphism)
- 같은 타입(부모 클래스)으로 다양한 자식 객체를 참조할 수 있는 성질
- 실행 결과는 자식 클래스에 따라 다름
- 필드는 부모 기준으로 접근 → 자식 필드는 사용 불가
- 메서드는 오버라이딩된 자식 메서드가 호출됨 (다형성의 핵심)
Parent parent = new Child(); // 자동 타입 변환
parent.method(); // Child에 오버라이딩된 메서드 실행됨
3. 타입 변환 예시
- A a = new D(); (가능)
- B b = new D(); (가능)
- C c = new E(); (가능)
- B b = new E(); (불가능: 상속 관계 X)




07-3 추상 클래스 (Abstract Class)
1. 추상 클래스란?
- 실체가 없는 클래스, 객체 생성 불가
- 공통 필드나 메서드를 정의하여 상속 전용으로 사용
- abstract 키워드 사용
public abstract void sound(); // 추상 메서드
}
2. 추상 메서드
- 구현 없이 선언만 존재
- 자식 클래스에서 반드시 오버라이딩 필요
@Override
public void sound() {
System.out.println("멍멍");
}
}
3. 추상 클래스의 용도
- 공통된 기능은 추상 클래스에 작성
- 세부 기능은 자식 클래스에서 구현
- 예: Animal → Dog, Cat, Phone → SmartPhone
4. 추상 클래스 활용 예시
String owner;
public Phone(String owner) { this.owner = owner; }
abstract void internetSearch();
}
class SmartPhone extends Phone {
public SmartPhone(String owner) {
super(owner);
}
@Override
void internetSearch() {
System.out.println("인터넷 검색 중...");
}
}



기본 숙제(필수) : 클래스의 타입 변환에는 어떤 것이 있는지 정리하고 공유하기
1. 업캐스팅 (Upcasting)
- 자식 클래스 → 부모 클래스로 변환하는 것
- 자동 형 변환이 일어남 (명시적 형변환 필요 없음)
- 안전함, 자식 객체는 부모의 형태를 항상 가짐
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
void bark() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
Animal ani = dog; // 업캐스팅 (자동 형변환)
ani.sound(); // OK
// ani.bark(); // 오류: 부모 타입으로는 자식의 기능 사용 불가
}
}
2. 다운캐스팅 (Downcasting)
- 부모 클래스 → 자식 클래스로 변환하는 것
- 명시적 형변환이 필요함
- 실제로 자식 타입의 인스턴스여야 안전함
- 잘못된 다운캐스팅은 ClassCastException 발생
- 잘못된 다운캐스팅 예 :
- Animal ani = new Animal(); // 실제로는 Animal 객체
Dog dog = (Dog) ani; // 오류 발생: ClassCastException
dog.bark();
Dog dog = (Dog) ani; // 다운캐스팅 (명시적으로 형변환)
dog.bark(); // OK
3. instanceof 연산자 (다운캐스팅 전에 확인)
다운캐스팅 시 예외를 방지하기 위해 instanceof로 객체의 실제 타입을 확인하는 것이 좋습니다.
- if (ani instanceof Dog) {
Dog dog = (Dog) ani;
dog.bark();
} else {
System.out.println("다운캐스팅 불가");
}
추가 숙제(선택) : p.389 (07-3) 확인 문제 3번을 풀고 풀이 과정 설명하기
// 추상 클래스
public abstract class HttpServlet {
public abstract void service();
}
// LoginServlet 클래스
public class LoginServlet extends HttpServlet {
@Override
public void service() {
System.out.println("로그인 합니다.");
}
}
// FileDownloadServlet 클래스
public class FileDownloadServlet extends HttpServlet {
@Override
public void service() {
System.out.println("파일 다운로드 합니다.");
}
}
// 메인 클래스
public class HttpServletExample {
public static void main(String[] args) {
method(new LoginServlet()); // "로그인 합니다." 출력
method(new FileDownloadServlet()); // "파일 다운로드 합니다." 출력
}
public static void method(HttpServlet servlet) {
servlet.service();
}
}
풀이 과정 설명
1. 추상 클래스 만들기
public abstract void service(); // 추상 메서드
}
- HttpServlet은 추상 클래스입니다.
- service()는 몸체가 없는 추상 메서드로 선언되어, 자식 클래스가 반드시 구현해야 합니다.
2. 자식 클래스: LoginServlet 정의
@Override
public void service() {
System.out.println("로그인 합니다.");
}
}
- 추상 메서드 service()를 오버라이딩합니다.
- 출력문: "로그인 합니다."
3. 자식 클래스: FileDownloadServlet 정의
@Override
public void service() {
System.out.println("파일 다운로드 합니다.");
}
}
- 역시 service()를 오버라이딩.
- 출력문: "파일 다운로드 합니다."
4. 메인 클래스: 다형성 활용
public static void main(String[] args) {
method(new LoginServlet()); // → "로그인 합니다."
method(new FileDownloadServlet()); // → "파일 다운로드 합니다."
}
public static void method(HttpServlet servlet) {
servlet.service(); // 다형성 적용: 실제 객체의 오버라이딩된 메서드 실행
}
}
- method()는 HttpServlet 타입을 매개변수로 받지만,
실제로는 LoginServlet, FileDownloadServlet 객체를 전달하므로
각각의 service() 구현이 실행됩니다.
'혼공' 카테고리의 다른 글
| [혼공자바 6주차] Chapter 10~11 (2) | 2025.08.16 |
|---|---|
| [혼공자바 5주차] Chapter 08~09 (4) | 2025.08.08 |
| [혼공자바 3주차] Chapter 06 (1) | 2025.07.20 |
| [혼공자바 2주차] Chapter 04 ~ 05 (1) | 2025.07.07 |
| [혼공자바 1주차] Chapter 01 ~ 03 (1) | 2025.07.01 |