코드 그라데이션

Day24-2. 참조자료형 형변환, 오버라이딩 예제 본문

Java/Mega

Day24-2. 참조자료형 형변환, 오버라이딩 예제

완벽한 장면 2023. 4. 17. 19:59

참조자료형 형변환 예제

package mega.backend_onemore.Day24;

class A{
  int a;
}
class B extends A{
  int b;
}
class C extends A{
  int c;
}
class D extends A{
  int d;
}
public class ClassCastingTest1 {

  public static void main(String[] args) {

    A a = new B(); //업캐스팅
    B b = (B)a; // 다운캐스팅

    B[] listB = new B[10];
    C[] listC = new C[10];
    D[] listD = new D[10];
    // 이렇게 세 번 수고할 필요가 없이
    // 아래처럼 한방에 만들고 집어넣으면 된다!
    A[] listA = new A[10];

    listA[0] = new C();
    listA[1] = new D();
    listA[2] = new B();

    // listA[2].b = 10;
    // 이건 안 보인다. 부모 자체가 A이니까.
    // 그래서 b로 형변환 해서 써줘야 한다는 것.
    ((B)listA[2]).b = 10;

    B b1 = (B)listA[2];


    if(listA[1] instanceof D) {
      D d1 = (D)listA[1];
    }
    /*
    이 코드는 instanceof 연산자를 사용하여 listA[1]이 D 클래스의 인스턴스인지 확인하고,
    그렇다면 listA[1]을 D 클래스의 인스턴스로 다운캐스팅하고 d1 변수에 할당합니다.
    즉,, listA[1]이 D 클래스의 인스턴스가 아니면 다운캐스팅을 시도하지 않습니다.
    따라서 이 부분의 코드는 D 클래스의 인스턴스가 아닌 경우를 대비한 안전장치 역할을 합니다.

      instanceof 연산자는 객체가 지정된 클래스 또는
      해당 클래스의 하위 클래스의 인스턴스인 경우 true를 반환하고,
      그렇지 않은 경우 false를 반환합니다.
      따라서 이 코드는
      listA[1]이 D 클래스 또는 D 클래스의 하위 클래스의 인스턴스인지 확인하고,
      그렇다면 listA[1]을 D 클래스의 인스턴스로 다운캐스팅합니다.
     */
    System.out.println(b1.b); //10 츨력 (형변환 전에는 0나왔을 터)

  }

}

 

 

오버라이딩 예제

package mega.backend_onemore.Day24;

class Con1{
  String hello(String name) {
    System.out.println("Con");
    return "Con"+name;
  }
}
class Eng extends Con1{
  String hello(String name) {
    System.out.println("Eng");
    return "Eng"+name;
  }
}
class Kor extends Con1{
  String hello(String name) {
    System.out.println("Kor");
    return "Kor"+name;
  }
}
class Jpn extends Con1{
  String hello(String name) {
    System.out.println("Jpn");
    return "Jpn"+name;
  }
}

public class OverridingTest {

  public static void main(String[] args) {

    Con1 c = new Kor();
    c.hello("대한민국");
//    System.out.print(c.hello("한국"));
    // Con한국이 나올 거라고 생각하지만, Kor한국이 나온다.
  }

}
/*
이유는 hello 메소드가 문자열을 반환하기 때문입니다.
c.hello("한국") 코드는 hello 메소드를 호출하고,
그 반환값인 "Kor한국" 문자열을 출력하는 것입니다.
따라서 출력 결과는 Kor한국이 됩니다.

반면, 이전 질문에서는 c.hello("한국")을 호출한 후
반환값을 출력하지 않았기 때문에,
"Kor한국" 문자열이 반환되었지만 출력되지 않았습니다.
대신 hello 메소드 내부에서 println 메소드가 호출되어서
"Kor" 문자열이 출력되었을 뿐입니다.
 */
728x90

'Java > Mega' 카테고리의 다른 글

Day25. 추상화 (3) final, equals()  (0) 2023.04.17
Day25. 추상화(1) 추상클래스, 추상메서드  (0) 2023.04.17
Day24. 참조자료형 형변환, 오버라이딩  (0) 2023.04.17
Day23. super  (1) 2023.04.17
Day22. 상속 도입.(21은 문제)  (0) 2023.04.17
Comments