자바의 상속(inheritance) 정리 & 오버라이딩(overriding)

자바에서의 inheritance(상속)

1. 자바는 왜 상속을 사용하는가?

상속을 사용하는 가장 큰 이유는 공통된 요소가 많을 경우에 redundancy(중복)을 피하기 위해서.

2. 상속의 구조

Super Class와 Sub Class가 존재.

Sub class는 Super class를 상속받는다.

위의 그림에서 classA를 Super Class라 부르며, classB와 classC를 Sub Class라고 부른다.

3. 상속은 어떻게 표현하는가?

extends를 사용함.

public class Employee extends Person {

	//code
    
}

4. 상속 사용시 주의할 점

Sub class에서 정의되어있지 않지만, Super class에서 public으로 정의되어 있다면 Sub class에서 이를 정의하지 않아도 자신의 메소드 인 것 처럼 사용할 수 있다. 그러나 private으로 정의되어있는 것은 해당 클래스에서 밖에서 접근할 수 없고, super class에서 정의된 accessors(get method)와 mutators(set method)로 접근해야 한다.

보통 상속은 is-a 관계로 표현되지만, 모든 is-a가 상속으로 표현되는 것은 아니다.

자바는 mutiple inheritance를 허용하지 않는다. 무조건 single inheritance로.

슈퍼클래스에서 private으로 정의된 메소드는 상속되지 않는다.

5. Super Keyword

슈퍼클래스의 constructor(생성자)는 서브클래스로 상속되지 않는다.

그러나 서브클래스의 생성자안에서 super(= super class) 키워드로 실행할 수 있다.

서브 클래스에서 super 키워드가 명확하게 사용되지 않았다면, no-argument constructor(인자가 없는 생성자)가 자동으로 서브클래스의 생성자에서 호출된다.

super() = super class's constructor

super.method() = super class에 정의된 메소드 호출

이때, super 키워드가 아닌 super class의 이름을 사용하여 constructor 생성하면 에러 발생가 발생하므로 super 키워드를 사용해야 한다.

만약 슈퍼클래스에 no-argument constructor가 없었다면

(= 본인이 슈퍼클래스에서 직접 인자가 있는 생성자를 만들어서

자바에서 자동으로 no-argument constructor를 생성하지 않았거나

||(또는) 본인이 직접 no-argument constructor를 만들지 않았더라면),

에러가 발생한다.

따라서 슈퍼클래스가 될 가능성이 있는 클래스를 만들때는 no-argument constructor를 만들어 주는 것이 좋다.

또한 서브클래스에서 명확하게 슈퍼클래스의 no-argument constructor를 불러주는 것이 좋다.

6. java.lang.Object

우리가 만든 자바의 모든 클래스(상속받지 않은 상태)들은 사실 자동적으로 java.lang.Object의 서브클래스이다. 따라서 우리는 Object class의 public method들을 사용할 수 있다. 예를 들어 toString().

Method Overriding(메소드 오버라이딩)

1. Overloading과의 차이점

overloading(오버로딩)과 Overriding(오버라이딩)은 다른 의미.

overloading이란 슈퍼클래스에 이미 존재하는 메소드를 서브클래스에서 같은 메소드로 다시 만드는 것.

즉, 그 클래스는 같은 메소드 이름을 가지는 메소드를 여러개 가지게 되는 것.

인자타입 등에 따라 다양한 메소드를 호출할 수 있다.

public static int max(int num1, int num2){

	// code
    
}

public static double max(double num1, double num2){

	// code
    
}

위와 같은 형태가 메소드 오버로딩이다.

2. Overriding이란

슈퍼클래스에 public으로 정의되어있는 메소드를 서브클래스가 상속받는데,

이때 슈퍼클래스의 메소드의 implementation(구현)을 서브클래스에서 수정해야할 때가 있다. 이 때 method overriding을 한다.

서브클래스에서 메소드 오버라이딩을 할 때에는 슈퍼클래스의 메소드와 same signature, same return type을 가져야 한다.

(이 때 signature란 메소드의 이름과 parameter list를 의미. 예를 들어 public static double min(double num1, double num2)라는 함수의 헤더가 있을 때 min(double num1, double num2)가 method signature이다.)

따라서 달라질 수 있는 것은 함수 내부 구현과 modifier(public/private 등등)정도.

instance method(인스턴스 메소드)는 접근가능할 경우(슈퍼클래스에서 public method인 경우)에만 오버라이딩이 가능하다.

오버라이딩 할 경우, 항상 해당 클래스에서 오버라이딩한 메소드를 호출한다. (오버로딩과의 차이점)

메소드 오버라이딩은 상속된 경우에만 사용 가능

3. static method의 경우

static method는 상속될 수 있지만, 오버라이딩 할 수는 없다.

만약 이를 서브클래스에서 재정의했다면, 슈퍼클래스에 정의되어있던 static method는 없는 것 처럼 되고,

서브클래스의 static method만 사용할 수 있다.

4. Override annotation (@Override)

자바에서는 오버로딩과 오버라이딩의 실수를 줄여주기 위해 "override annotation"을 제공한다.

서브클래스에서 슈퍼클래스에 이미 존재하는 메소드를 오버라이딩 하고자 하는 경우 그 메소드 위에 "@Override"를 사용한다.

public class SubClass extends SuperClass {
	
    @Override
    public int max(int num1, int num2){
    	return "The max number is " + super.max(num1, num2);
    }
    
}

이는 @Override 밑에 존재하는 메소드는 슈퍼클래스에 존재하는 메소드이며, 그 메소드를 이 서브클래스에서 오버라이딩 하겠다는 의미이다.

이는 오버라이딩이 목적이었지만 실수로 오버로딩이 된 경우에 컴파일 에러를 내준다.

좋은 웹페이지 즐겨찾기