자바 - 메소드 재정의[구체화] + 객체간 형변환

지환·2023년 10월 7일
0

JAVA

목록 보기
20/39

출처 | https://www.youtube.com/watch?v=OI_oc0JqWXc&list=PLOSNUO27qFbtjCw-YHcmtfZAkE79HZSOO&index=21


메소드 재정의[1/2]

  • 메소드 재정의는 부모 클래스의 메소드를 자식 클래스가 확장하거나 다시 정의하는 것을 의미한다.

  • 메소드 재정의를 구현하는 방법은 부모클래스로부터 상속받은 메소드의 반환타입, 파라미터를 동일하게 하여 자식 클래스에서 정의한다.

  • 자식 클래스가 부모 클래스의 메소드를 재정의할 때 접근 지정자의 범위는 넓거나 같아야 한다. -> 몰랐음

    • 부모 private --> 자식 : x

    • 부모 protected --> 자식 : public (넓게 가능)

    • 부모 public --> 자식 : x

  • Gamma에서 Beta를 접근하기 위해선 사용 할 수 있는 접근지정자는 publlc 밖에 없다.

public > protected > package > private
중요하게 볼 점은 다른 패키지에서 상속을 받을 때 접근지정자를 범위를 유심히 볼 것.

메소드 재정의[2/2]-super

  • 메소드 재정의는 부모 클래스로부터 상속 받으 기능을 새롭게 변경하거나 확장하기 위해서다.

  • 자식 클래스에서 상속 받은 메소드의 기능을 확장하기 위해서는 부모 클래스의 메소드에 대한 호출이 필요하다.

  • 자식 클래스가 부모 클래스의 구성 요소에 접근하기 위해선 super 키워드를 이용한다.

이 예제는 확장하는 개념이다.

객체간의 형변환의 이해(1) - 중요

  • Stronly typed language 개념은 데이터의 타입을 미리 정의하고 사용 하고, 한번 정의된 데이터 타입은 프로그램 종료까지 변하지 않는 것을 의미한다.

  • 이 개념은 프로그램 개발에 있어 명확함과 구체성을 제공하며 많은 프로그램 언어들이 적용하고 있다.

  • 프로그램의 유연성 제약이라는 단점을 갖고 있으며 반대 개념이 Loosely typed language다.

객체간의 형변환의 이해(2)

  • 자바에서 예외적으로 Strongly typed language가 적용되지 않는 경우가 있다.

  • 상속관계에서 자식 클래스가 부모 클래스 타입으로 참조되는 것이 허용되며 , 이를 up-casting이라고 한다

  • 한번 부모 클래스 타입의 클래스로 참조가 이루어진 이후 다시 자식 클래스로 참조하는 것을 down-casting 이라 한다.

객체간 타입 형변환(3)

  • 상속 관계가 성립되어 있고 자식 클래스의 인스턴스가 부모 클래스 타입의 변수로 참조되면 실제 인스턴스화 객체가 자식 객체일 경우에도 자식 클래스가 갖고 있는 인스턴스 메소드는 호출 할 수 없다.

  • 부모 클래스 타입의 변수로 참조하고 있는 자식 인스턴스 객체의 메소드를 호출하기 위해서는 down-casting이 이루어져야 한다.

  • 단, 재정의 하고 있는 메소드의 경우 up-casting 상황에서도 자식 클래스의 재정의 메소드가 호출된다.

  • Upcating 할 때 중요한 점은 : 자식 클래스가 가지고 있는 클래스는 호출이 안 된다.

  • 오버라이딩된 메소드는 부모 클래스의 타입을 띄고 있을지라도 자식 클래스 메소드가 실행된다. (Shape.draw() / Rectangle.draw())

객체간 타입 형변환(4/4)

  • 상속 관계에서 객체간의 타입 형변환은 객체를 관리하는데 있어 큰 이점을 제공한다.

  • 자식 클래스가 부모 클래스 타입의 변수로 참조 가능하기 때문에 같은 부모 클래스를 상속하는 모든 클래스들을 하나의 타입으로 관리한다.

  • 객체의 관리는 프로그램의 복잡성을 크게 개선한다.

다형성

  • 다형성은 하나의 객체가 다양한 형태로 처리될 수 있는 특성이다.

    • 만약에 Shapes.draw(); 를 실행 했는데, Rectangle, Ellipse, Line에서 재정의한 draw 중 뭐가 나올지 모름 --> 다형성
  • 다형성을 구현하기 위해서는 상속, 재정의 메소드, 그리고 객체간의 형변환 세가지 조건이 필요하다.

  • 다형성의 이형 집합을 통한 구현 방식파라미터를 통한 구현 방식으로 구분 할 수 있다.

drawShapes메소드를 호출할 때 실제로 인스턴스를 만들어서 보내는 것이(자식 객체)


그렇게 되면 Shape shape = new Line() 이다. 파라미터는 부모 객체이고 만들어서 보내는건 자식 객체를 보낸다. 이 또한 다형성이기 때문에 -> Rectangle, Ellipse, Line에서 재정의한 draw 중 뭐가 나올지 모름

profile
아는만큼보인다.

0개의 댓글