Java 상속(Inheritance) 이해하기 - 업캐스팅, 다운캐스팅

2025. 4. 14. 13:38·Java

 

 

 

 

우선, 메서드와 생성자의 정확한 차이부터 짚고 가야한다.

 

 

 

메서드와 생성자 차이

구분 메서드 (Method) 생성자 (Constructor)
목적 객체가 가진 동작/기능을 정의 객체가 생성될 때 초기화
이름 아무 이름 가능 클래스 이름과 동일해야 함
반환 타입 있어야 함 (void, int, etc) ❌ 없음 (void도 안 씀)
호출 시점 객체가 만들어진 후 호출 new 클래스명() 할 때 자동 호출
호출 방법 객체.메서드() new 클래스()
상속/오버라이딩 메서드는 오버라이드 가능 생성자는 상속/오버라이드 불가 (다만 super()로 호출 가능)

 

 

 

 


 

 

 

업캐스팅과 다운캐스팅

 

개념 방향 설명
업캐스팅 자식 → 부모 자식 객체를 부모 타입으로 참조 (자동)
다운캐스팅 부모 → 자식 부모 타입 참조를 자식 타입으로 형변환 (명시적)
    단, 실제 객체가 자식 타입일 때만 가능

 

Parent p = new Child();   // 업캐스팅 (자동)
Child c = (Child)p;       // 다운캐스팅 (명시적으로)

 

 

 

 

 

예제1) 정보처리기사 실기 2023년 3회

public class main{
    public static void main(String[] args) {
        A b = new B();
        b.paint();
        b.draw();
    }
}
 
class A {
    public void paint() {
        System.out.print("A");
        draw();
    }
    public void draw() {
        System.out.print("B");
        draw();
    }
}
 
class B extends A {
    public void paint() {
        super.draw();
        System.out.print("C");
        this.draw();
    }
    public void draw() {
        System.out.print("D");
    }
}

 

출력 결과
BDCDD

 

코드 의미
this.draw() 오버라이딩된 메서드 호출됨 (B)
draw() 오버라이딩된 메서드 호출됨 (B)
super.draw() (B 내부) 부모의 draw 호출 가능 (A)
A 내부에서 강제로 A의 draw만 호출 불가능 → 다른 메서드로 분리해서 써야 함

 

 

 

 

 

 

 

 

 

예제2) 정보처리기사 실기 2024년 1회

class classOne {
    int a, b;
 
    public classOne(int a, int b) {
        this.a = a;
        this.b = b;
    }
 
    public void print() {
        System.out.println(a + b);
    }
 
}
class classTwo extends classOne {
    int po = 3;
    
    public classTwo(int i) {
        super(i, i+1);
    }
 
    public void print() {
        System.out.println(po*po);
    }
}
 
public class main {  
    public static void main(String[] args) {
        classOne one = new classTwo(10);
        one.print();
    }
}

 

출력 결과
9

 

코드 의미
super(i, i+1) 부모 클래스의 생성자 호출 (초기화)
super.print() 부모 클래스의 print() 메서드 호출
one.print() (오버라이딩된) 자식 클래스의 print() 호출

 

 

 

 

 

 

 

 

예제3) 정보처리기사 실기 2023년 1회

class Parent {
    int x = 100;
 
    Parent() {
        this(500);
    }
 
    Parent(int x) {
        this.x = x;
    }
 
    int getX() {
        return x;
    }
}
 
class Child extends Parent {
    int x = 4000;
    
    Child() {
        this(5000);
    }
 
    Child(int x) {
        this.x = x;
    }
}
 
public class Main {
    public static void main(String[] args) {
        Child obj = new Child();
        System.out.println(obj.getX());
    }
}

 

출력 결과
500

 

① new Child()로 child의 기본 생성자 호출

② 기본 생성자에서 this(5000) 호출하여 Child(int x)로 넘어감

③ Child(int x)는 super() 클래스가 숨겨진 형태

Child(int x) {
    super();      // 자동 삽입됨 ⬅ 부모 기본 생성자 호출
    this.x = x;   // Child.x = 5000
}

 

④ 그러므로 super(); → Parent() 생성자 호출

⑤ Parent(int x) 호출, Parent.x = 500

⑥ this.x → Parent의 x

⑦ 500 리턴

 

 

 

 

 

‼️생성자 호출용 this()가 없다면 super()가 자동 삽입됨

 

 

예제4) 정보처리기사 실기 2025년 1회

class Parent {
    static int total = 0;
    int v = 1;

    public Parent() {
        total += (++v);
        show();    
    }

    public void show() {
        total += total;
    }
}

class Child extends Parent {
    int v = 10;

    public Child() {
        v += 2;
        total += v++;
        show();
    }

    @Override
    public void show() {
        total += total * 2;
    }
}

public class Gisafirst {
    public static void main(String[] args) {
        new Child();
        System.out.println(Parent.total);
    }
}

 

출력결과
54

 

 

① new Child(); 실행됨

② Child() 생성자 진입

③ 자동으로 super(); 호출

④ super(); → Parent() 생성자 실행 (v = 2, total = 2)

⑤ Parent() 내에서 show() 호출

⑥ 오버라이딩된 Child.show() 실행 (total = 6)

⑦ 그 후에 다시 Child 생성자 나머지 코드 실행 (v = 12, total = 18, v = 13)

⑧ show() 호출 → Child의 show 호출 (total = 18 + 18 * 2 = 54)

⑨ Parent.total 호출 → 54 출력

 

 

 

 

반응형

'Java' 카테고리의 다른 글

[Java] isEmpty()와 isBlank()의 차이  (0) 2024.01.29
[Java] 그래프 너비 우선 탐색 알고리즘 Breadth-First Search  (0) 2023.01.20
[Java] 트리 순회 알고리즘  (1) 2023.01.20
'Java' 카테고리의 다른 글
  • [Java] isEmpty()와 isBlank()의 차이
  • [Java] 그래프 너비 우선 탐색 알고리즘 Breadth-First Search
  • [Java] 트리 순회 알고리즘
오은이
오은이
  • 오은이
    오은이 하우스
    오은이
  • 전체
    오늘
    어제
    • 분류 전체보기 (85)
      • 일기 (2)
      • Python (1)
      • Java (4)
      • CS (2)
      • 코딩테스트 (26)
        • 백준 (25)
        • 프로그래머스 (1)
      • 웹 개발 (18)
        • Spring (7)
        • JavaScript (3)
        • WebSquare (5)
        • React (3)
      • DB (5)
        • MySQL (4)
        • Oracle (1)
      • 서버&인프라 (18)
        • Server (5)
        • Cloud (12)
        • Linux (1)
      • 자격증 (9)
        • 정보처리기사 (2)
        • AICE (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    AICE Associate
    docker배포
    react
    dockerspring
    백준
    리액트
    websquare
    Apache
    티스토리챌린지
    백준자바
    EC2
    머신러닝
    tomcat
    Associate
    SpringBoot
    클라우드 배포
    자바
    db
    AICE
    웹스퀘어
    cloud DB
    AI
    알고리즘
    톰캣
    오블완
    Java
    MySQL
    클라우드
    docker
    Spring
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
오은이
Java 상속(Inheritance) 이해하기 - 업캐스팅, 다운캐스팅
상단으로

티스토리툴바