🐯
경민민 IT 핸드북
  • Orientation
    • 전달사항
    • 복습방법
    • 수료한 선배의 한마디
    • 간단 자기소개
    • 스터디
  • 백엔드
    • Java
      • 1장 프로그래밍 기초
      • 2장 자바 메모리구조
        • 1. Stack
        • 2. Heap
      • 6장 객체
      • 8장 상속
      • 9장 다형성
      • 10장 추상클래스와 인터페이스
      • 13장 Generic
      • 14장 Thread
      • 15장 Network
      • 16장 Lamda
        • 1. 내부 클래스 (Inner Class)
          • DTO , VO, Builder Pattern
        • 2. 람다 표현식 (Lambda Expression)
        • 3. 스트림 API (Stream API)
          • Optional
      • 17장 Enum
  • 프론트
    • Node.js
    • Java Script
      • ES6+
        • Node.js로 자바스크립트 실행
        • let , const , var
        • Destructuring문법
          • Rest(...) 문법
        • Arrow Function
        • 모듈
        • ETC
    • Type Script
      • 개요
      • TS설치 및 환경설정
      • 타입스크립트 기본
        • 기본 자료형들과 타입추론
        • Object, Array , Tuple
        • Any, Unknown, Union Type
        • Function Type
          • Type Assertion && Narrowing
          • Never type
        • Type Aliases와 Interface
        • 리터럴 타입
        • 함수 추가 문법
        • Class문법
        • 객체 타입 추가 문법
        • 실습문제 1차
        • 실습문제 2차
        • 실습문제 3차
    • React
      • 개요
      • SPA 와 MPA
        • SEO(작성예정)
      • 리액트 프로젝트 생성(18.3.1.ver)
        • HTML + react 샘플
        • CRA 와 Vite 비교
      • 리액트 개념들
        • Component
          • 클래스 컴포넌트(작성예정)
          • 함수형 컴포넌트(작성예정)
        • JSX
        • React Virtual Dom
          • Reconciliation
        • hook
          • useState
        • 리액트 데이터 전달
          • FLUX
      • 백엔드 서버 연동
        • 비동기요청
        • 웹소켓
        • Promise(작성예정)
      • 실습문제 1
      • 실습문제 2
      • 실습문제3
      • 실습문제4
  • 프레임워크
    • Spring
      • Spring 개발환경 구축
        • 프로젝트 환경설정
        • 프로젝트 생성
          • MVC Project 생성이슈
        • Maven 설정
        • web.xml 설정
        • Spring Bean Configuration.xml 설정
      • Spring Legacy Project
        • Spring 요청 및 응답 흐름
        • Spring 주요 Annotation
          • 의존성 주입방식의 차이점
          • @ModelAttribute와 유효성검사
          • 비동기처리
          • 스프링 예외처리
        • Logging
        • Pagination
        • Spring File 업로드 및 다운로드
        • Spring WebSocket
        • Spring AOP
      • Spring 라이브러리들(작성예정)
        • Lombok
        • Maven
        • MyBatis
      • Spring 구성 모듈(작성예정)
      • 스프링 과제
    • Spring Boot
      • Spring Boot 개발환경 구축
      • 스프링 부트 프로젝트 생성방법들
        • 프로젝트에서 사용하는 의존성들
      • 스프링 프로젝트 구조
        • SpringBootApplication
      • application.properties
      • Cross Origin
        • CORS
      • WebSocket
        • Stomp(작성중)
      • 로그인(작성중)
      • Spring Security(작성중)
      • 실습문제 Select
      • 실습문제 Update
      • 실습문제 Delete
  • 형상관리(Git)
    • GitHub설정
    • SourceTree를 활용한 깃허브 연동
      • 소스트리 설치
      • Clone
      • Branch
        • Branch Protection rules
          • Branch Protection Rules 상세규칙
        • Rebase 와 Squash (작성예정)
      • Team Project 설정
        • 팀장 프로젝트 셋팅
          • Collaborator
          • .gitignore 설정
        • 팀원 프로젝트 셋팅
        • 공통 프로젝트 진행
  • 프로젝트
    • 진행순서
      • 요구사항 분석 단계
        • 유용한 사이트
      • 프로그램 설계 단계
        • 유용한 사이트
      • 프로그램 구현단계
        • SourceTree를 활용한 Team Project설정
      • 테스트 단계
  • 배포
    • AWS-EC2 배포 연습
    • DevOps
      • IT시스템의 변화와 DevOps
      • DevOps 라이프사이클
    • 젠킨스
      • 도커
        • 도커 설치 방법
        • 도커 기본 명령어들
      • 젠킨스 설치
      • 젠킨스 프로젝트 생성
      • 젠킨스 소스코드 통합 - Github
      • 젠킨스 빌드 설정 - Maven
      • 배포 서버 구축하기
      • 파이프라인 구축
      • AWS 서버 생성
        • AWS 인스턴스 생성
        • AWS - Zenkins 연동
        • AWS - 배포서버 연동
        • AWS - Jenkins CI/CD파이프라인 구축
  • 유용한 사이트 모음
  • SQL
    • SQLD
      • 데이터 모델링의 이해 - 스키마
      • 데이터 모델링의 이해 - ERD
      • 데이터 모델링의 이해 - 정규화
      • 데이터 모델링의 이해 - NULL
      • SQL 기본 및 활용 - WINDOW FUNCTION
    • Oracle
      • 1장 개요
      • 2장 SQL
  • LLM 서비스
    • 1장 LLM에 대한 이해
    • 2장 프롬프트 엔지니어링
      • 프롬프트와 프롬프트 엔지니어링
      • GPT PlayGround
      • 프롬프트 작문 유형
      • 기본 프롬프트 엔지니어링 태크닉
      • 고급 프롬프트 엔지니어링 태크닉
        • ReAct Prompting
        • Active-Prompt
        • Reflexion
        • Graph Prompt
      • OpenAI API설정
      • OpenAI를 활용한 프롬프트 엔지니어링 실습
        • 실습 프롬프트
    • 3장 Lang Chain 프레임워크
      • LangSmith 프레임워크
        • LangSmith를 활용한 LangChain 모니터링 설정
      • LangChain 실습 1 - Prompt
        • 실습 코드
      • LangChain 실습 2 - LLM 캐시와 메모리
    • 4장 RAG
      • Document Loader - 문서 로더
      • Text Splitter - 텍스트 분할
      • Embedding - 임베딩
      • Vector Store - 벡터 저장소
      • Retriever - 검색기
      • ReRanker - 재평가자
      • RAG
