ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7. 상속
    Java 2021. 8. 9. 19:20

    상속

    객체 지향 프로그램에서 부모 클래스를 상위 클래스라 하며, 자식 클래스를 하위클래스라고 한다.

    부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있다.

    상속은 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 코드의 중복을 줄여준다.

    부모클래스에 private 접근 제한자가 붙은 것들은 상속 대상에서 제외된다.

    자바는 다중 상속을 허용하지 않는다.

     

    class 자식클래스 extends 부모클래스 {
    	super(); //부모클래스의 기본생성자 호출
    }

     


    메소드 재정의(@Override)

    메소드 오버라이딩은 상속된 메소드의 내용이 자식 클래스에 맞지 않을 경우,

    자식 클래스에서 동일한 메소드를 재정의하는 것을 말한다.

    • 부모의 메소드와 동일한 시그너처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야 한다.
    • 접근 제한을 더 강하게 오버라이딩 할 수 없다.
    • 새로운 예외(Exception)를 throws 할 수 없다.

     


    상속할 수 없는 final 클래스

    클래스를 선언할 때 final 키워드를 class 앞에 붙이게 되면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다. 즉 final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다.

    final 클래스의 대표적인 예는 String 클래스이다.

    //자바 표준 API에서 제공하는 String 클래스
    public final class String {...}
    
    
    //아래처럼 String 클래스를 상속할 수 없음 (틀린것임!!!!!)
    public class NewString extends String {...}

     


    오버라이딩 할 수 없는 final 메소드

    메소드를 선언할 때 final 키워드를 붙이게되면 이 메소드는 최종적인 메소드이므로 오버라이딩 할 수 없다.

    즉 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 할 수 없다.

     


    타입 변환과 다형성

    다형성은 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다.

    다형성을 위해 자바는 부모 클래스로 타입 변환을 허용한다.

    즉 부모 타입에 모든 자식 객체가 대입될 수 있다.

     

    자식 타입은 부모 타입으로 자동 타입 변환이 가능하다.

    아래 코드에서 HankookTire와 KumhoTire는 Tire를 상속했기 때문에 Tire 변수에 대입할 수 있다.

    public class car {
    	Tire t1 = new HankookTire(); //타이어 타입 필드에 자식 타입 객체 대입
        Tire t2 = new KumhoTire();
    }

     

    자동 타입 변환(Promotion)

    자동 타입 변환은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.

    자동 타입 변환의 개념은 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것이다.

    //Cat 은 Animal을 상속받고 있는 경우의 자동 타입 변환
    Animal animal = new Cat();

     

    부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.

    메소드가 자식 클래스에서 오버라이딩되었다면 자식 클래스의 메소드가 대신 호출된다. (다형성과 관련 있음)


    매개변수의 다형성

    매개 변수의 타입이 클래스일 경우, 해당 클래스의 객체뿐만 아니라 자식 객체까지도 매개값으로 사용할 수 있다는 것이다. 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행 결과는 다양해질 수 있다.

    자식 객체가 부모의 메소드를 재정의(오버라이딩)했다면 메소드 내부에서 오버라이딩된 메소드를 호출함으로써 메소드의 실행 결과는 다양해진다.

    //vehicle은 자식객체
    void drive(Vehicle vehicle) {
    	vehicle.run(); //자식 객체가 정의한 run() 메소드 실행
    }

     


    강제 타입 변환(Casting)

    강제 타입 변환은 부모 타입을 자식 타입으로 변환하는 것을 말한다.

    자식 타입이 부모 타입으로 자동 변환한 후, 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.

    자식 타입이 부모 타입으로 자동 변환하면, 부모 타입에 선언된 필드와 메소드만 사용 가능하다는 제약 사항이 따른다.

    만약 자식 타엡의 필드와 메소드를 사용해야 한다면, 강제 타입 변환을 해서 다시 자식 타입으로 변환한 후 사용하자.

     

     


    추상 클래스

    객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다.

    추상 클래스는 new 연산자를 사용해서 인스턴스를 생성시키지 못한다.

    추상 클래스의 용도는 아래와 같다.

    1. 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적
    2. 실체 클래스를 작성할 때 시간을 절약

     

    추상 클래스 선언

    추상 클래스를 선언할 때에는 클래스 선언에 abstract 키워드를 붙여야 한다.

    이를 붙이게 되면 new 연산자를 이용해서 객체를 만들지 못하고 상속을 통해 자식 클래스만 만들 수 있다.

    new 연산자로 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super(...)를 호출해서

    추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야한다.

     

    public abstract class Phone{ //new 생성불가! 오로지 상속만!
    	//필드
        public String owner;
        
        //생성자
        public Phone(String owner){
        this.owner = owner;
        }
        
    	//메소드 등
    }

     

     

     


     

    해당 포스트는 이것이 자바다(신용권의 Java 프로그래밍 정복)을 읽은 후 기록한 내용입니다.

    참고서적링크 : https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=50563128

     

    이것이 자바다

    15년 이상 자바 언어를 교육해온 자바 전문강사의 노하우를 아낌 없이 담아낸 자바 입문서. 저자 직강의 인터넷 강의와 Q/A를 위한 커뮤니티(네이커 카페)까지 무료로 제공하여 자바 개발자로 가

    www.aladin.co.kr

     

    'Java' 카테고리의 다른 글

    9. 자동 리소스 닫기  (0) 2021.08.21
    8. 인터페이스  (0) 2021.08.18
    6-2. 클래스  (0) 2021.08.09
    6-1. 클래스  (0) 2021.07.28
    5. 참조 타입  (0) 2021.07.07
Designed by Tistory.