[JAVA] 다형성은 무엇인가? 객체의 타입 변환 필요성?
[미리보기 Index]
✔️ 객체의 타입 변환의 필요성 (객체는 그냥 하나의 타입으로 계속 사용되면 안될까?!)
✔️ 다형성이란??
✔️ 다형성이라는 특성은 오버로딩, 상속, 오버라이딩, 추상화, 형(타입) 변환 모두에서 나타난다.
✔️ 우리가 타입 변환을 어디에 사용할 수 있을지?
✔️ 타입 변환을 사용하면 좋은 점이 무엇인지?
✔️ 객체의 타입 변환의 필요성 (객체는 그냥 하나의 타입으로 계속 사용되면 안될까?!)
왜 부모 자식 관계가 있고..
자식 객체는 부모 타입으로 업캐스팅이 가능하고..
부모 객체는 자식타입으로 불가능하고.. 다만 부모타입으로 된 자식객체를 다시 자식타입으로 내리는 다운캐스팅은 가능한걸까????... @-@ 이런 타입 변환은 왜 필요한 것일까? 혼란스럽도다.........
흠 생각해보면
객체지향은 재사용이 목적이다.
즉, 재사용을 위해서는 코드가 단순해질 수 밖에 없다.
코드가 단순해지기 위해서 설계가 잘되어있어야 한다.
클래스 만들 때 추상으로 빼야하나? 이러한 고민 자체가 설계를 잘하기 위한 것이다.
따라서!
재사용을 잘하기 위해, 설계를 잘 하기 위해!
객체의 타입 변환이 필요하다.
그리고 객체의 타입 변환이 이루어지려면
다형성이라는 특성이 요구된다.
✔️ 다형성이란??
다형성 ↔ 단형성(한가지 형태만 가질 수 있는 것)
: 프로그래밍 언어의 각 요소들이 다양한 자료형(타입)에 속하는 것이 가능한 것.
: 사용하는 방법은 똑같지만, 움직이는 걸 다르게 할 수 있다. = 하나의 객체는 여러가지 타입을 가질 수 있다.
Bus bus = new Bus();
Car car = new Bus();
: 모양을 달리해서도 같은 기능을 뽑아낼 수 있다. = 하나의 타입으로 여러가지 객체를 사용할 수 있다.
Car car1 = new Car();
Car car2 = new Bus();
✔️ 다형성이라는 특성은
오버로딩, 상속, 오버라이딩, 추상화, 형(타입) 변환 모두에서 나타난다.
"오버로딩"
다형성의 특성은 꼭 변수의 타입뿐만 아니라 인터페이스나 파라미터에서도 똑같이 적용된다.
오버로딩 특성은 다형성 특성이 있는 것이다.
아래 예시와 같이 메서드명이 동일하지만, 다른 타입의 매개변수를 받을 수 있기에 다형성 특성이 존재한다.
void ride(String color) {
System.out.println(color + "차가 슝슝");
}
void ride(int num) {
System.out.println(num + "차가 슝슝");
}
"상속" (상속이 있기에 오버라이딩이 있는거니까 묶어서 이해^^)
"오버라이딩" (@Override는 상속이랑 관련이 있다. 부모의 메서드를 재정의하는 것이니까.)
Car부모클래스의 ride()를 가져와서 메서드 내용을 Bus자식클래스에 맞게 수정하였다.
수정 후, 자식객체를 부모타입의 변수에 선언하여 메서드를 호출하였다.
자식을 부모타입에 대입했으니 다형성 특성이 적용되었다.
public class Car {
private String color;
void ride(String color) {
System.out.println(color + "차가 슝슝");
}
}
public class Bus extends Car{
@Override
void ride(String color) {
System.out.println(color + "버스가 부릉부릉");
}
}
public class Main {
public static void main(String[] args) {
Car carTest = new Bus();
carTest.ride("파랑색");
}
}
//실행결과
파랑색버스가 부릉부릉
Process finished with exit code 0
"추상화"
어떠한 객체를 생성하면 그 객체의 본질이 있을 것이다.
그 본질만을 나타내는 클래스를 만드는 것 자체가 추상화이다.
아래 예시를 보면, 부모클래스에서 차의 기본적인 역할만 뽑아낸 것이다.
부모가 자식을 추상화한 것이다.
추상화가 있어야지 상속이란 개념도 있을테고 그 상속에는 다형성 특성이 있으니..
추상화도 다형성 특성이 연관되어있다고 볼 수 있겠다... (이렇게 보니 코에 걸면 코걸이 귀에 걸면 귀걸이 같네)
public class Car {
private String color;
private int num;
void ride(String color) {
System.out.println(color + "차가 슝슝");
}
void stop(String color) {
System.out.println(color + "차가 끼익");
}
}
"형(타입) 변환"
- up casting = 자동 형변환 = 묵시적 형변환
- down casting = 강제 형변환 = 명시적 형변환
upcasting : 자식객체를 부모타입에 담아서 사용하는 것.
down casting : 부모객체를 자식타입에 담아서 사용할 수는 없으니 다운은 없겠지! 라고 생각했으나 downcasting이 존재한다…왜냐면 자식객체를 부모타입으로 받았던 변수를 다시 자식으로 내리는 것은 가능하기 때문이다.
형 변환이라는 것 자체가 다른 타입에 담는 행위이기에 다형성 특성을 보여준다.
public class Main {
public static void main(String[] args) {
Bus bus = new Bus();
Car car = new Bus(); //업캐스팅
Car car1 = new Car();
Car car2 = new Bus(); //업캐스팅
//업캐스팅한걸 다시 다운캐스팅한거라서 가능.
Bus bus1 = (Bus)car2;
// 원래 부모클래스인데, 부모클래스를 자식 타입으로 받는게 바로 가능한것인가?
// 다운캐스팅 = 강제 형 변환이라서 가능한 것?
// 이렇게되면 위에 업캐스팅한 걸 다시 다운캐스팅한거랑 다른게 없지 않나?
// -> 코드자체로는 빨강색으로 오류가 안나지만, 실행해보면 오류뜸!!!!! 따라서 아래 두 코드는 실행 불가능하다~
// Bus bus2 = (Bus) car1;
// Bus bus3 = (Bus) new Car();
}
}
✔️ 우리가 타입 변환을 어디에 사용할 수 있을지?
✔️ 타입 변환을 사용하면 좋은 점이 무엇인지?
✔️ 우리가 타입 변환을 어디에 사용할 수 있을지?
단어 단어에 대한 설명은 100% 이해했지만,
실제 객체의 타입 변환을 어떻게 활용해서
효율적으로 코드를 짤 수 있는 지 감이 안온다ㅎㅎ
코드가 많아지면 또 내 머릿속은 하얘지겠지,,
현재 생각으로는 아마도 객체를 호출할 때,
하나의 타입으로 많은 객체를 거느릴 수 있기 때문이 아닐까... 하는 생각이 문뜩 든다!
공부를 좀 더 해야지...~_~
✔️ 타입 변환을 사용하면 좋은 점이 무엇인지?
타입 변환을 사용하면 코드들이 한눈에 파악하기 쉬워진다.
공통적인 부분을 묶고 그 공통적인 부분이 묶여있는 타입을 사용하기 때문에!
다시말하자면
하나의 클래스가 대표로 있고
많은 클래스들이 그 대표 클래스를 상속을 한다면,
실제 호출할 때는 그 대표 클래스만 사용하여 호출할 수 있으니!
이 점이 정말 좋지 않을까?싶다:)
* reference
나에게.. 다형성이란..?
안녕하세요, 송아지할때 송아 김송아입니다. 오늘은 간단하게(?) 다형성에 대해 얘기를 나눠볼까 합니다. 저도 알아요.. 사실 다형성이ㅋㅋㅋ 간단할 수가.... (먼산😇) 그치만, 제가 드리고 싶은
songacoding.tistory.com
* 주관적인 공부 기록입니다:)