Powered by GitBook
On this page
  • 1. 다형성
  • 1. 업캐스팅과 다운캐스팅
  • 2. 다형성과 메모리
  • 2. 동적 바인딩
  1. 백엔드
  2. Java

9장 다형성

Previous8장 상속Next10장 추상클래스와 인터페이스

Last updated 18 days ago

1. 다형성

다형성(Polymorphism) 이란 하나의 객체가 여러 형태를 가질 수 있는 성질을 의미합니다. !! 중요 !!

다형성의 특징으로 인해 자바에서는 부모 타입의 참조변수로 자식 타입의 객체를 참조할 수 있습니다.

자바에서는 클래스의 형변환(업캐스팅/다운캐스팅)을 통해 다형성을 구현하였습니다.

예시 코드

class Animal {
    void sound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

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

class Cat extends Animal {
    void sound() {
        System.out.println("야옹!");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal myAnimal1 = new Dog();
        Animal myAnimal2 = new Cat();
        myAnimal1.sound();  // 멍멍!
        myAnimal2.sound();  // 야옹!
    }
}

Animal 타입 참조변수 myAnimal1에 저장된 객체는 Dog 객체를 가리키고 있어, Dog의 sound()가 호출됩니다. 마찬가지로 myAnimal2 에 저장된 객체는 Cat객체를 가리키고 있으므로 Cat의 sound()가 호출됩니다. 이처럼 하나의 부모타입 참조변수로 자식타입의 객체들을 다룰 수 있으므로 코드를 유연하고, 확장성 있게 기술할 수 있습니다.

1. 업캐스팅과 다운캐스팅

업캐스팅(Upcasting)

