Java의 상속(Inheritance)

Dohyeon Kong·2024년 4월 5일
0

Java☕

목록 보기
7/12
post-thumbnail

앞서 자바의 객체 지향 특성 중에 캡슐화, 상속, 다형성이 존재한다고 했는데,
상속과 다형성에 대해 알아보도록 하겠다!

자바의 객체 지향 특성

  • 캡슐화(encapsulation)
  • 상속(inheritacne)
  • 다형성(polymorphism)

상속(Inheritance)

상위 개체의 속성이 하위 개체에 물려져서, 하위 개체가 상위 개체의 속성을 모두 가지는 관계

  • 자바의 상속은 자식 클래스가 부모 클래스의 속성을 물려받아 부모 클래스에 기능을 확장(extends)하는 개념을 의미한다.
  • 부모 클래스를 Super Class, 자식 클래스를 Sub Class라고 부른다.

다형성(Polymorphism)

같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 구현되는 것

다형성의 종류

  • 메소드 오버라이딩 (Method overriding)
    슈퍼 클래스에 구현된 메소드를 서브 클래스에서 자신의 특징에 맞게 동일한 이름으로 다시 구현하는 방법
  • 메소드 오버로딩 (Method Overloading)
    클래스 내 같은 이름의 메소드를 여러 개 만드는 방법

자바의 상속(Inheritance)

인간세계의 상속과 비슷하지만 엄연히 차이점이 있다.
객체 지향 언어에서의 상속부모 유전자를 자식이 물려받는 유전적 상속과 유사하다.

상속의 장점

  • 클래스 사이의 멤버 중복 선언이 불필요하다.
  • 클래스들의 계층적 분류로 클래스의 관리가 용이하다.
  • 클래스의 재사용과 확장을 통해 소프트웨어의 생산성이 향상된다.

자바의 상속 선언

extends키워드를 사용하여 상속을 선언한다.

  • 앞서 설명하였듯이 부모 클래스를 슈퍼 클래스로, 자식 클래스를 서브 클래스로 부른다.
  • 자바에서는 상속 선언에 '확장한다'라는 의미를 가진 extends 키워들르 사용함으로 사용자에게 확장한 클래스라는 것을 자연스럽게 느끼게 해준다.

class Point{
	int x, y;
}
class ColorPoint extends Point {
	String color;
}

자바의 상속 예시 코드

결과 코드

상속 선언

// 자바에서 상속하는 선언하는 방법
class ColorPoint extends Point {...}

서브 클래스 객체 생성

Point p = new Point();
ColorPoint cp = new ColorPoin(); // 서브 클래스 객체 생성

서브 클래스 객체 활용

  • 앞서 보여준 코드를 보면 외부에서 ColorPoint 객체의 public 멤버와 슈퍼 클래스 Point의 public 멤버를 모두 접근할 수 있지만, x, y, color는 private 속성이므로 외부에서 접근이 불가능하다.

서브 클래스에서 슈퍼 클래스 멤버 접근

  • 서브 클래스는 슈퍼 클래스의 private 멤버 외 모든 멤버를 접근할 수 있다.


자바 상속의 특징

    1. 자바에서는 클래스의 다중 상속을 지원하지 않는다.
    1. 자바의 모든 클래스는 자바에서 제공하는 Object 클래스를 자동으로 상속받도록 컴파일 된다. 클래스가 아무 클래스도 상속받고 있지 않더라도 컴파일러에 의해 Object 클래스를 자동으로 상속받도록 컴파일한다.

상속과 생성자

서브 클래스와 슈퍼 클래스 모두 생성자를 가지고 있다. 그러면 여기서 의문점이 들 것이다.
서브 클래스의 객체가 생성될 때 어떤 생성자가 실행이 되는지 만약 둘 다 실행이 되면 누가 먼저 실행이 되는지 궁금할 것이다!!

  • 서브 클래스의 객체가 생성될 때 생성자는 둘 다 실행이 된다!!
    또한, 슈퍼클래스가 먼저 실행이 되고 나서 서브 클래스의 생성자가 실행이 된다.

// * 결과 *
생성자 A
생성자 B
생성자 C

서브 클래스에서 슈퍼 클래스 생성자 선택

  • 슈퍼 클래스의 생성자를 명시적으로 지정하지 않으면, 컴파일러는 묵시적으로(implicit) 슈퍼 클래스의 기본 생성자가 호출되도록 컴파일한다.

  • 클래스 A에 기본 생성자 없이 A(int x)만 선언되어 있으면 클래스 B의 생성자와 짝을 이룰 기본 생성자가 클래스 A에 없기 때문에 컴파일러에 의해 에러가 발생한다.

그러므로 super() 를 이용하여 명시적으로 슈퍼 클래스의 생성자를 선택하면 된다.
주의해야 할 점은 super()의 호출은 반드시 생성자의 첫 라인이어야 한다.

//super() 생성자 사용 예시
class A{
	public A(){
    	System.out.println("생성자 A");
   	}
    public A(int x){
    	System.out.println("매개변수 생성자A" + x);
    }

}
class B extends A{
	public B(){
    	System.out.println("생성자 B");
    }
    public B(int x){
    	super(x);
        System.out.println("매개변수생성자B");
}

참조📜

  • 명품 JAVA ESSENTIAL - 황기태 지음-
profile
천천히, 꾸준히, 그리고 끝까지

0개의 댓글