ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [live-study] 6주차 :: 상속
    JAVA/라이브 스터디 | whiteship 2021. 1. 9. 13:14

    https://youtu.be/HLnMuEZpDwU

    참고도서 : Java의 정석, Java in a Nutshell

     

     

     

    0. 상속

    상속이란
    • 상속이란 현실에서는 부모가 자식에게 물려주는 행위를 말한다. 마찬가지로 부모 클래스(기존의 클래스)를 재사용하여 자식 클래스(새로운 클래스)를 작성하는 것을 프로그래밍에서 상속이라고 부른다.
    • 상속을 통해 확장을 보다 쉽게 할 수 있고, 코드의 중복도 제거하여 프로그램의 생산성을 높일 수 있다.
    • 상속은 키워드 'extends'를 이용하여 나타낼 수 있다.
    • 코드 / 상속 관계도 / 상속 후 자식클래스의 범위를 나타내면 다음과 같다.

    • 그림에서 알 수 있듯이 자식클래스가 부모클래스보다 더 넓은 범위이다. 즉, 자식클래스는 부모클래스 안의 멤버(변수, 메소드) 등을 다 상속 받을 수 있으므로, 자식클래스가 부모클래스보다 같거나 더 많은 멤버를 갖을 수 있다.
    • 생성자나 초기화 블럭은 상속되지 않는다. 
    포함이란
    • 포함(Composite)이란 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 의미한다.

    is-a / has-a
    • is-a는 상속관계로 '~은(는) ~이다.' 라고 해석할 수 있다.
    • has-a는 포함관계로 '~은(는) ~을 가지고 있다.' 라고 해석할 수 있다.


    1. 자바 상속의 특징

    자바 상속의 특징 - 단일 상속
    • 다른 대표적인 객체지향 언어인 C++ 같은 경우 여러 부모 클래스에서 상속 받을 수 있는 다중상속(multiple inheritance)를 혀용한다.
    • 하지만 자바에서는 오직 단일상속(single inheritance)만 지원한다. 즉, 둘 이상의 부모 클래스로부터 상속 받을 수 없다.

    자바 상속의 특징 - Object클래스
    • Object 클래스는 모든 클래스의 최상위에 위치한 부모클래스이다. 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스를 상속 받는다.
    자바 상속의 특징 - super
    • 부모클래스로부터 상속받은 멤버를 참조하는데 사용된다. 

    2. super 키워드

    super - 참조변수
    • super는 부모클래스로부터 상속받은 멤버를 자식클래스에서 참조하는데 사용된다. this키워드가 생성자의 매개변수 이름과 인스턴스변수 이름이 같은 경우 사용했다면, super도 마찬가지로 상속받은 멤버와 자신의 멤버 이름이 같은 경우 사용된다.
    • 부모클래스로부터 상속받은 멤버는 자식클래스의 멤버이기도 하므로 super 대신 this를 사용할 수도 있다.
    • super는 this와 마찬가지로 인스턴스메서드에서만 사용할 수 있고, static 메서드에서는 사용할 수 없다.

     

    super() - 생성자
    • super()는 부모클래스의 생성자를 호출하는데 사용된다. this()가 같은 클래스의 다른 생성자를 호출한다면, super()는 부모 클래스의 생성자를 호출하는데 사용된다. 
    • 자식 클래스에서 부모클래스의 멤버를 사용할 수 있는 이유는, 자식 클래스에서 인스턴스를 생성하면 자식의 멤버와 부모의 멤버가 합쳐진 하나의 인스턴스가 생성되기 때문이다.
    • 이 때, 부모 클래스 멤버의 초기화 작업이 먼저 수행되어야 하므로, 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출해야한다. 이는 클래스가 상속관계를 타고 올라가면서, Object 클래스의 생성자인 Object()까지 까지 가서야 끝이 난다.
    • 즉, Object 클래스를 제외한 모든 클래스의 생성자는 반드시 자신의 다른 생성자 또는 부모의 생성자를 호출해야한다.
    • 만약, 추가하지 않으면 컴파일러는 생성자의 첫 줄에 super(); 를 자동으로 추가한다.

    • 하지만, 컴파일러가 super();를 자동적으로 추가하지 않는 경우도 있다. 만약 생성자가 정의되어 있는 클래스라면 수동으로 추가를 해주어야한다.

     

    • 그래서 부모클래스에 생성자 Vehicle()을 추가해주거나, 자식클래스 생성자의 첫 줄에서 Vehicle(String name, int yaer)를 호출하도록 해야한다.

    3. 메소드 오버라이딩

    오버라이딩
    • 부모 클래스로부터 상속받은 메서드의 내용을 자식 클래스에서 자신에 맞게 재정의(변경)하는 것을 오버라이딩(overriding)이라고 한다.

    오버라이딩의 조건
    • 오버라이딩은 메소드 내부의 내용만을 새로 작성하는 것이므로, 선언부(이름, 반환타입, 매개변수)는 부모클래스와 일치해야만 한다. (JDK1.5부터는 '공변 반환타입(convariant return type)'이 추가되어, 반환타입을 자식클래스의 타입으로 변경이 가능하다.)
    • 접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경 할 수 없다. 부모클래스 메서드의 접근 제어자가 protected라면, 오버라이딩하는 자식 클래스 메서드의 접근 범위가 더 넓거나 같은 protected나 public이어야한다. 
    • 부모 클래스의 메서드보다 더 많은 수의 예외를 선언 할 수 없다. 또한, 자식 클래스의 수가 적더라도, 예외의 최고 조상격인 Exception만 쓰는것도 불가능하다.

     

    오버로딩? 오버라이딩?
    • 오버로딩(overloading)이란 기존에 없던 새로운 메서드를 정의하는 것이다. 

    4. 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)

    다이나믹 메소드 디스패치
    • 다이나믹 메소드 디스패치란 컴파일 타임이 아닌 런타임에 오버라이드 된 메소드가 실행되는 메커니즘을 의미한다.
    • 즉, 호출될 메서드가 컴파일 시 결정되는 것이 아니라 런타임시점에서 결정된다.
    • 아래 예제처럼, 부모 클래스를 참조하여 자식 객체를 생성하고 있지만, 부모 클래스가 아닌 자식 클래스에서 재정의 된 메서드가 실행된다.

     

     

    @ 제어자

    제어자(modifier)
    • 제어자란 변수, 클래스, 메서드의 선언시 함께 사용되어 부가적인 의미를 부여한다. 크게 접근 제어자와 그 외의 제어자로 나뉜다.
    접근 제어자
    • 접근 제어자는 멤버 또는 클래스(public, default)에서 사용되며, 해당 멤버나 클래스를 외부에서 접근하는데 제한을 줄 수 있는 역할을 한다. 접근 제어자는 public, protected, default, private 4가지 종류가 있으며, 한 가지만 선택해서 사용 할 수 있다.
    • default는 말 그대로 default 이므로, 접근 제어자가 지정되어 있지 않다면 default로 간주하고 실제로 default를 붙이지 않는다.
    • 접근 제어자는 외부에 공개될 필요가 없는 부분을 감추기 위해서 사용된다.

    그 외 제어자
    • 그 외 제어자로는 static, final, abstract, native, .. 등이 있으며, 여러 제어자를 조합해서 사용할 수 있다.

    5. 추상 클래스

    abstract
    • abstract는 메서드의 선언부만 작성하고, 블록 내 실제 내용은 구현하지 않은 메서드를 선언할 때 사용한다. 클래스와 메서드에 사용할 수 있다.
    • abstract 클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
    • abstract 메서드 : 메서드의 선언부만 작성하고, 구현부는 아무것도 작성하지 않은 메서드를 의미한다.
    추상 클래스 (abstract class)
    • 우리가 상속을 한다는 것은 비슷한 기능끼리 묶을 수 있다라는 의미이다. 그렇게 되면 자식 클래스에서는 부모 클래스에 정의된 메서드를 재정의하게 되는데, 이 때 부모 클래스에서는 그 재정의 된 함수는 실행되지 않는다. 즉, 구현부 없이 선언부가 있어도, 프로그램을 실행하는데 전혀 문제가 되지 않는다는 뜻이다. 
    • 이런 경우 메서드에 abstract 키워드를 붙여 추상메서드로 만들고, 이러한 추상 메서드가 선언되어 있는 클래스에도 abstarct 키워드를 붙여 추상 클래스라고 한다. 

    6. final 키워드

    final
    • 클래스, 메서드, 변수에 사용될 수 있으며, final 키워드를 사용하면 변경 할 수 없게 된다.
    • final 클래스 : 변경될 수 없는 클래스로 확장을 할 수가 없다. 즉, 부모 클래스가 될 수 없다. 
    • final 메서드 : 변경될 수 없는 메서드로 재정의를 할 수 없다. 즉, 오버라이딩(overriding)이 불가능하다.
    • final 변수 : 변경될 수 없는 상수가 된다.

    7. Object 클래스

    Object 클래스
    • 앞서 말한 것처럼, Object 클래스는 모든 클래스의 최상위에 위치한 부모클래스이며, 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스를 상속 받는다.
    • 따라서 자바의 모든 클래스들은 Object 클래스의 멤버들을 상속 받기 때문에, Object 클래스에 정의된 멤버(toString(), equals(), ... ) 을 사용할 수도 있다.

     

     

    참고자료

     

     

    댓글

Programming Diary