Today I Learned 상속!!!
상속이란 다른 클래스가 가지고 있는 멤버(필드, 메서드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속 받으면서 새 클래스가 자신의 멤버처럼 사용 할 수 있도록 하는 기능을 말한다.
클래스의 재사용, 연관된 클래스들에 대한 공통적인 규약을 정의한다.
클래스 간의 상속시 extends 사용
[접근제한자] class 클래스명 extends 클래스명 {}
ex)
public class Academy extends Company {}
모든 클래스는 Object클래스의 후손이다.
Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현이 가능하다.
ex) java.lang.String 클래스의 equals()와 toString()
부모 클래스의 생성자, 초기화 블록은 상속이 안된다.
자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행
자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 명시하고 싶다면 super() 활용
부모의 private멤버는 상속은 되지만 직접 접근 불가
자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우, 자식 생성자 안에서 부몬의 private 필드에 직접 접근하여 대입 불가하다.
super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨서 생성하거나, setter, getter 메소드를 이용해 접근 해야한다.
오버라이딩이란 자식 클래스가 상속 받은 부모 메소드를 재작성하는 것으로 부모 메서드를 자식 클래스에서 일부 고쳐 사용하겠다는 의미로 자식 객체를 통한 실행 시 후손 것이 우선권을 가진다.
쉽게 말해서 재정의 한다고 보면 이해하기 쉽다!
컴파일러에게 알려주기 위한 코드 (컴파일러 인식용 주석)
@Override 어노테이션
해당 메소드가 오버라이딩 되었음을 컴파일러에게 알려주는 역할 -> 컴파일러에게 문법 체크를 하도록 알린다.
부모 클래스의 메소드와 자식 클래스의 메소드 비교
이름이 비슷한 오버로딩과 오버라이딩의 차이점!!!
객체 지향 언어의 특징 중 하나로 '다양한 형태를 갖는다' 라는 뜻으로 하나의 행동으로 여러가지 일을 수행하는 개념이다.
상속을 이용한 기술로 부모 클래스 타입 참조변수 하나로 상속관계에 있는 려어 타입의 자식 객체를 참조할 수 있는 기술이다,
상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가 모든 자식 타입 객체릐 주소를 참조할 수 있다.
추가로 자식 객체의 주소를 전달 받은 부모 타입의 참조변수를 통해서 접근 할 수 있는 객체의 정보는 부모로부터 상속 받은 멤버만 참조 가능
단순하게 생각하면 자식이 부모흉내를 낼땐 자기껀 못 쓴다!
//Sonata 클래스는 Car 클래스의 후손
Car c = new Sonata();
//Sonata클래스형에서 Car클래스형으로 바뀜
부모타입 참조변수가 자식 객체를 참조하는 기술로 업캐스팅 상태에서만 진행이 가능하다!!!
부모타입을 자식타입으로 "강제 형변환" 해서 자식 객체의 본래 필드, 메소드를 사용 가능하다.
클래스 간의 형 변환은 반드시 상송 관계인 클래스끼리만 가능
//Sonata 클래스는 Car 클래스의 후손
Car c = new Sonata();
((Sonata)c).moveSonata();
실제 실행할 메소드 코드와 호출하는 코드를 연결 시키는 것으로 정적 바인딩과 동적 바인딩으로 나뉜다.
정적 바인딩은 프로그램이 실행되기 전 컴파일 단계에서 메소드와 메소드 호출부를 연결하고
동적 바인딩이란 컴파일 시 정적 바인딩된 메소드를 실행할 당시의 객체 타입을 기준으로 바인딩 되는것을 뜻한다.
동적 바인딩 성립 요건으로는 상속관계로 이루어져
다형성이 적용된 경우,
메소드 오버라이딩이 되어 있다면
정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드 코드를 우선적으로 수행한다.