본문 바로가기
공부/java

자바(java)의 클래스 상속

by 샤샤샤샤 2023. 1. 23.

클래스의 상속

10개의 클래스를 만든다고 가정하자.

그 모든 클래스에 똑같은 변수와 함수가 3개씩 있다고 할때, 우리는 총 30번을 중복되는 똑같은 코드를 작성하게 된다.

이처럼 기존에 있는 클래스에서 변수와 함수를 사용하고자 할때, 또는 중복되는 변수와 함수를 하나로 통일하고자 할때, 상속을 이용할수 있다.

 

클래스의 상속: 클래스 내부의 매소드와 속성(변수)들을 자신의 것처럼 사용가능하게 하는 것

상속의 이점: 코드 중복을 피한다.

                     계층적인 코드 작성이 가능하다.

상속의 형식

class (자식 클래스) extend (부모클래스)

 

//클래스의 상속
//상속 : 부모의 자산을 자녀가 물려받는 것
//클래스의 상속 : 부모클래스의 자산(함수/변수)를 자녀클래스가 물려받는다.
//물려받는다 : 접근권한을 갖는다, 코드를 자신의 것으로 사용한다.
//상속을 사용하는 이유 : 1. 코드 중복을 피할 수 있다.
//                  : 2. 계층적인 구조의 코드 작성을 할 수 있다.
//예) 강아지   : 동물 속성/행동 + 강아지고유의 속성/행동
//    고양이   : 동물 속성/행동 + 고양이고유의 속성/행동
//              공통된 속성/행동-코드를 한개만 설계해서 각각 상속받으면 된다.
class Animal { //동물 : 고유한 특징
    //속성
    int age = 10;
    //행동
    void eat(){
        System.out.println("먹는다.");
    }
}
//extends 예약어 : 클래스 상속시 사용
class Dog extends Animal { // 동물특징 + 강아지 고유의 특징
    //강아지 고유의 특징
    void bark(){
        System.out.println("짖는다.");
    }
}
class Cat extends Animal { // 동물특징 + 고양이 고유의 특징
    //고양이 고유의 특징
    void grooming(){
        System.out.println("손질한다.");
    }
}
public class ex78 {
    public static void main(String[] args) {
        Dog objDog = new Dog();
        System.out.println( objDog.age );
        objDog.eat();
        objDog.bark();

        Cat objCat = new Cat();
        System.out.println( objCat.age );
        objCat.eat();
        objCat.grooming();
    }
}

 

오버라이드(Override) : 자식 클래스에서 부모 클래스의 메소드를 재정의 하는것.

                                     즉, 덮어씌우기라고 이해하면 편하다.

//면접시 자주나오는 질문
//메소드 오버로딩 vs 오버라이드의 차이점은?
//오버로딩(Overloading)
//          : 매개변수를 다르게 함으로 메소드의 기능을 확장.
//          : 같은 이름의 함수를 계속 사용할 수 있다.
//오버라이드(Override) : 부모클래스의 메소드를 자식클래스에서 재정의한다.
class Machine{
    String name = "일반기계";
    public void work(){
        System.out.println("기계가 일한다.");
    }
}
class CoffeeMachine extends Machine{
    String name = "커피기계";
    //@Override : 오버라이드 메소드임을 컴파일러에게 알려주는 지시어(어노테이션)
    //어노테이션(Annotation) : 컴파일러 지시어, 실행시에는 사라짐.
    @Override
    public void work(){
        System.out.println("커피기계가 일한다.");
    }
}
public class ex80 {
    public static void main(String[] args) {
        CoffeeMachine cm = new CoffeeMachine();
        System.out.println( cm.name );
        cm.work();
    }
}

 

final  예약어: 더이상 상속이 불가능한 마지막 클래스로 지정할 때 사용

                      메소드의 마찬가지로 오버라이딩을 금지시키는 역할도 한다.

//final 예약어 : 1. 상수를 정의할 때 사용
//              2. 더이상 상속불가한 마지막 클래스로 지정
class Bean {
}
//더이상 상속불가한 클래스로 지정
final class CoffeeBean extends Bean {
}
//final클래스는 상속 할 수 없음.
//class JavaCoffeeBean extends CoffeeBean {
//}

public class ex85 {
    public static void main(String[] args) {
        final Double PI = 3.141592D;

    }
}