backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • 다형성 (Polymorphism)
  • 1. 다형성이란?
  • 2. 다형성의 주요 특징
  • 3. 업캐스팅 (Upcasting)
  • 4. 다운캐스팅 (Downcasting)
  • 5. 다형성의 활용
  • 6. 정리
  1. 자바
  2. 09 클래스와 자료형

다형성 보충자료

다형성 (Polymorphism)

1. 다형성이란?

  • 정의: 하나의 부모 클래스 타입 변수가 여러 자식 클래스의 인스턴스를 참조할 수 있는 성질을 말합니다.

  • 특징:

    1. 부모 클래스 타입 변수로 자식 클래스의 객체를 참조할 수 있습니다. (업캐스팅)

    2. 반대로 자식 클래스의 타입 변수로 부모 객체를 참조할 수는 없습니다. (다운캐스팅 필요)


2. 다형성의 주요 특징

(1) 부모 타입 변수는 자식 인스턴스를 참조할 수 있다.

class Parent {
    void parentMethod() {
        System.out.println("Parent Method");
    }
}

class Child extends Parent {
    void childMethod() {
        System.out.println("Child Method");
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Parent parent = new Child(); // 부모 타입으로 자식 객체 참조 (업캐스팅)
        parent.parentMethod(); // 부모 메서드 호출 가능
        // parent.childMethod(); // 컴파일 오류 (부모 타입으로는 자식 메서드 호출 불가)
    }
}

(2) 오버라이딩된 메서드는 항상 우선순위 호출

  • 부모 타입으로 참조하더라도, 오버라이딩된 메서드는 실제 인스턴스의 메서드가 호출됩니다.

class Parent {
    void method() {
        System.out.println("Parent Method");
    }
}

class Child extends Parent {
    @Override
    void method() {
        System.out.println("Child Method");
    }
}

public class OverrideExample {
    public static void main(String[] args) {
        Parent parent = new Child(); // 부모 타입으로 자식 객체 참조
        parent.method(); // Child Method (오버라이딩된 메서드 호출)
    }
}

3. 업캐스팅 (Upcasting)

(1) 업캐스팅이란?

  • 정의: 자식 클래스의 객체를 부모 클래스 타입 변수로 참조하는 것을 말합니다.

  • 특징:

    • 업캐스팅은 명시적으로 선언하지 않아도 자동으로 처리됩니다.

    • 부모 타입으로 참조하면 부모 클래스에서 정의된 멤버(필드, 메서드)만 접근 가능합니다.

(2) 코드 예제

class Parent {
    void parentMethod() {
        System.out.println("Parent Method");
    }
}

class Child extends Parent {
    void childMethod() {
        System.out.println("Child Method");
    }
}

public class UpcastingExample {
    public static void main(String[] args) {
        Parent parent = new Child(); // 업캐스팅
        parent.parentMethod(); // 부모 클래스 메서드 호출 가능
        // parent.childMethod(); // 컴파일 오류 (부모 타입으로는 자식 메서드 호출 불가)
    }
}

4. 다운캐스팅 (Downcasting)

(1) 다운캐스팅이란?

  • 정의: 부모 타입 변수를 자식 클래스 타입으로 변환하여, 자식 클래스의 멤버(필드, 메서드)에 접근할 수 있도록 하는 것.

  • 특징:

    • 다운캐스팅은 명시적으로 선언해야 합니다.

    • 부모 타입이 실제로 참조하는 자식 객체만 다운캐스팅이 가능합니다.

    • 부모 타입이 자식 객체를 참조하지 않는 경우 다운캐스팅은 런타임 오류를 발생시킵니다.


(2) 다운캐스팅 코드 예제

정상적인 다운캐스팅

class Parent {
    void parentMethod() {
        System.out.println("Parent Method");
    }
}

class Child extends Parent {
    void childMethod() {
        System.out.println("Child Method");
    }
}

public class DowncastingExample {
    public static void main(String[] args) {
        Parent parent = new Child(); // 업캐스팅
        parent.parentMethod();

        // 자식 메서드를 호출하기 위해 다운캐스팅
        if (parent instanceof Child) { // 타입 검사
            Child child = (Child) parent; // 다운캐스팅
            child.childMethod(); // 자식 클래스 메서드 호출
        }
    }
}

잘못된 다운캐스팅 (런타임 오류)

class Parent {
    void parentMethod() {
        System.out.println("Parent Method");
    }
}

class Child extends Parent {
    void childMethod() {
        System.out.println("Child Method");
    }
}

public class InvalidDowncastingExample {
    public static void main(String[] args) {
        Parent parent = new Parent(); // 부모 객체 생성
        // Child child = (Child) parent; // 런타임 오류 발생 (ClassCastException)
    }
}

왜 다운캐스팅은 명시적으로 선언해야 하는가?

  • 부모 타입이 항상 자식 객체를 참조한다고 보장할 수 없기 때문입니다.

  • 예를 들어, 아래와 같이 부모 객체를 생성하고 이를 자식 타입으로 변환하려 하면 런타임 오류가 발생합니다.


(3) 일시적인 다운캐스팅 예제

  • 자식 클래스의 특정 메서드를 한 번 호출한 뒤 다시 부모 타입으로 유지합니다.

class Parent {
    void parentMethod() {
        System.out.println("Parent Method");
    }
}

class Child extends Parent {
    void childMethod() {
        System.out.println("Child Method");
    }
}

public class TemporaryDowncastingExample {
    public static void main(String[] args) {
        Parent parent = new Child(); // 업캐스팅
        ((Child) parent).childMethod(); // 일시적 다운캐스팅으로 자식 메서드 호출
        parent.parentMethod(); // 여전히 부모 타입으로 유지
    }
}

5. 다형성의 활용

다형성을 활용하면 동일한 부모 타입으로 다양한 자식 객체를 처리할 수 있습니다.

(1) 코드 예제

class Animal {
    void sound() {
        System.out.println("Some sound");
    }
}

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

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("Meow");
    }
}

public class PolymorphismUsageExample {
    public static void main(String[] args) {
        Animal[] animals = {new Dog(), new Cat()}; // 업캐스팅
        for (Animal animal : animals) {
            animal.sound(); // 실제 객체에 따라 다른 메서드 호출
        }
    }
}

실행 결과

Bark
Meow

  1. 부모 클래스와 자식 클래스의 메모리 구조

    • 자식 인스턴스를 생성하면 부모 클래스의 필드와 메서드가 메모리 상에 함께 생성됩니다.

    • 부모 타입으로 참조하면 부모 클래스의 멤버만 접근 가능.

업캐스팅: Parent poly = new Child();

+----------------------+
| Parent Reference     | --> poly
+----------------------+
          |
          v
+----------------------+    +---------------------+
| Parent Instance      |    | Child Instance      |
| - parentField        |    | - childField        |
| - parentMethod()     |    | - childMethod()     |
+----------------------+    +---------------------+

6. 정리

구분

설명

업캐스팅

자식 객체를 부모 타입 변수로 참조 (자동 변환 가능). 부모 멤버만 접근 가능.

다운캐스팅

부모 타입 변수를 자식 타입으로 변환. 자식 멤버에 접근 가능. 명시적으로 선언해야 하며, 타입 검사 필요.

오버라이딩

부모 타입으로 참조하더라도 오버라이딩된 메서드는 자식 클래스의 메서드가 호출됨.

다형성 활용

동일한 부모 타입으로 다양한 자식 객체를 처리 가능. 코드 확장성과 재사용성 증가.

Previous09 클래스와 자료형Next제네릭 보충자료

Last updated 5 months ago