메모장

[멘토 씨리즈] 다형성과 타입변환 본문

JAVA/[멘토씨리즈]

[멘토 씨리즈] 다형성과 타입변환

Itchild 2024. 4. 9. 13:20
728x90
반응형

 

 

타입 변환

 

  1. 클래스의 자동 타입 변환

 

클래스 자동 타입 변환은 상속관계에 있는 자식 클래스의 객체를 부모 타입의 객체로 변환하는것

 

자식 객체를 만들면서 바로 부모 타입으로 변환할때

부모 클래스(타입) 객체변수 = new 자식 클래스();
 

만들어진 자식 객체를 부모타입으로 변활 할때

부모 클래스(타입) 객체변수 = 자식객체;
 

class Parent{}
class Child extends Parent{} 일때

main()
Parent p1 = new Parent(); // 자동 타입 변환
Child c1 = new Child(); // 자동 타입 변환

Parent p2 = new Child(); // 자동 타입 변환
Parent p3 = c1; // 자동 타입 변환
// Child c2 = p1; <--- 자동 타입 변환 x
 

타입을 변환한다고 객체가 바뀌는것이 아니라, 객체는 보존 되고 사용만 부모객체처럼 사용한다.

클래스 자동타입 변환은 자식타입에서 부모 타입 방향으로만 가능하다 !

자동 타입 변환은 반드식 상속 관계에 있는 자식클래스의 객체를 부모타입으로 변환할때 적용할 수 있다.

1차 상속관계가 아니더라도 상위 계층의 타입으로 변환 할수 있다. 하지만 같은 상위 계층을 가지고 있더라도 타입변환을 시도하려는 두 클래스 간의 상속관계가 없다면 타입변환은 불가능하다.

class Car {}
class Bus extends Car {}
class SchoolBus extends Bus {}

class OpenCar extends Car {}
class SportsCar extends OpenCar {}

main()
Car c1 = new SchoolBus(); // 1차 상속 관계가 아니더라도
                          // 자동 타입 변환 가능
Bus b1 = new Bus();       // 자동 타입 변환
Bus b2 = new SchoolBus(); // 자동 타입 변환

Car c2 = new OpenCar(); // 자동 타입 변환
OpenCar oc = new SportsCar(); // 자동 타입 변환
// Bus b3 = new OpenCar(); <-- 오류
// Bus b4 = new SportsCar(); < -- 오류

OpenCar 클래스는 Car 클래스와 2차 상속 관계를 가지고 있기 때문에 자동 타입 변환이 가능
OpenCar 클래스와 SportsCar 클래스는 Bus 클래스와 같은 같은 상위계층의 클래스 Car와 상속관계는 맞지만,
Bus 클래스와 직접적인 상속관계가 아니므로 자동 타입 변환을 할 수 없다.
 

타입을 부모 타입으로 변환한 객체는, 더 이상 자신의 클래스에 부모 클래스와 별개로 추가한 멤버들을 사용할 수 없으며, 부모클래스에 선언된 멤버(필드와 메서드)들만 사용할 수 있다. 단, 부모클래스의 메서드를 오버라이딩한 메서드의 경우에는 자식 객체의 것을 호출할 수 있다.

class DeskCalendar extends Calendar
void hanging ()
void onTheDesk ()

main()
Calendar c = new DeskCalendar ( );
c.info();
c.hanging(); <--- 오버라이딩한 자식메서드를 호출한다.
 
  • 오버라이딩한 메서드는 클래스 타입 변환을 했어도 자식 메서드 호출 가능
  • 클래스 타입 변환을 한 클래스는 더이상 자식 클래스만의 멤버들을 호출 할 수 없다.

 

2. 클래스의 강제 타입 변환

부모타입으로 자동 타입 변환을 했지만 자식 클래스의 멤버들에게 접근하고 싶을때 자바의 규약으로 부모타입에서는 자식클래스의 멤버에 접근할 수 없으므로 이러한 경우 다시 DeskCalendar 타입으로 변경해서 접근할 수 있도록 제공하고 있다. ---> 자식 객체가 부모타입으로 자동 타입변환을 한 후 , 다시 자식타입으로 변환하는것

 

부모타입에서 자식타입으로 강제 형변환 시에는 반드시 변환 하고자 하는 타입형태를 직접 작성해야 한다.

((자식타입)부모타입).메서드();
자식 타입 변수 = (자식타입) 부모타입;
 
class Bike
void info()
void ride()

class FourWheelBike extends Bike

void addWheel()

main()
Bike b  = new FourWheelBike();
b.info()
b.ride()
// b.addWheel() <-- 부모타입으로는 호출 불가

FourWheelBike fwb = (FourWheelBike) b; // 강제 타입 변환
fwb.addWheel(); // 자식 메서드 사용가능 
fwb.info();
fwb.ride();

단, 모든 부모타입 객체를 자식타입으로 변환할수 있는것은 아니다. 반드시 부모 타입으로 자동 타입 
변환 되었던 자식 객체를 다시 자식 타입으로 변환 할 때만 강제 타입 변환을 사용할 수 있다.
 

다형성

 

  • 다형성은 객체 지향 프로그래밍의 대표적인 특징중 하나로, 하나의 타입으로 다양한 객체를 사용할 수 있는것을 의미 한다.
  • 다형성의 장점 : 객체가 특정 클래스의 필드가 되면서, 하나의 부품처럼 사용될수도 있다. 이때 부품을 교체 할 일이 생긴다면 우리는 다형성을 구현함으로써 코드 수정을 최소화 할 수 있다.

 

instanceof 연산자

instanceof 기준으로 왼쪽 객체가 생성 될때 오른쪽 타입으로 생성 되었는지 확인하는 연산자.
맞으면 true, 아니면 false를 반환하여 만약 null을 가리키고 있으면 false를 반환
 
class Animal {}
class Pig extends Animal {}
class Cow extends Animal {}

class Farm {
void sound(Animal animal) {
if(animal instanceof Pig){ // animal 변수에 담긴 객체 타입이 Pig이면
 System.out.println("꿀꿀");
}else{ // animal 변수에 담긴 객체의 타입이 Pig가 아니면
 System.out.println("음메");
       }
    }
}

main()
Farm f = new Farm();
Pig p = new Pig();
Cow c = new Cow();
f.sound(p); // 꿀꿀
f.sound(c); // 음메
 

오버로딩 과 오버라이딩

 

  • 오버로딩 : 자바는 매개변수의 자료형/개수/순서를 기반으로 메서드를 구별하므로 하나의 클래스 안에서 같은 이름의 메서드를 여러개 구현하고 필요에 따라 메서드를 선택해 사용할 수 있다.
  • 오버라이딩 : 부모클래스에게 상속받은 메서드를 재정의 하여 자식 클래스용 메서드를 구현하고 자식 객체를 통해 메서들 호출하면 오버라이딩 된 메서드가 호출됩니다.

 

간단히 정리해서 오버로딩은 새로운 메서드를 정의하는 것이며 , 오버라이딩은 상속받은 기존의 메서드를 재정의하는 것을 말한다.

 

728x90
반응형