출처 | https://www.youtube.com/watch?v=OI_oc0JqWXc&list=PLOSNUO27qFbtjCw-YHcmtfZAkE79HZSOO&index=21
메소드 재정의는 부모 클래스의 메소드를 자식 클래스가 확장하거나 다시 정의하는 것을 의미한다.
메소드 재정의를 구현하는 방법은 부모클래스로부터 상속받은 메소드의 반환타입, 파라미터를 동일하게 하여 자식 클래스에서 정의한다.
자식 클래스가 부모 클래스의 메소드를 재정의할 때 접근 지정자의 범위는 넓거나 같아야 한다. -> 몰랐음
부모 private --> 자식 : x
부모 protected --> 자식 : public (넓게 가능)
부모 public --> 자식 : x
public > protected > package > private
중요하게 볼 점은 다른 패키지에서 상속을 받을 때 접근지정자를 범위를 유심히 볼 것.
메소드 재정의는 부모 클래스로부터 상속 받으 기능을 새롭게 변경하거나 확장하기 위해서다.
자식 클래스에서 상속 받은 메소드의 기능을 확장하기 위해서는 부모 클래스의 메소드에 대한 호출이 필요하다.
자식 클래스가 부모 클래스의 구성 요소에 접근하기 위해선 super 키워드를 이용한다.
이 예제는 확장하는 개념이다.
Stronly typed language 개념은 데이터의 타입을 미리 정의하고 사용 하고, 한번 정의된 데이터 타입은 프로그램 종료까지 변하지 않는 것을 의미한다.
이 개념은 프로그램 개발에 있어 명확함과 구체성을 제공하며 많은 프로그램 언어들이 적용하고 있다.
프로그램의 유연성 제약이라는 단점을 갖고 있으며 반대 개념이 Loosely typed language다.
자바에서 예외적으로 Strongly typed language가 적용되지 않는 경우가 있다.
상속관계에서 자식 클래스가 부모 클래스 타입으로 참조되는 것이 허용되며 , 이를 up-casting이라고 한다
한번 부모 클래스 타입의 클래스로 참조가 이루어진 이후 다시 자식 클래스로 참조하는 것을 down-casting 이라 한다.
상속 관계가 성립되어 있고 자식 클래스의 인스턴스가 부모 클래스 타입의 변수로 참조되면 실제 인스턴스화 객체가 자식 객체일 경우에도 자식 클래스가 갖고 있는 인스턴스 메소드는 호출 할 수 없다.
부모 클래스 타입의 변수로 참조하고 있는 자식 인스턴스 객체의 메소드를 호출하기 위해서는 down-casting
이 이루어져야 한다.
단, 재정의 하고 있는 메소드의 경우 up-casting
상황에서도 자식 클래스의 재정의 메소드가 호출된다.
Upcating 할 때 중요한 점은 : 자식 클래스가 가지고 있는 클래스는 호출이 안 된다.
오버라이딩된 메소드는 부모 클래스의 타입을 띄고 있을지라도 자식 클래스 메소드가 실행된다. (Shape.draw() / Rectangle.draw())
상속 관계에서 객체간의 타입 형변환은 객체를 관리하는데 있어 큰 이점을 제공한다.
자식 클래스가 부모 클래스 타입의 변수로 참조 가능하기 때문에 같은 부모 클래스를 상속하는 모든 클래스들을 하나의 타입으로 관리한다.
객체의 관리는 프로그램의 복잡성을 크게 개선한다.
다형성은 하나의 객체가 다양한 형태로 처리될 수 있는 특성이다.
다형성을 구현하기 위해서는 상속, 재정의 메소드, 그리고 객체간의 형변환 세가지 조건이 필요하다.
다형성의 이형 집합을 통한 구현 방식과 파라미터를 통한 구현 방식으로 구분 할 수 있다.
drawShapes메소드를 호출할 때 실제로 인스턴스를 만들어서 보내는 것이(자식 객체)
그렇게 되면 Shape shape = new Line() 이다. 파라미터는 부모 객체이고 만들어서 보내는건 자식 객체를 보낸다. 이 또한 다형성이기 때문에 -> Rectangle, Ellipse, Line에서 재정의한 draw 중 뭐가 나올지 모름