일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- dbms
- data structure
- Queue
- 알고리즘
- sql
- Algorithm
- 자바의정석
- 암호학
- javascript
- 생성자
- JDBC
- 자료구조
- dfs
- 코테
- python
- 클라우드 컴퓨팅
- JPA
- Stack
- 공개키 암호화
- generic class
- 코딩테스트
- MVC
- spring
- cloud computing
- BFS
- Java
- 크루스칼
- jsp
- 가상컴퓨팅
- DB
- Today
- Total
PLOD
[Java] 업캐스팅(upcasting), 다운캐스팅(downcasting) 본문
업캐스팅(upcasting)은 자동 타입 변환(묵시적 타입변환)이라고도 하며 자식 클래스(Dog)의 타입을 부모클래스(Animal)로 변환하는 것을 의미한다. 다운캐스팅(downcasting)은 명시적 타입 변환 업캐스팅 괸 것을 다시 원래대로 되돌리는 것을 의미한다.
자손타입 -> 조상타입(Up-casting) : 형변환 생략 가능
자손타입 <- 조상타입(Down-casting) : 형변환 생략 불가
* Upcasting
업캐스팅과 다운캐스팅을 사용하는 이유는 공통적으로 공통적으로 할 수 있는 부분을 만들어 간단하게 다루기 위해서이다. 상속관계에서 상속받은 서브클래스가 몇개이든 하나의 인스턴스로 묶어서 관리할 수 있기 떄문이다. 물론 업캐스팅을 당한 객체는 메서드를 오버라이딩 하지 않는 이상 자식 고유의 메서드는 사용 못한다는 단점이 있기는 하지만 코드관리적인 측면에서 훨신 효율적이기 때문에 업 캐스팅을 사용할 수 있으면 사용한다.
/*upcasting사용해서 객체 생성 예시)
* (부모클래스) (객체명) = new (자식클래스)
*/
Animal dog = new Dog();
* Downcasting
다운캐스팅의 목적은 업캐스팅한 객체를 다시 자식클래스로 되돌리는데 목적을 둔다. 업캐스팅으로 인해 사용하지 못한 자식 본인의 필드와 기능을 사용하기 위해 다운캐스팅을 한다. 다운캐스팅은 업캐스팅 된 객체에게 사용하면 오류가 발생하기 때문에 다운캐스팅을 하기전에 업캐스팅 여부를 꼭 확인해보아야 한다.
/* downcasting 사용 예
* (자식클래스) (새로운 자식클래스 명) = (자식클래스(생략불가)) (upcasting된 자식클래스 명)
*/
Dog puppy = (Dog) dog
Ex) Animal 클래스를 통한 Upcasting과 downcasting
- Animal 클래스
public class Animal {
protected String kind;
public void breathe() {
System.out.println("숨을 쉽니다.");
}
public void sound() {
System.out.println("소리를 냅니다");
}
- Dog 클래스
public class Dog extends Animal{
public Dog() {
super.kind = "포유류";
}
public void sound() {
System.out.println("멍멍");
}
public void play() {
System.out.println("공놀이");
}
}
- Cat 클래스
public class Cat extends Animal{
public Cat() {
super.kind = "포유류";
}
public void sound() {
System.out.println("야옹");
}
public void eat() {
System.out.println("츄르 먹어요");
}
}
- Test(Main) 클래스
public class Test {
public static void sub(Animal animal) { //animal = cat / animal = dog
System.out.println("******upcasting**********");
animal.breathe();
animal.sound();
System.out.println("******downcasting********"); //eat(), play()
if(animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.eat();
}
else if(animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.play();
}
}
public static void main(String[] args) {
Cat cat = new Cat();
cat.breathe();
cat.sound();
cat.eat();
System.out.println();
Dog dog = new Dog();
dog.breathe();
dog.sound();
dog.play();
System.out.println();
sub(cat);
System.out.println();
sub(dog);
}
}
* instanceof 연산자
참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다. 주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입이 피연산자로 위치한다. 그 결과로 true나 false 중의 하나를 반환한다.
class Car{}
class FireEngine extends Car{}
public class InstanceofTest {
public static void main(String[] args) {
FireEngine fe = new FireEngine();
if (fe instanceof FireEngine) {
System.out.println("This is a FireEngine instance");
}
if (fe instanceof Car) {
System.out.println("This is a Car instance");
}
if (fe instanceof Object) {
System.out.println("This is a Object instance");
}
}
}
'개발 공부 > Java' 카테고리의 다른 글
[Java] API 및 Collection Framework (Map, Set, List) (0) | 2023.01.16 |
---|---|
[Java] interface(인터페이스) (0) | 2023.01.15 |
[Java] 클래스- 생성자(Constructor) (0) | 2023.01.12 |
[Java] 접근 제어자(access modifier) (0) | 2022.12.04 |
[Java]상속(Inheritance) (0) | 2022.11.11 |