Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Archives
Today
Total
관리 메뉴

이상민

[혼공자바 4주차] Chapter 07 본문

혼공

[혼공자바 4주차] Chapter 07

sm1118sm 2025. 7. 27. 15:39

07-1 상속

 

1. 상속의 개념

  • 부모 클래스의 필드와 메서드를 자식 클래스가 물려받는 것.
  • 코드 재사용을 높이고 유지 보수를 쉽게 만듦.

 

2. 상속 문법

class 자식클래스 extends 부모클래스 {
    // 자식 클래스 내용
}
  • 한 클래스만 상속 가능 (자바는 단일 상속).

 

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 class Animal {
    public abstract void sound(); // 추상 메서드
}

 

2. 추상 메서드

  • 구현 없이 선언만 존재
  • 자식 클래스에서 반드시 오버라이딩 필요

 

public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}

 

3. 추상 클래스의 용도

  • 공통된 기능은 추상 클래스에 작성
  • 세부 기능은 자식 클래스에서 구현
  • 예: Animal → Dog, Cat, Phone → SmartPhone

 

4. 추상 클래스 활용 예시

abstract class Phone {
    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)

  • 자식 클래스 → 부모 클래스로 변환하는 것
  • 자동 형 변환이 일어남 (명시적 형변환 필요 없음)
  • 안전함, 자식 객체는 부모의 형태를 항상 가짐
class Animal {
    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();
Animal ani = new Dog();       // 업캐스팅
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 class HttpServlet {
    public abstract void service(); // 추상 메서드
}
  • HttpServlet은 추상 클래스입니다.
  • service()는 몸체가 없는 추상 메서드로 선언되어, 자식 클래스가 반드시 구현해야 합니다.

2. 자식 클래스: LoginServlet 정의

 
public class LoginServlet extends HttpServlet {
    @Override
    public void service() {
        System.out.println("로그인 합니다.");
    }
}
  • 추상 메서드 service()를 오버라이딩합니다.
  • 출력문: "로그인 합니다."

3. 자식 클래스: FileDownloadServlet 정의

 
public class FileDownloadServlet extends HttpServlet {
    @Override
    public void service() {
        System.out.println("파일 다운로드 합니다.");
    }
}
  • 역시 service()를 오버라이딩.
  • 출력문: "파일 다운로드 합니다."

4. 메인 클래스: 다형성 활용

 
public class HttpServletExample {
    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