(객체지향 프로그래밍)상속

Backend kwon·2023년 4월 17일

상속

상속 : 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소로, 상위 클래스의 멤버(필드, 메서드, 내부 클래스)를 하위 클래스와 공유하는 것을 의미한다.

  • 하위 클래스는 상위 클래스가 가진 모든 멤버를 상속받음.

  • 하위 클래스의 멤버 개수는 언제나 상위 클래스와 비교했을 때 같거나 많다.

  • 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있다.

  • 중요한 장점은 다형성의 표현이 가능하다는 것이다.
    (객체지향 설계의 중요한 핵심)

  • 단일 상속(single inheritance)만을 허용

클래스를 상속할 때는 extends 키워드를 사용하며, 클래스명 다음에 extends 상위 클래스명을 사용하여 정의

 

포함관계 : 포함은 상속처럼 클래스를 재사용할 수 있는 방법으로 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것을 의미합니다

public class Employee {
    int id;
    String name;
    Address address;  //여기서 Address클래스와 Employee클래스에 관계가 포함관계이다.
    ...
    ...
    ...
    
    }

상속 vs 포함
클래스 간의 관계가 ‘~은 ~이다(IS-A)’ 관계인지 ~은 ~을 가지고 있다(HAS-A) 관계인지 생각해보자.

 

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

  • 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것

상위 클래스의 메서드를 오버라이딩하기 위한 조건

  1. 메서드의 선언부(메서드 이름, 매개 변수, 반환 타입)가 상위클래스와 완전히 일치해야 한다.

  2. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.

  3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.

 

super

  • super 키워드는 상위 클래스의 객체 호출
class SuperClass {
    int count = 25; // super.count
}

class SubClass extends SuperClass {
    int count = 15; // this.count

    void callNum() {
        System.out.println("count = " + count);
        System.out.println("this.count = " + this.count);
        System.out.println("super.count = " + super.count);
    }
}

결과
count = 15
count = 15
count = 25

 

super()

  • super()는 상위 클래스의 생성자를 호출하는 것을 의미한다.
class Human {

    Human() {
        System.out.println("사람 클래스 생성자");
    }
}

class Teacher extends Human { // Human 클래스로부터 상속

    Teacher() {    
        super(); // Human 클래스의 생성자 호출
        System.out.println("선생 클래스 생성자");
    }
}
  • super() 메서드 또한 this()와 마찬가지로 생성자 안에서만 사용 가능하고, 반드시 첫 줄에 와야한다.

  • 모든 생성자의 첫 줄에는 반드시 this() 또는 super()가 선언되어야 한다.
    (super()가 없는 경우에는 컴파일러가 생성자의 첫 줄에 자동으로 super()를 삽입한다.

  • 부모클래스에 기본 생성자가 아닌 매개변수를 가지는 생성자가 있다면 즉, 부모클래스에서 생성자가 오버로딩되면 자동으로 추가되지 않는다.
    (오버로딩 생성자에 맞춰 super()를 작성해야함)

 

Object 클래스

  • 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스

  • 자바 컴파일러는 컴파일 과정에서 다른 클래스로부터 아무런 상속을 받지 않는 클래스에 자동으로 extends Object를 추가하여 Object 클래스를 상속받도록 한다.

  • Object 클래스는 자바 클래스의 상속계층도에 가장 위에 위치하기 때문에 Object 클래스의 멤버들을 자동으로 상속받아 사용할 수 있다.

메서드명반환타입주요내용
toString()String객체 정보를 문자열로 출력
equals(Object obj)boolean등가 비교 연산(==)과 동일하게 스택 메모리값을 비교
hashCode()int객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단
wait()void현재 스레드 일시정지
notify()void일시정지 중인 스레드 재동작
profile
백엔드개발자를 향해서

0개의 댓글