일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 프로그래머스 #mysql #경기도에 위치한 식품창고 목록 출력하기 #알고리즘 #코린이 #개발자 #study
- 프로그래머스 #아픈 동물 찾기 #mysql #알고리즘 #코린이 #개발자 #study
- 프로그래머스 #과일로 만든 아이스크림 고르기 #mysql #알고리즘 #코린이 #개발자 #study
- 백준 #다이얼 #5622 #알고리즘 #자바 #java #코린이 #개발자 #study
- 프로그래머스 #mysql #알고리즘 #코린이 #개발자 #study
- 프로그래머스 #알고리즘 #mysql #
- 프로그래머스 #알고리즘 #mysql #인기있는 아이스크림 #코린이 #개발자 #study
- 프로그래머스 #잡은 물고기의 평균 길이 구하기 #mysql #알고리즘 #코린이 #개발자 #study
- 백준 #
- 프로그래머스 #mysql #알고리즘 #이름이 있는 동물의 아이디 #코린이 #개발자 #study
- 프로그래머스 #mysql #알고리즘 #어린 동물 찾기 #코린이 #개발자 #study
- 프로그래머스 #가장 큰 물고기 10마리 구하기 #mysql #알고리즘 #코린이 #개발자 #study
- 프로그래머스 #모음 제거 #알고리즘 #자바 #java #코린이 #개발자 #study
- mysql #min() #max() #최소값 #최대값 #코린이 #개발자 #study
- 프로그래머스 #mysql #알고리즘 #자동차 대여 기록에서 장기/단기 대여 구분하기 #코린이 #개발자 #study
- 백준 #4153 #직각삼각형 #알고리즘 #자바 #java #코린이 #개발자 #study
- 프로그래머스 #동명 동물 수 찾기 #mysql #데이터베이스 #db #코린이 #개발자 #알고리즘
- 프로그래머스 #mysql #역순 정렬하기 #알고리즘 #코린이 #개발자 #study
- 프로그래머스 #mysql #흉부외과 또는 일반외과 의사 목록 출력하기 #알고리즘 #코린이 #개발자 #study
- 프로그래머스 #나이 정보가 없는 회원 수 구하기 #mysql #알고리즘 #코린이 #개발자 #study
- 프로그래머스 #잡은 물고기 중 가장 큰 물고기의 길이 구하기 #알고리즘 #mysql #코린이 #개발자 #study
- 코린이 #개발자 #study
- 프로그래머스 #조건에 맞는 회원수 구하기 #mysql #알고리즘 #코린이 #개발자 #study
- 백준 #일곱 난쟁이 #2309 #자바 #java #알고리즘 #코린이 #개발자 #study
- 프로그래머스 #한 해에 잡은 물고기 수 구하기 #mysql #알고리즘 #코린이 #개발자 #study
- 백준 #네 번째 점 #3009 #자바 #java #알고리즘 #코린이 #개발자 #study
- 프로그래머스 #python 개발자 찾기 #알고리즘 #mysql #코린이 #개발자 #study
- 프로그래머스 #mysql #동명 동물 수 찾기 #알고리즘 #코린이 #개발자
- 프로그래머스 #mysql #12세 이하인 여자 환자 목록 출력하기 #알고리즘 #코린이 #개발자 #study
- 특정 옵션이 포함된 자동차 리스트 구하기 #코린이 #개발자 #study
- Today
- Total
luke
[자바/Java] - 다형성(1)(다운캐스팅, 업캐스팅) 본문
다형성
다형성을 이해하기 위해서는 크게 2가지 핵심 이론을 알아야 한다.
- 다형적 참조
- 메서드 오버라이딩
먼저 다형적 참조를 알아 보겠다.
다형적 참조: 부모클래스는 자식클래스를 품을 수 있다.
바로 코드로 확인해 보자
<부모 클래스>
public class Parent {
public void parentMethod() {
System.out.println("Parent.parentMethod");
}
}
<자식 클래스>
public class Child extends Parent {
public void childMethod() {
System.out.println("Child.childMethod");
}
}
<Main 클래스>
public class PolyMain {
public static void main(String[] args) {
//부모 변수가 부모 인스턴스 참조
System.out.println("Parent -> Parent");
Parent parent = new Parent();
parent.parentMethod();
//자식 변수가 자식 인스턴스 참조
System.out.println("Child -> Child");
Child child = new Child();
child.parentMethod();
child.childMethod();
//부모 변수가 자식 인스턴스 참조(다형적 참조)
System.out.println("Parent -> Child");
Parent poly = new Child();
poly.parentMethod();
//Child child1 = new Parent(); 자식은 부모를 담을 수 없다.
//자식의 기능은 호출할 수 없다. 컴파일 오류 발생
//poly.childMethod();
}
}
<실행 결과>
Parent -> Parent
Parent.parentMethod
Child -> Child
Parent.parentMethod
Child.childMethod
Parent -> Child
Parent.parentMethod
메인 클래스 코드를 해석해 보겠다.
부모 타입의 변수가 부모 인스턴스 참조
- 부모 타입의 변수가 부모 인스턴스를 참조..
- Parent parent = new Parent()
- Parent 인스턴스를 만들었다. 이 경우 부모 타입인 Parent를 생성했기 댸문에 메모리 상에 Parent만 생성 된다.
- 생성된 참조값을 Parent 타입의 변수인 parent에 담아둔다.
- parent.parentMethod()를 호출하면 인스턴스의 Parent 클래스에 있는 parentMethod()가 호출된다.
자식 타입의 변수가 자식 인스턴스 참조
- 자식 타입의 변수가 자식 인스턴스를 참조.
- Child child = new Child()
- Child 인스턴스를 만들었다. 이 경우 자식 타입인 Child를 생성했기 때문에 메모리 상에 Child와 Parent가 모두 생성 된다.
- 생성된 참조값을 Child 타입의 변수인 child에 담아둔다.
- child.childMethod()를 호출하면 인스턴스의 Child 클래스에 있는 childMethod()가 호출된다.
이제 부터가 중요하다!!!
부모 타입의 변수가 자식 인스턴스 참조 (다형적 참조)
- 부모 타입의 변수가 자식 인스턴스를 참조한다.
- Parent poly = new Child()
- Child 인스턴스를 만들었다. 이 경우 자식 타입인 " Child "를 생성했기 때문에 메모리 상에 " Child "와 " Parent "가 모두 생성 된다.
- 생성된 참조값을 " Parent " 타입의 변수인 " poly "에 담아둔다.
다음으로 캐스팅 까지 정리해 보겠다.
다운캐스팅, 업캐스팅
다운캐스팅
위 부모 클래스와 자식 클래스를 사용해 "다운캐스팅" 먼저 알아 보겠다.
코드를 먼저 살펴 보자.
<다운캐스팅 코드>
public class CastingMain {
public static void main(String[] args) {
//부모 변수가 자식 인스턴스 참조(다형적 참조)
Parent poly = new Child();
//단 자식의 기능은 호출할 수 없다. 컴파일 오류 발생
//poly.childMethod();
//다운캐스팅(부모 타입 -> 자식 타입)
Child child = (Child) poly;
child.childMethod();
}
}
Child child = poly;
이 코드는 다음과 같이 자식은 부모를 담을 수 없다.
부모 타입을 사용하는 변수를 자식 타입에 대입하려고 하면 컴파일 오류가 발생한다.
이때는 다운캐스팅 기능을 사용해서 부모 타입을 잠깐 자식 타입으로 변경하면 된다.
Child child = (Child) poly;
(타입)처럼 괄호와 그 사이에 타입을 지정하면 참조 대상을 특정 타입으로 변경할 수 있다. 이렇게 특정 타입으로 변경 하는 것을 캐스팅이라 한다.
이렇게 다운캐스팅을 사용한 덕분에 child.childMethod()를 호출할 수 있게 되었다.
업캐스팅
다운캐스팅과 반대로 현재 타입을 부모 타입으로 변경하는 것을 업캐스팅이라 한다.
바로 코드를 보겠다.
<업캐스팅 코드>
public class CastingMain3 {
public static void main(String[] args) {
Child child = new Child();
Parent parent1 = (Parent) child; //업캐스팅은 생략 가능, 생략 권장
Parent parent2 = child; //업캐스팅 생략
parent1.parentMethod();
parent2.parentMethod();
}
}
<실행 결과>
Parent.parentMethod
Parent.parentMethod
업캐스팅은 다운캐스팅과 다르게 생략할 수 있다.
※ 출처: Inflearn 김영한-Java 강의 중
'Study > Java' 카테고리의 다른 글
[자바/Java] - compareTo() (문자열, 숫자 비교) (0) | 2024.04.17 |
---|---|
[자바/Java] - instanceof 연산자 (0) | 2024.01.14 |
[자바/Java] - 오버라이딩, 오버로딩 (2) | 2024.01.13 |
[자바/Java] - 상속 (0) | 2024.01.13 |
[자바/Java] - 자바 메모리 구조(스택과 큐 자료 구조) (0) | 2024.01.12 |