하.. 이제 진짜 시작인가 하는 너낌... 미춰버리겠다...
아직 시작도 안했는데 1시 반.. 줌켜고 한 예제는 언제 만들어보지?ㅋㅋㅋㅋㅋㅋㅋ
다형성(polymorphism)
하나의 메서드나 클래스가 있을 때 다양한 형태로 동작하는 것을 의미한다.
a()라는 메서드가 a(x)라는 매개변수를 가지는 메서드로 동작할 수도 있고 ⇒ 오버로딩(Overloading) a()메서드 내에 동작을 서로 다르게 함으로서 형태를 다르게 만들어 줄 수도 있다. ⇒ 오버라이딩(Overriding)
- 클래스의 다형성
class Parents{
public void guard(){
System.out.println("보호자입니다.");
}
}
class Child extends Parents {
public void child(){
System.out.println("학생입니다.");
}
}
public class PolyExample {
public static void main(String[] args) {
// 하위 클래스 타입의 객체를 상위 클래스 타입의 변수에 할당
Parents p = new Child();
p.guard();
// p.child(); 에러 발생
}
}
클래스에서의 다형성이란 ‘상위 클래스 타입의 참조 변수로 하위 클래스의 객체를 참조하는 것’이다.
예를 들어, 자녀 중 한 명이 보호자 역할을 하기 위해 부모님 대신해서 막내 동생의 학교에 참관 수업을 보러 갔다. 이 자녀는 보호자의 역할을 하기 위해 갔기 때문에 “학생입니다.”하고 책상에 앉아 있을 수 없을 것이다. 하지만 보호자의 역할은 가능하기에 “보호자입니다.”하고 갈 수는 있다.
아래에는 내용을 더 추가한 것이다.
class Parents{
public void guard(){
System.out.println("보호자입니다.");
}
}
class Child extends Parents {
// 추가된 내용 @ 오버라이딩
public void guard(){
System.out.println("혈육입니다.");
}
public void child(){
System.out.println("학생입니다.");
}
}
public class PolyExample {
public static void main(String[] args) {
Parents p = new Child();
p.guard();
// p.child();
}
}
Child 클래스에 guard 메서드를 오버라이딩 시켜 내용을 추가 시켰다. “보호자입니다.”라고 말 하는대신 “혈육입니다.”라고 말 하는 것이다.
* 예시는 예시일 뿐.. 깊이 생각하지 마세오.. 이해하기 쉬우려고 만든 예시입니다. : )
참조 변수 타입 변환 / 업캐스팅과 다운캐스팅
위에서 살펴본 것 처럼 상위 클래스 타입의 객체를 하위 객체의 타입에 할당하는 것을 업캐스팅(Upcasting)이라 하며, 반대로 하위 클래스 타입의 객체를 상위 클래스 객체 타입에 할당하는 것을 다운캐스팅(Downcasting)이라고 한다.
타입 변환은 #상속관계 일 때만 성립하며, 업캐스팅 시에는 형 변환 연산자(괄호)를 써주지 않아도 된다.
Parents p = new Child(
하지만 다운캐스팅 시에는 반드시 괄호를 통해 명적으로 형 변환 연산자(괄호)를 사용해야 한다. 일반적인 형 변환에서도 타입을 다운 시켜 줄 때에는 (괄호)를 써 주는 것과 같다.
Parents p = new Child(); // 업캐스팅
Child c = (Child) p; // 다운캐스팅
✨ 다운캐스팅을 할 때, 변수가 참조하는 객체가 형변환하려는 클래스의 객체가 아니라면 ClassCastException이 발생한다. 따라서 #instanceof 연산자를 사용하여 객체가 형 변환이 가능한지 확인해야 한다.
instanceof 연산자
instanceof 연산자는 위에서 말 한 것과 같이 형 변환이 가능한지 여부를 판단하기 위해 사용이 가능하다. 따라서, 결과는 boolean 형으로 나오게 되며 다음과 같이 사용함으로써 코드의 오류를 최소화 한다.
if (p instanceof Child) {
Child c = (Child) p;
// ...
}
오늘 분명 내용만 살펴보면 앞에 배운 내용들에 살이 붙은 건데.. 그게 참 뭔가 이해하기 어려운 건 아닌데 모르겠다. 이상하게 어렵다. 알다가도 오잉?! 엥?! 말이 헷갈린다. 왜 그러냐 진짜ㅜㅜㅋㅋㅋㅋ 아직 추상화, 는 정리도 안 했고 인터페이스는 이해조차 못했는데... 뭔가 인터페이스라는 게 나는 자꾸 너무 어렵다.
전에도 글을 한 번 쓴 적이 있는 것 같은데 앞전에 학원 다니면서 인터페이스만 10번 넘게 검색하고 "사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템"이라는 똑같은 글도 매번 적어 놓았다. 그리고 똑같은 사이트도 매번 들어가서 봤고.. 그런데 이해가 안갔다. 근데 지금 생각해보면 당연하다. 글 하나하나 부모 클래스 자식 클래스가 뭘 의미하는지도 몰랐을텐데ㅋㅋㅋ 지금 생각하면 그렇다..
그런데 어렵다 어렵다 생각하니 계속 어렵다 생각해서 자꾸 더 '난 쟤 아무리 봐도 이해 못해' 라고 그 틀 안에 가두는 것 같다.. 극복쓰~ 해야지! 근데 진짜 다 정리하고 키오스크 예제 보고 있으면 9시 될 것 같다. 근데 또 정리를 이렇게 안 해두면 진짜 머리에 남는 것도 없고 글을 다시 찾아봐도 눈에 안들어오더라.
그냥 해야지 ㅜ 언넝 하자 ~
'LANGUAGE > JAVA' 카테고리의 다른 글
[JAVA] 컬렉션 프레임워크(Collection Framework) 기본 정리 / List, Set, Map (0) | 2023.05.03 |
---|---|
[JAVA] 객체 지향 프로그래밍 / 추상화(Abstract) - 상속 , 오버라이딩, 사용 이유 (0) | 2023.04.27 |
[JAVA] 객체 지향 프로그래밍의 속성 / 캡슐화(Encaptulation) (0) | 2023.04.25 |
[JAVA] JAVA 객체지향 프로그래밍 / 메서드 오버라이딩(Method Overriding)이란? (0) | 2023.04.25 |
[JAVA] 자바 객체 지향 프로그래밍 / 상속화(inheritance) (0) | 2023.04.25 |