JAVA

상속(Inheritance)

superbono 2021. 1. 29. 18:26

상속이란 부모 클래스(또는 상위 클래스) 가 자식 클래스(또는 하위 클래스 / 파생 클래스) 에게 자신의 필드와 메소드를 사용할 수 있게끔 물려주는 것이다.

예를 들어 int age라는 필드와 eat()이라는 메소드를 가진 animal 클래스를 dog 클래스가 상속 받았다면, dog 클래스에서도 age라는 필드와 eat()이라는 메소드를 사용할 수 있다. 거기에 dog클래스는 성별을 나타내는 sex 필드와, bark() 메소드 등 추가로 자기 자신만의 필드와 메소드를 가질 수 있다. 이 때 상속을 나타내려고 extends 라는 용어를 사용한다. 위의 예시대로라면 public void Dog extends Animal이 되겠다. 참고로 자바는 다중상속을 지원하지 않고 단일 상속만을 지원한다. 다중상속 => interface를 참고할 것.

이 말은 즉 어떤 자식 객체를 만들 때 먼저 부모 객체를 생성하고 거기에 덧붙여서 자식 객체가 생성된다는 말이다. 그렇기에 자식객체가 생성될 때 호출되는 자식 생성자 전에 부모 생성자가 먼저 호출이 된다. 이때 자식클래스에서 부모 클래스의 필드나 메소드를 접근할 때 super라고 하는  단어를 붙여주어야 한다. 예를 들어 부모 클래스의 age 필드에 접근하고 싶다면 super.age라고 기술하여야 한다. 참고로 자기 자신의 객체에 접근할 때는 this이다.

- @Override(메소드 재정의) vs Overloading

 

Overriding vs Overloading

사실 둘이 전혀 비슷한 개념 아니지만 그냥 내가 헷갈려서 묶어보았다.

오버로딩은 같은 메소드 이름과 이 메소드가 수행하는 일도 같다. 그러나 매개변수의 개수, 타입, 순서가 다르면 한 클래스 안에 같은 이름의 메소드를 여러 개 수행할 수 있는 것을 말한다.

ex) int plus(int x, int y) { int result = x + y}; return result; 

double plus(int x, double y} {double result = x + y;} return result; 

이 때 두 개의 메소드는 같다. 따라서 컴파일 오류가 나지 않는다.

 

오버라이딩은 상속과 관련이 있는 개념으로 상속된 일부 메소드가 자식 클래스에서 다르게 동작되고 싶다면 수정할 수 있는 기능이다 .

  • 부모의 메소드와 리턴타입, 메소드 이름, 매개변수 리스트가 동일해야 한다.
  • 접근 제한은 더 강하게 오버라이딩 할 수 없다. 부모가 public이면 자식도 public 이어야 한단 말
  • 새로운 예외(Exception)을 throw 할 수 없다. 

-부모 클래스

public void sleep(){

syso("쿨쿨쿨");

}

-자식 클래스

public void sleep(){

syso("zzz...."); // 부모 메소드의 sleep을 오버라이딩한 것으로 이것이 실행된다. 만약 부모의 sleep에 접근하고 싶다면                         super.sleep()해야 함

}

 

- final 키워드

final이 붙은 것은 이것이 최종 상태이다 라는 뜻이므로 필드, 메소드, 클래스에 붙을 수 있는데 이것이 붙으면 수정도 불가하고 그렇다. 따라서 final 클래스는 부모 클래스가 될 수 없다. final 메소드는 오버라이딩 할 수 없다.

 

- 타입 변환과 다형성

다형성이란 같은 메소드를 가지고 서로 다른 일을 하는 것, 하나의 형태의 변수가 여러 타입의 데이터를 가질 수 있는 것, 부모타입의 참조변수가 자식 타입의 클래스를 참조할 수 있는 것, 따라서 자식클래스에만 있는 메소드는 쓸 수 없음

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

Product p = new TV();

Animal a = new Dog();

뭐 이런거 다 가능하단 얘기다. 자동 타입 변환의 개념은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것이다. 아까 어떤 자식 객체를 만들 때 먼저 부모 객체를 생성하고 거기에 덧붙여서 자식 객체가 생성된다 라고 했는데 이 때 Animal a는 부모 객체 타입이지만 자식의 생성자로 생성이 되었고 따라서 부모 클래스가 가지고 있는 것만 가리킬 수 있다. 그러나? instanceof 를 사용해서 a instanceof Dog를 하면 true가 나올 것이다. (Dog) a 이런 식으로 강제 형변환도 가능하다. 

 

- 추상 클래스

객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다. 이 클래스의 공통적인 부분만 추출해서 선언한 클래스를 추상 클래스라고 한다. 그러나 실체 클래스는 추상 클래스를 상속할 수 있지만 추상클래스는 new 연산자를 사용해서 객체를 생성시킬 수 없다. 추상클래스를 사용하는 목적은 새로운 실체 클래스를 만들기 위해 부모 클래스로만 사용된다.

추상클래스의 용도는 크게 두 가지로 나눌 수 있는데, 다음과 같다.

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

추상 클래스를 선언할 때에는 abstract 키워드를 붙여야 한다. 추상 클래스도 일반 클래스와 마찬가지로 필드, 생성자, 메소드 등을 만들 수 있다. 추상 클래스는 추상 메소드를 선언할 수 있는데 이 때, 추상 클래스를 상속한 자식 클래스는 이 추상 메소드를 완성(오버라이딩 하라는 소리)해야 하는 의무를 가진다. 추상 메소드를 완성하지 않을거면 상속한 자식 클래스도 추상 클래스로 변해야한다.

'JAVA' 카테고리의 다른 글

Interface(인터페이스)  (0) 2021.06.30
String과 StringBuilder 비교하기 (String vs StringBuilder)  (0) 2021.06.21
메모리 구조(Stack, Heap)  (0) 2021.06.20
JDBC: executeQuery VS excuteUpdate  (0) 2021.04.25
1. 자바 시작하기  (0) 2021.01.29