CH07

yeon·2022년 11월 27일
0

이것이자바다

목록 보기
5/15

1. 상속(Inheritance)

자식(하위, 파생) 클래스가 부모 클래스의 멤버를 물려받는 것으로, 자식이 부모를 선택함
상속 대상은 부모의 필드와 메소드

상속의 효과

부모 클래스를 재사용함으로써 자식 클래스 빨리 개발 가능하며, 반복된 코드의 중복을 줄여줌
유지보수의 편리성을 제공해주며 객체의 다형성 구현 가능

상속 대상의 제한

부모 클래스의 private 접근을 갖는 필드와 메소드는 제외되며, 부모 클래스가 다른 패키지에 있을 경우 default 접근을 갖는 필드와 메소드도 제한됨

2. 클래스 상속 (extends)

자식 클래스가 상속할 부모 클래스를 지정하는 키워드는 extends

public class B extends A{}

다중 상속은 허용되지 않기 때문에 부모 나열 불가능 (Java 8 기준)

3. 부모 생성자 호출(super(...))

자식 객체를 생성하려면 부모 객체 먼저 생성된 후에 자식 객체가 생성된다.
즉, 부모 생성자가 호출 완료된 이후에 자식 생성자가 호출 완료된다.

public class CellPhone{
	public CellPhone(){
    }
}

public class DmbCellPhone extends CellPhone{
	public DmbCellPhone(){
    	super();
    }
}


DmbCellPhone dmbCellPhone = new DmbCellPhone(); // super() 통해서 CellPhone 선 생성 후 DmbCellPhone 생성

명시적으로 부모 생성자 호출

부모 객체 생성할 때 부모 생성자를 선택해 호출 가능함
super(매개값,...)은 매개값과 동일한 타입, 개수, 순서가 맞는 부모 생성자를 호출하므로, 부모 생성자가 없다면 컴파일 오류가 발생함
반드시 자식 생성자의 첫줄에 위치해야하며, 명시하지 않는 경우 기본 생성자가 호출되며, 기본 생성자가 없는 부모 클래스인 경우 필수적으로 명시해야함

4. 메소드 재정의

부모 클래스의 상속 메소드를 수정해서 자식 클래스에서 재정의하는 것

메소드 재정의 조건

  • 부모 클래스의 메소드 선언부는 동일해야 함
  • 접근 제한 더 강하게 할 수 없음
  • 새로운 예외 처리할 수 없음

@Override 어노테이션

컴파일러에게 부모 클래스의 메소드와 선언부가 동일한 지 검사하도록 지시하는 것으로 정확한 메소드 재정의를 위해 붙여 주는 것이 좋음

메소드 재정의를 통해서 부모 메소드는 숨겨지는 효과가 발생함

부모 메소드 사용

자식 클래스에서 수정되기 전의 부모 메소드를 호출하기 위해서는 super 사용

super.부모메소드();

5. final 클래스와 메소드

final 키워드의 용도

  • final 필드
    : 수정할 수 없는 필드
  • final 클래스
    : 부모로 사용할 수 없는 클래스, 상속 불가
  • final 메소드
    : 자식이 재정의할 수 없는 메소드, override 불가

즉, final 이 붙은 클래스와 메소드는 상속과 관련되어 있음

6. protected 접근 제한자

final과 마찬가지로 상속과 관련된 접근 제한자

  • 같은 package 내에서의 상속인 경우 default와 같이 동작
  • 다른 패키지인 경우 자식 클래스에서만 접근을 허용함

7. 타입 변환과 다형성

다형성(Polymorphism)

같은 타입이지만 실행 결과가 다양한 객체를 대입(이용)할 수 있는 성질로 부모 타입에는 모든 객체가 대입 가능하며 자식 타입은 부모 타입으로 자동 형변환

자동 타입 변환

프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것
상속 계층에서는 어떤 상위 타입이라도 자동 타입 변환 가능

효과
부모 클래스에 선언된 필드와 메소드만 접근가능하며,
메소드가 재정의된 경우 자식 클래스의 재정의된 메소드가 호출됨
이는 다형성과 관련있음

필드의 다형성

부모 타입으로 자동 변환 가능, 재정의된 메소드 있는 경우 다형성이 구현 가능

class Car{
	Tire frontLeftTire = new Tire();
    Tire frontRightTire = new Tire();
    Tire backLeftTire = new Tire();
    Tire backRightTire = new Tire();
    
    void run(){
    	frontLeftTire.roll();
        frontRightTire.roll();
        backLeftTire.roll();
        backRightTire.roll();
    }
    
    
    Car myCar = new Car();
    myCar.frontRightTire = new HankookTire();
    myCar.backLeftTire = new KumhoTire();
    myCar.run();
}

하나의 배열로 객체 관리

부모 타입의 배열을 선언한 후, 각 요소에 자식 타입의 객체 저장 가능

매개변수의 다형성

매개 변수가 클래스 타입인 경우 해당 클래스 객체 외 자식 객체 대입도 허용

강제 타입 변환 (Casting)

부모 타입을 자식 타입으로 변환시키는 경우
특정 조건에서만 가능

  • 자식 타입이 부모 타입으로 자동 변환된 이후 다시 자식 타입으로 변환하는 경우

자식 타입이 부모 타입으로 자동 변환될 경우 부모 타입에 선언된 필드와 메소드만 사용 가능하므로 자식 타입의 필드와 메소드 사용할 경우 강제 타입 변환이 필요함

객체 타입 변환

부모타입이라고 무조건 자식 타입 강제 변환 가능한 것이 아님
먼저 해당 객체가 자식타입의 객체인지 확인한 이후에 강제 타입 해야함

boolean result = parent instanceof Child

parent 변수가 참조하는 객체가 Child인지 조사

8. 추상 클래스(Abstract Class)

실체 클래스들의 공통된 특성을 추츨한 클래스로 실제 클래스의 부모 클래스 역할을 할 수 있음
단, 단독 객체 생성은 불가능하고, 부모 클래스로만 사용됨

용도

실체 클래스의 공통된 필드와 메소드의 이름을 통일할 목적
실체 클래스를 작성할 떄 시간을 절약
실체 클래스 설계 규격을 만들고자 할 때

추상 메소드와 오버라이딩

메소드의 이름을 동일하지만 실행 내용은 실체 클래스마다 다를 수 있음

구현 방법

추상 클래스에는 메소드의 선언부만 작성해 추상 메소드 선언
실체 클래스에서 메소드의 실행 내용을 작성해 오버라이딩

profile
🐥

0개의 댓글

관련 채용 정보