728x90
반응형

Java 상속 (inheritance)

자바에는 상속이라는 개념이 있다.
조금 더 자세하게 말해보면, 부모의 것을 자식에게 물려주는 것처럼
자바에는 부모 클래스(상위 클래스)자식 클래스(하위 클래스) 가 있다.
자식 클래스는 부모 클래스를 선택해서 그 부모 클래스의 멤버를 상속받아 그대로 쓸 수 있게 된다.

 

그럼 상속을 왜 하는 거지?
이미 만들어져 있는 클래스를 재사용할 수 있기 때문에 효율적이고 중복된 코드가 줄어들어 코드가 간결해진다.
그리고 공통적인 기능을 부모 클래스에 추가해주면 상속받은 여러 개의 자식 클래스에서 사용이 가능하기 때문에 확장성 또한 용이하다.
다시 말해, 유지보수가 쉬워지고 확장성이 용이해지고 재사용이 가능해지고 코드가 간결해지며 시간을 단축할 수 있다.

 

상속에 대해 몇 가지 알아야할 부분이 있다.
첫째, 부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없다.
둘째, 부모와 자식 클래스가 서로 다른 패키지에 있다면 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려 받을 수 없다.
이 외의 경우 모두 상속의 대상이 된다.

* 자바의 접근 제어자
public : 접근 제한 없음
protected: 동일한 패키지 내에 존재하거나 파생 클래스에서만 접근 가능
default : 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근 가능
private: 자기 자신의 클래스 내에서만 접근 가능

 

 

클래스 상속

상속받고자 하는 자식 클래스 이름 앞에 extends 키워드를 붙이고 상속할 부모 클래스 이름을 적는다.
자바는 다중 상속을 허용하지 않는다. ( 다중 상속 X )
하지만 여러 자식 클래스에세 상속이 가능하다.
extends
키워드 뒤에는 하나의 부모 클래스만 와야 한다.

// 부모 클래스
public class Parent { ... };
// 부모 클래스를 상속받은 자식 클래스
public class Child extends Parent { ... };

 

상속에 대해 간단하게 예제를 만들어봤다.

[부모 클래스]

package com.company;

public class ParentCafe {
    String coffee;
    int price;

    public void printMenu() {
        System.out.println(coffee + "는 " + price + "원입니다.");
    }
}

 

[자식 클래스]

package com.company;

public class ChildCafe extends ParentCafe {
    // 생성자
    // ChildCafe 가 ParentCafe 의 필드를 상속받아 사용할 수 있다.
    ChildCafe (String coffee, int price) {
        this.coffee = coffee;
        this.price = price;
    }
}

 

[메인 클래스]

package com.company;

public class Main {

    public static void main(String[] args) {
	// write your code here
        ChildCafe child = new ChildCafe("아메리카노", 4100);

        child.printMenu();
    }
}

 

[출력 결과]

아메리카노는 4100원입니다.

부모 클래스와 부모 클래스를 상속받은 자식 클래스를 만들었다.
자식 클래스를 보면 따로 필드를 생성하지 않았지만 상속받은 부모 클래스의 필드를 가져와서 사용할 수 있었다.
그리고 메인 소스를 보면 자식 클래스인 ChildCafe 에서 ParentCafe 의 printMenu() 메소드를 사용한 것을 볼 수 있다.
만약 ParentCafe 에서 printMenu() 메소드가 private 접근 제어자를 사용했다면 다음과 같은 오류가 나오는 것을 확인할 수 있었다.

접근이 가능해야 상속받은 필드 및 메소드를 사용할 수 있기 때문에 당연한 오류다.

 

 

인터페이스 상속

인터페이스는 implements 키워드를 통해 상속받을 수 있다.
클래스 상속과는 다르게 인터페이스 상속은 다중 상속이 가능하다.
따라서, 클래스와 다르게 implements 뒤에 여러 개의 인터페이스가 올 수 있다.

public class Parent implements Interface1, Interface2, ... { ... }

 

그리고 인터페이스를 상속받은 자식 클래스는 상속받은 인터페이스의 메소드를 반드시 오버라이딩(재정의) 해야 한다.
메소드를 재정의해야 한다는 부분에서 상속이라는 의미와는 다르게 생각될 지 모르겠지만
자바에서의 인터페이스 상속은 계약 및 분류의 의미가 강하다고 한다.

 

그럼 인터페이스 상속에 대해 간단한 예제를 만들어봤다.

[인터페이스 1]

package com.interfaceExample;

