[사용자 정의 데이터 타입]

C언어) 구조체

객체 지향) 클래스

형변환을 할 수 있는 캐스트 연산자

마찬가지로, 상속 관계에 있는 부모 클래스로 타입 변경 가능

상속 관계에서만 가능_업캐스팅, 다운캐스팅, 오버라이딩

  1. 업캐스팅

    : 서브 클래스의 레퍼런스를 슈퍼 클래스의 레퍼런스에 대입

    (서브 클래스의 객체는 이미 슈퍼 클래스의 멤버를 모두 가짐)

    → 서브 클래스의 멤버를 가지고 있으나 서브 클래스의 멤버 접근 불가능

    → 서브 클래스 객체를 슈퍼 클래스 타입으로 타입 변환

    Person p = new Student("이재문");
    

    [업캐스팅]

  2. 다운캐스팅

    : 슈퍼 클래스의 레퍼런스를 서브 클래스의 레퍼런스에 대입

    → 업캐스팅 된 것을 다시 원래대로 되돌리는 것

    → 슈퍼 클래스 객체를 서브 클래스 타입으로 변환

    (슈퍼 클래스의 서브 클래스는 다양하기에 명시적 타입 변환 지정)

Person p = new Student("이재문"); //업캐스팅
Student s = (Student) p; //다운캐스팅, 명시적 타입 변환 필요
  1. 오버라이딩

    : 슈퍼 클래스의 메소드를 서브 클래스에서 재정의

    → 슈퍼 클래스의 메소드 무시 “동적 바인딩 발생”

    ** 오버로딩과 오버라이딩은 객체 지향에서 다형성을 제공한다.*

    조건) 메소드의 원형(이름, 인자 타입 및 개수, 리턴 타입) 동일

    “슈퍼와 서브는 100퍼 동일한 프로토 타입을 갖는다”
    

: 서브 클래스의 오버라이딩된 메소드가 무조건 실행

→ 이름이 같아 어느 함수를 호출할지 몰라 발생하는 오류를 예방

업캐스팅(서브 클래스의 객체를 수퍼 클래스의 객체로) → 오버라이딩된 메소드 호출

⇒ 서브 클래스의 메소드 (수퍼 클래스의 메소드 무력화)

Shape shape = new Line();
shape.draw(); //Line 출력 (shape의 draw() X)