  • 자식 타입 객체를 부모 타입 참조변수로 참조하는 것.

  • 자동 변환되며 명시적 형변환이 필요 없습니다.

  • 다형성을 가능하게 하는 핵심 메커니즘입니다.

Animal myAnimal = new Dog();  // 업캐스팅
myAnimal.sound();  // Dog의 오버라이딩된 sound() 호출

다운캐스팅(Downcasting)

  • 부모 타입 참조변수를 자식 타입으로 변환하는 것.

  • 명시적 형변환이 필요하며, 잘못된 다운캐스팅은 런타임 오류(ClassCastException)를 발생시킬 수 있습니다.

  • 자식에만 있는 메서드나 필드를 사용하고 싶을 때 필요합니다.

Animal myAnimal = new Dog();
Dog myDog = (Dog) myAnimal;  // 다운캐스팅
myDog.fetch();  // Dog 고유 메서드 호출

2. 다형성과 메모리

다형성의 작동원리를 이해하기 위해서는 다형성과 메모리의 관계를 파악하는게 중요합니다.

  • 참조 타입과 객체 타입은 다를 수 있습니다.

  • 메모리 구조:

    • 참조변수는 스택(stack) 메모리에 저장됩니다.

    • 객체(인스턴스)는 힙(heap) 메모리에 생성됩니다.

즉, 참조는 Animal 타입이지만, 진짜 객체는 Dog 이기 때문에, 코드실행 전인 컴파일단계에서는 Animal 클래스의 sound메서드를 가리키고 있고, 메서드를 호출할 때는 힙 메모리상의 실제 객체(Dog)의 메서드가 실행되는 것입니다.

2. 동적 바인딩

동적 바인딩(Dynamic Binding) 이란, 프로그램 실행 중에 호출할 메서드가 결정되는 것을 말합니다.

  • 클래스의 메서드들은 컴파일 시점에서 어떤 메서드가 호출될지 결정되지 않습니다.(상속이 불가능한 메서드 제외)

  • 자바에서는 상속의 기능으로 부모타입의 메서드를 오버라이딩 할 수 있고, 다형성의 특징으로 인해 실제 코드 실행시 이 오버라이딩된 메서드가 실행될 수 있기 때문에, 상속이 불가능한 경우를 제외한 모든 메서드 들은 실행 시점(runtime)에 실제 객체 타입을 기준으로 메서드가 연결됩니다.

예시로 다시 보기

Animal myAnimal = new Cat();
myAnimal.sound();  // 컴파일 시점: Animal의 sound() 호출 예정이지만 
                   // 실제론 어떤 메서드가 실행 될지 알수 없음.
                   // 실행 시점: Cat의 sound() 호출

정리

  • 다형성 덕분에 하나의 타입(Animal)으로 다양한 객체(Dog, Cat 등)를 처리할 수 있다.(업캐스팅)

  • 동적 바인딩 덕분에 실제 객체 타입에 맞는 메서드가 호출된다.

  • 만약 호출하고자 하는 메서드가 자식 클래스에만 존재하는 메서드라면 다운캐스팅 필요

항목
설명

다형성

하나의 타입으로 여러 객체를 가리킬 수 있음

메모리 관계

참조변수는 스택, 객체는 힙에 저장됨

동적 바인딩

실행 중 실제 객체 타입에 따라 메서드가 호출됨

업캐스팅/다운캐스팅ㅈ

자식 객

https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.wishbucket.io%2Fitems%2F797081&psig=AOvVaw0m25ErLADNPyd8SNqQg4Vo&ust=1745902712412000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCNDhp8n4-YwDFQAAAAAdAAAAABAn