230727 TIL Chapter 12. 상속 ( Inheritance ), 오버라이딩 ( Overriding ), 다형성 ( Polymorphism ), 바인딩

최규연·2023년 7월 27일
0

TIL

목록 보기
12/57

Today I Learned 상속!!!

상속 Inheritance

상속이란 다른 클래스가 가지고 있는 멤버(필드, 메서드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속 받으면서 새 클래스가 자신의 멤버처럼 사용 할 수 있도록 하는 기능을 말한다.

상속 목적

클래스의 재사용, 연관된 클래스들에 대한 공통적인 규약을 정의한다.

상속의 장점

  • 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있다. == 코드길이 감소
  • 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경에 용이하다.
  • 코드의 중복을 제거하여 프로그램의 생산성과 유지보수가 좋다.

상속 방법

클래스 간의 상속시 extends 사용

표현식

[접근제한자] class 클래스명 extends 클래스명 {}
ex)
public class Academy extends Company {} 

상속의 특징

  1. 모든 클래스는 Object클래스의 후손이다.
    Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현이 가능하다.
    ex) java.lang.String 클래스의 equals()와 toString()

  2. 부모 클래스의 생성자, 초기화 블록은 상속이 안된다.
    자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행
    자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 명시하고 싶다면 super() 활용

  3. 부모의 private멤버는 상속은 되지만 직접 접근 불가
    자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우, 자식 생성자 안에서 부몬의 private 필드에 직접 접근하여 대입 불가하다.
    super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨서 생성하거나, setter, getter 메소드를 이용해 접근 해야한다.


오버라이딩 Overriding

오버라이딩이란 자식 클래스가 상속 받은 부모 메소드를 재작성하는 것으로 부모 메서드를 자식 클래스에서 일부 고쳐 사용하겠다는 의미로 자식 객체를 통한 실행 시 후손 것이 우선권을 가진다.
쉽게 말해서 재정의 한다고 보면 이해하기 쉽다!

오버라이딩 특징

  • 메소드 헤드라인 위에 반드시 Annotation (어노테이션), @Override를 표시 해야한다.
  • 접근 제어자를 부모 것보다 같거나 넓은 범위로 변경이 가능하다.
  • 부모 메소드의 예외처리 클래스 처리범위보다 좁은 범위로 예외처리 클래스 수정이 가능하다.

Annotation (어노테이션)

컴파일러에게 알려주기 위한 코드 (컴파일러 인식용 주석)
@Override 어노테이션
해당 메소드가 오버라이딩 되었음을 컴파일러에게 알려주는 역할 -> 컴파일러에게 문법 체크를 하도록 알린다.

오버라이딩 성립조건

부모 클래스의 메소드와 자식 클래스의 메소드 비교

  • 메소드 이름 동일
  • 매개변수의 개수, 타입, 순서 동일
  • 리턴 타입 동일
  • private 메소드 오버라이딩 불가

이름이 비슷한 오버로딩과 오버라이딩의 차이점!!!


다형성 Polymorphism

객체 지향 언어의 특징 중 하나로 '다양한 형태를 갖는다' 라는 뜻으로 하나의 행동으로 여러가지 일을 수행하는 개념이다.
상속을 이용한 기술로 부모 클래스 타입 참조변수 하나로 상속관계에 있는 려어 타입의 자식 객체를 참조할 수 있는 기술이다,

업캐스팅

상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가 모든 자식 타입 객체릐 주소를 참조할 수 있다.
추가로 자식 객체의 주소를 전달 받은 부모 타입의 참조변수를 통해서 접근 할 수 있는 객체의 정보는 부모로부터 상속 받은 멤버만 참조 가능
단순하게 생각하면 자식이 부모흉내를 낼땐 자기껀 못 쓴다!

//Sonata 클래스는 Car 클래스의 후손
Car c = new Sonata();
//Sonata클래스형에서 Car클래스형으로 바뀜

다운캐스팅

부모타입 참조변수가 자식 객체를 참조하는 기술로 업캐스팅 상태에서만 진행이 가능하다!!!
부모타입을 자식타입으로 "강제 형변환" 해서 자식 객체의 본래 필드, 메소드를 사용 가능하다.
클래스 간의 형 변환은 반드시 상송 관계인 클래스끼리만 가능

//Sonata 클래스는 Car 클래스의 후손
Car c = new Sonata();
((Sonata)c).moveSonata();

바인딩

실제 실행할 메소드 코드와 호출하는 코드를 연결 시키는 것으로 정적 바인딩과 동적 바인딩으로 나뉜다.

정적 바인딩은 프로그램이 실행되기 전 컴파일 단계에서 메소드와 메소드 호출부를 연결하고
동적 바인딩이란 컴파일 시 정적 바인딩된 메소드를 실행할 당시의 객체 타입을 기준으로 바인딩 되는것을 뜻한다.

동적 바인딩 성립 요건으로는 상속관계로 이루어져
다형성이 적용된 경우,
메소드 오버라이딩이 되어 있다면
정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드 코드를 우선적으로 수행한다.

0개의 댓글