본문 바로가기

IT/JAVA

자바 상속 - 백기선님 스터디 6주차 과제

목표

자바의 상속에 대해 학습하세요.

학습할 것 (필수)

  • 자바 상속의 특징
  • super 키워드
  • 메서드 오버라이딩
  • 다이나믹 메서드 디스패치 (Dynamic Method Dispatch)
  • 추상 클래스
  • final 키워드
  • Object 클래스

자바 상속의 특징

상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

기존 클래스를 재사용하므로 코드 중복을 제거하며 유지보수가 용이해진다.

extends를 사용하여 상속을 구현할 수 있다.

class 상속 받는 클래스 명 extends 상속 하는 클래스 명{
	⋮
}

ex)
class Child extends Parent {
	⋮
}

Child 클래스와 Parent 클래스는 상속 관계에 있다고 하며 상속해주는 클래스를 '조상 클래스', 상속받는 클래스를 '자손 클래스'라고 한다. 아래와 같은 용어를 사용하기도 한다.

조상 클래스 부모(parent)클래스, 상위(super)클래스, 기반(base)클래스
자손 클래스 자식(child)클래스, 하위(sub)클래스, 파생된(derived)클래스

 

자식 클래스는 부모 클래스의 모든 멤버를 상속받는다. 단, 생성자와 초기화 블록은 상속되지 않는다.

class Parent{
	int age;
}

class Child extends Parent {
	⋮
}

위 코드는 아래와 같은 그림으로 나타낼 수 있다.

왼) 상속관계도 / 오) 다이어그램

Parent에 존재하는 모든 멤버가 상속되므로 Child 객체를 생성할 경우 age 변수를 사용할 수 있다.

class Family {
	public static void main(String args[]){
    	Child newChild = new Child();
        
        newChild.age = 1;
    }
}

 

이때 자식 클래스의 인스턴스와 부모 클래스의 인스턴스가 각각 생성되는 것이 아니라

자식 클래스의 멤버와 부모 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.

단일 상속

자바는 단일 상속만을 허용한다. 다중 상속이 가능한 언어도 있지만, 다중 상속은 클래스 간의 관계가 복잡해지고 서로 다른 클래스로부터 상속받은 멤버 간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점을 가지고 있다.

super 키워드

자식 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는 데 사용한다.

 

super() - 조상 클래스의 생성자

조상 클래스의 생성자를 호출하는 데 사용된다.

Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에는 this() 또는 super()를 호출해야 한다.

작성되지 않은 경우는 컴파일러가 자동으로 super();를 추가해준다.

 

메소드 오버라이딩

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.

오버라이딩 조건

  • 오버라이딩은 메서드의 내용만 새로 작성하는 것이므로 메서드의 선언부는 완전히 일치해야 한다.
  • 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
  • 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.

o0p 5v0f - 설이가 쓴 설명

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

Dispatch

어떤 메서드를 호출할 것인가를 결정하여 그것을 실행하는 과정이다. 다이나믹 디스패치와 스태틱 디스패치가 존재한다.

Dynamic Dispatch

메서드 오버라이딩이 되어있는 경우 실행 시점에 어떤 메서드를 실행할지 결정되는 것이다.

Static Dispatch

컴파일 시점에 어떤 메서드를 실행할지 결정된다.

 

추상 클래스

abstract 키워드를 사용하여 생성할 수 있다.

abstract class 클래스명{
	⋮
}

 

추상 메서드를 포함하고 있다.

추상 클래스 자체로는 인스턴스를 생성하지 못하며, 상속을 하는 부모 클래스의 역할만 가능하다.

 

추상 메서드

선언부만 작성하고 구현부는 작성하지 않은 것.

구현부가 비어있으므로 상속받은 클래스에서 오버라이딩을통해 구현부를 작성해야 한다.

abstract 리턴타입 메서드이름();

 

추상 클래스를 상속받은 클래스에서는 오버라이딩을 통해 부모 클래스의 추상 메서드를 모두 구현해야 한다.

구현하지 않는 메서드는 자식 클래스에서도 추상 메서드로 지정해야 한다.

 

final 키워드

'마지막의', '변경될 수 없는'의 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다.

대상 의미
클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
다른 클래스에 상속될 수 없다.
메서드 변경될 수 없는 메서드. 오버라이딩 불가
멤버 변수 값을 변경할 수 없는 상수
지역 변수 값을 변경할 수 없는 상수

 

생성자를 이용한 final 멤버 변수의 초기화

클래스 내 매개변수를 갖는 생성자를 선언하여 인스턴스를 생성할 때 final이 붙은 멤버 변수를 초기화할 수 있다.

 

Object 클래스

Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 조상 클래스이다.

다른 클래스를 상속받지 않는 모든 클래스는 컴파일러에 의해 자동적으로 Object 클래스를 상속받는다. toString()이나 equals() 같은 메서드들이 Object 클래스에 정의되어있어 따로 정의하지 않고도 사용할 수 있었던 것이다.

 

 

Reference)

자바의 정석 - 남궁성

 ko.wikipedia.org/wiki/%EB%8F%99%EC%A0%81_%EB%94%94%EC%8A%A4%ED%8C%A8%EC%B9%98

 

동적 디스패치 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 디스패치는 어떤 메소드를 호출할 것인가를 결정하여 그것을 실행하는 과정이다. 동적 디스패치와 정적 디스패치가 있는데, 동적 디스패치(dynamic dispatch)는 메

ko.wikipedia.org