상속(inheritance)

천소진·2022년 9월 2일
0

Study

목록 보기
6/29
post-thumbnail

클래스의 상속

  • 객체 지향 프로그래밍의 큰 특징 중 하나로 기존 클래스에 기능을 추가하거나 재정의하여 새로운 클래스로 정의 하는 것.
  • 상속을 받은 클래스는 상속을 한 클래스의 모든 필드와 메소드를 물려받으며 이러한 관계를
    부모-자식 or 상위-하위 or 기초-파생 관계라고 함.
  • 하위클래스는 하나의 상위 클래스만을 상속 받을 수 있음 = 단일상속
  • 상위클래스는 여러개의 하위 클래스에 상속을 해줄 수 있음

상속 방법

기본 구조

class 하위클래스 이름 extends 상위클래스 이름 {}    //상위 클래스 ⊂ 하위 클래스 의 형태가 됨.
  • 상위클래스에 새로운 필드가 추가되면 자식 클래스에도 자동으로 추가가 됨.
  • 하위 클래스에는 다른 필드와 메소드를 추가 할수 있지만 상위 클래스에는 변화가 없음.
  • 상속 될때는 필드와 메소드만 상속이 되며, 생성자와 초기화 블록은 생성되지 않아 새로 정의해줘야 함.
  • 상위 클래스에서 private 이나 default로 설정한 멤버는 하위클래스에서 상속을 받을 수는 있지만 접근은 할 수 없음.

ex)

class Parent{

  private int a = 0;                      //private 멤버 정의
  int b= 5;

}

class Child extends Parents{
int c= 10;                               //하위클래스 자신만의 멤버 추가

public void play(){

system.out.println(a);                   // private 영역은 실행이 되지 않음.
system.out.println(b);                   // 상위 클래스 에서 상속 받은 멤버
system.out.println(c);

    }
}

public class Inheritance_1{
public static void main(String[] args){

Child ch = new Child();
ch.play();

    }
}

실행 결과

5
10

★ Object class
: 모든 클래스의 상위 클래스
==> 별도로 extends 를 사용하지 않아도 자동으로 Object class의 모든 필드와 메소드를 상속받음

super()

  • 하위 클래스에서 상위 클래스의 멤버를 초기화 하기 위해 생성자를 호출할 때 사용하는 메소드
    ==> 하위 클래스에서 상위 클래스의 멤버는 상속받지만 생성자를 상속받지는 않기 때문.
  • 상위 클래스에 파라미터를 가지는 생성자가 하나도 없다면 하위클래스에 자동으로 기본 생성 됨.
  • 상위 클래스에 여러 생성자가 있을때에도 하위 클래스에서 초기화 할수 있게 default생성자를 항상 명시해 주는것이 좋음.

ex)

calss Parents {

  int a;

Parents(){ a=1; }                        // 파라미터값을 받지 않는 default생성자 

Parents(int x) {                         // 파라미터값을 받는 일반 생성자

  a= x;

    }
}

calss Child extends Parents{
int b;                                  // 하위 클래스 고유의 멤버

Child(){                                // 하위 클래스의 생성자

super();                                //상위 클래스의 default생성자를 불러옴 
//super(20);                            //초기화 값을 정해서 불러온다면 a는 20으로 출력됨.
b= 10;

    }
}

public void play(){

system.out.println(a);                  
system.out.println(b);                   

    }
}


public class Inheritance_1{
public static void main(String[] args){

Child ch = new Child();
ch.play();

    }
}

실행 결과

1
10

super키워드 사용

: super() 메소드가 상위 클래스의 생성자를 불러온다면 super 키워드는 상위 클래스의 멤버에 직접 접근하는 방법.
: 하위 클래스의 멤버와 상위클래스의 멤버의 이름이 같을 경우 구분하기 위해 인스턴스메소드 에서만 사용가능.

ex)

class Parent { 

  int a = 10;                             //상위 클래스 멤버 a
  
}
 
class Child extends Parent {

  int a = 20;                            //하위 클래스 멤버 a

public void display() {

        System.out.println(a);           //하위 클래스 멤버 a 호출
        System.out.println(this.a);      //같은 클래스 내의 멤버 a 호출
        System.out.println(super.a);     //상속받은 상위 클래스의 멤버 a 호출

    }
}

public class Inheritance_2 {
public static void main(String[] args) {

Child ch = new Child();
ch.display();
   
    }
}

실행 결과

20
20
10

오버라이딩 (Overriding)

: 상속관계에 있는 상위 클래스에서 이미 정의되었던 메소드를 하위 클래스에서 필요에 의해 다시 재정의 하는것.

★ 오버로딩과의 차이점
: 오버로딩은 새로운 메소드를 생성 하는것.
: 오버라이딩은 상속받은 기존의 메소드를 변형하여 재정의 하는것.

오버라이딩의 조건

  1. 메소드의 동작만을 재정의 하는것으로 선언할때는 기존 메소드와 똑같이 작성해야함.
  2. 상위 클래스의 메소드보다 접근 제어자의 범위를 좁힐 수 없음.
  3. 상위 클래스의 메소드 보다 더큰 범위의 예외를 적용할 수 없음.

ex)

class Parent {

void display() { 

System.out.println("상위 클래스의 display() 메소드입니다."); 

   } 
}

class Child extends Parent {

void display() {                          //메소드 오버라이딩

System.out.println("하위 클래스의 display() 메소드입니다.");     

}                                                       

void display(String n) {                 // 메소드 오버로딩

System.out.println(n);                                         

   }                           
}

public class Inheritance05 {
public static void main(String[] args) {

  Parent pa = new Parent();
  pa.display();

  Child ch = new Child();
  ch.display();
  ch.display("오버로딩된 display() 메소드입니다.");
   }
}

실행결과

상위 클래스의 display()메소드 입니다.
하위 클래스의 display()메소드 입니다.
오버로딩된 display() 메소드 입니다.

0개의 댓글