[Java] 자바 클래스 상속이란?

이재표·2023년 9월 29일
0

Java

목록 보기
2/2

상속이란?

상속이란 자식클래스(Sub Class)가 부모클래스(Super Class)의 기능을 그대로 물려받아 사용할수 있는 것을 의미한다.

자바의 상속 방법?

extends키워드를 이용하여 상속을 진행할수 있다.

//부모 클래스 생성
class Parent{
	
}

//부모 클래스 상속
class Child extends Parent{

}

이때 부모 클래스는 자식클래스에게 메서드, 필드를 사용할수 있게 허용해줍니다.

자식 클래스에서 메서드를 상속받아 기능을 확장하여 사용할수 있는데, 이것을 오버라이딩이라 하는데 조금 밑에서 알아보도록 하겠습니다.

어떻게 사용할까?

코드를 살펴보면 Animal이라는 부모클래스를 Dog라는 자식클래스가 상속받아 부모클래스의 필드, 메서드를 그대로 사용하는것을 볼수 있다.

class Animal {
    String name;
    String type;
    void setName(String name) {
        this.name = name;
    }
}
class Dog extends Animal {  // Animal 클래스를 상속한다.
    String sex;
    public Dog(String type,String sex) {
        this.sex = sex;
        super.type = type;
    }
    void printInfo(){
        System.out.println("name : "+super.name);
        System.out.println("type : "+super.type);
        System.out.println("sex : "+sex);
    }
}
public class Zoo {
    public static void main(String[] args) {
        Dog dog = new Dog("Mammalia","man");
        dog.setName("poppy"); // 부모클래스 메서드
        dog.printInfo(); // 자식클래스 메서드
    }
}

상속을 하게되면 부모클래스의 필드와 메서드를 사용할수 있는것을 볼수 있다.

Super키워드

super키워드는 부모클래스에 접근하기 위해 사용하는 키워드입니다.

메서드 오버라이딩? 오버로딩?

상속을 통해 메서드를 이용할수 있다하였다. 그럼 자식 클래스는 꼼짝없이 부모클래스의 메서드를 그대로 사용해야만 하는것인가??? 다행히 메서드 오버라이딩으로 확장하여 사용할수 있다.

class Animal {
    String name;
    String type;

    void setName(String name) {
        this.name = name;
    }
    void loud(){
        System.out.println("i'm animal");
    }
}

class Dog extends Animal {  // Animal 클래스를 상속한다.
    String sex;

    public Dog(String type,String sex) {
        this.sex = sex;
        super.type = type;
    }

    @Override
    void loud() {
        System.out.println("i'm animal and i'm dog");
    }

}

public class Zoo {
    public static void main(String[] args) {
        Dog dog = new Dog("Mammalia","man");
        dog.setName("poppy"); // 부모클래스 메서드
        dog.loud();
    }
}
i'm animal and i'm dog

Animal의 loud메서드를 자식 클래스인 Dog클래스에서 변경할수있다. 즉, Dog클래스의 loud메서드가 우선순위를 갖게되어 부모클래스의 loud메서드를 덮어썻다.

메서드 오버로딩

그렇다면, 같은 이름의 메서드지만 상황에 따라 다른 인자를 통해 다른 행위를 하는 메서드는 구현할수 없을까?

class Animal {
    String name;
    String type;

    void setName(String name) {
        this.name = name;
    }
    void loud(){
        System.out.println("i'm animal");
    }
}

class Dog extends Animal {  // Animal 클래스를 상속한다.
    String sex;

    public Dog(String type,String sex) {
        this.sex = sex;
        super.type = type;
    }

    @Override
    void loud() {
        System.out.println("i'm animal and i'm dog");
    }

    void loud(int year){
        System.out.println("i'm animal and i'm dog and i'm "+year+" years old");
    }

}

public class Zoo {
    public static void main(String[] args) {
        Dog dog = new Dog("Mammalia","man");
        dog.setName("poppy"); // 부모클래스 메서드
        dog.loud(10);
    }
}
i'm animal and i'm dog and i'm 10 years old

다음과 같이 같은 이름과 인자가 다른 메서드를 만들수 있는데 이것을 오버로딩이라 한다.

그렇다면 무적클래스가..?

그렇다면 온갖 모든 것들을 상속받아 패키지내의 모든 행위를 할수 있는 무적의 클래스를 만들수 있지 않을까?
답은 불가능이다. 왜냐하면 자바에서는 다중 상속이 불가능하기 때문이다.

class A {
    public void msg() {
        System.out.println("A message");
    }
}

class B {
    public void msg() {
        System.out.println("B message");
    }
}

class C extends A, B {
    public void static main(String[] args) {
        C test = new C();
        test.msg();
    }
}

만약 코드와 같이 하나의 객체가 다중상속을 하게되면 어떤 부모클래스의 필드와 메서드를 상속받아야하는지?,어느 부모클래스에 접근을 해야하는지? 와 같은 여러 모호함이 발생하기 때문입니다.

또 다른 제약조건이 있나?

부모 클래스에서 자식에게 접근제어자 에 따라 상속되지 않는 것이 존재합니다.
상속을 하더라도 부모클래스의 protected,public 접근제어자를 가지고 있는 필드나 메서드만 상속이 가능합니다.

그렇가면 상속을 왜 사용해야할까?

  1. 코드의 중복성 제거

    만약 상속을 사용하지 않는다면 같은 성격의 공통부분(부모클래스)을 모든 자식클래스에 작성해야하므로 객체의 필드와 메서드가 불필요하게 복잡해지기에, 상속을 통해 간결하게 만들수 있다.

  2. 다형성

    1개 객체를 여러 모양으로 표현하는것을 다형성이라 하는데, 상속을 통해 이것이 가능해진다. 동물이라는 객체를 강아지, 고양이와 같이 여러 모양으로 표현할수 가능해진다.

한가지 객체를 다양하게 표현함으로써 확장성이 좋아졌고, 클래스간의 분류가 가능해져 유지보수성 또한 좋아질수 있다!!

0개의 댓글