public interface CoffeeInterface {
    public void printCoffee();
}

 

[인터페이스 2]

package com.interfaceExample;

public interface CakeInterface {
    public void printCake();
}

 

[인터페이스를 상속받은 클래스]

package com.interfaceExample;

public class CafeClass implements CoffeeInterface, CakeInterface {

    String coffee;
    String cake;
    int coffeePrice;
    int cakePrice;

    public CafeClass(String coffee, int coffeePrice, String cake, int cakePrice) {
        this.coffee = coffee;
        this.coffeePrice = coffeePrice;
        this.cake = cake;
        this.cakePrice = cakePrice;
    }

    @Override
    public void printCake() {
        System.out.println(cake + "는(은) " + cakePrice + "원입니다.");
    }

    @Override
    public void printCoffee() {
        System.out.println(coffee + "는(은) " + coffeePrice + "원입니다.");
    }
}

 

[메인 클래스]

package com.interfaceExample;

public class Main {

    public static void main(String[] args) {
	// write your code here
        CafeClass cafe = new CafeClass("아메리카노", 4100, "레드벨벳 케이크",5500);

        cafe.printCoffee();
        cafe.printCake();
    }
}

 

[출력 결과]

아메리카노는(은) 4100원입니다.
레드벨벳 케이크는(은) 5500원입니다.

 

두 개의 인터페이스를 만들었고 두 개의 인터페이스를 상속받는 클래스를 생성한 후 메인 클래스에서 출력해보았다.
인터페이스에서는 메소드만 만들고 안의 내용은 따로 적지 않고
인터페이스를 상속받은 클래스에서 메소드 안의 내용을 오버라이딩을 통해 적어주었다.
간단한 예제를 통해 인터페이스를 만들고 상속받아 사용해보았다.
추가로 예제에서는 다루지 않았지만 인터페이스간 상속이 가능하다는 것도 알아야 한다.

 

 

마지막으로 정리해보는 시간!

자바에는 부모 클래스(상위 클래스)와 자식 클래스(하위 클래스) 가 있고
자식 클래스는 부모 클래스를 상속받아 부모 클래스의 필드 및 메소드를 사용할 수 있다.
이렇게 상속을 사용하면 좋은 점 !

  • 유지보수가 쉬워짐
  • 확장성이 용이해짐
  • 재사용이 가능해짐
  • 코드가 간결해짐
  • 개발 시간을 단축할 수 있음
  • 이러한 이유에서 상속을 사용한다.

그리고 상속에서 클래스 상속과 인터페이스 상속이 있다.

  • 클래스 상속은 extends 키워드
  • 인터페이스 상속은 implements 키워드
  • 클래스 상속은 다중 상속이 안 됨
  • 인터페이스 상속은 다중 상속이 가능
  • 인터페이스 상속은 설계 목적으로 구현이 가능
  • 인터페이스를 상속받은 클래스는 인터페이스의 메소드를 오버라이딩을 통해 재정의

 

클래스 상속은 클래스를 확장하는 것이고 인터페이스 상속은 인터페이스를 구현하는 것이다.

 

 

뭔가 정리한다고 정리해봤는데 더 정신없는 느낌이다 😅😅😅
자바 상속에 대해 기본적인 부분을 정리해봤는데 예전에 공부했던 내용임에도 다시보니 헷갈리는 부분이 많았다.
그래도 어느 정도 개념은 잡았으니 조금 더 사용해보면 이해가 더 잘 될 것 같다.

 

 

 

- 참고 사이트 -

https://chanhuiseok.github.io/posts/java-1/

 

자바(JAVA) - 상속(Inheritance) (1) 클래스 상속, 부모 생성자의 호출

상속이란?

chanhuiseok.github.io

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=heartflow89&logNo=220960019390 

 

[JAVA/자바] 상속의 개념 및 부모/자식 클래스

이번 포스팅은 상속에 대해서 알아보려고 한다. 상속을 사용하는 이유는 결국 더 좋은(빠르고, 유지 보수가...

blog.naver.com

https://velog.io/@hkoo9329/자바-extends-implements-차이

 

자바 extends, implements 차이

상속이란 (Inheritance) 상속을 말하기 전에 먼저 OOP가 무엇인지 알면 좋을거 같다.OOP(Object-Oriented Programming, 객체 지향 프로그래밍) 이란? OOP의 특징으로 1. 상속과 인터페이스 (계층성) 2. 다형성, 사

velog.io

 

728x90
반응형
복사했습니다!