Engineering Note

[Java] Inheritance 본문

Programming Language/Java

[Java] Inheritance

Software Engineer Kim 2022. 9. 9. 00:23

Inheritance

Inheritance

  • 상속 : 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

상속을 사용하는 이유

  • 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.
  • 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.

Java에서 상속을 구현하는 방법

  • 새로 작성하고자 하는 클래스의 이름 뒤에 상속 받고자 하는 클래스의 이름을 키워드 ‘extends’와 함께 서 주기만 하면 된다.
  • 예시
    • 새로 작성하려는 클래스의 이름이 Child이고 상속 받고자 하는 기존 클래스의 이름이 Parent라면 아래와 같이 작성하면 된다.조상 클래스와 자손 클래스
    • class Parent { int age; } class Child extends Prarent{ void play(){ System.out.println("놀자~"); } }
  • 조상 클래스 : 상속해주는 클래스
    • 부모 클래스, 상위(super) 클래스
  • 자손 클래스 : 상속 받는 클래스
    • 자식 클래스, 하위(sub) 클래스

부모 클래스와 자손 클래스의 포함관계

  • 자손 클래스는 조상클래스의 모든 멤버를 상속 받기 때문에 Child Class는 Parent Class의 멤버들을 포함한다고 할 수 있다.
  • 그리고 클래스는 멤버들의 집합이므로 클래스 Parent와 Child의 관계를 다음과 같이 표현할 수도 있다.

  • 자손 클래스는 부모 클래스의 모든 멤버 변수를 상속 받기 때문에 Child Class는 부모 Class에 있는 멤버 변수를 따로 작성할 필요가 없다.

 

부모 클래스와 자손 클래스의 상속 관계도

 

오버라이딩

  • 조상 클래스로부터 상속 받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.

오버라이딩의 조건

  • 메서드의 이름이 같아야 한다.
  • 매개변수가 같아야 한다.
  • 반환타입이 같아야 한다.

super

  • super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다.

Object Class

  • Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
  • 만약 아무 것도 상속 받지 않는 클래스가 있다면 자바 컴파일러가 컴파일 시점에 자동적으로 ‘extends Object’를 추가한다.
  • Object 클래스에는 toString(), euqals()등과 같은 모든 인스턴스가 가져야할 기본적인 메서드가 구현되어 있다.

 

실습 코드

상속 기본 예제

package inheritance;

public class Parent {
    int age;

    protected void myWork(String name){
        System.out.println(name + "은 축구를 가르친다.");
    }
}
package inheritance;

public class Child extends Parent{
    public void play() {
        System.out.println("놀자!");
    }

    @Override
    protected void myWork(String name) {
        System.out.println(name + "은 축구를 한다.");
    }
}
package inheritance;

public class Main {
    public static void main(String[] args){
        Parent parent = new Parent();
        Child child = new Child();

        parent.age = 50;
//      parent.play();
        parent.myWork("손웅정");
        child.age = 30;
        child.play();
        child.myWork("손흥민");

    }
}
  • 자식 클래스에서 age 변수를 구현하지 않았어도 부모 클래스에 있기 때문에 사용이 가능하다.
  • 자식 클래스에서는 부모클래스의 멤버변수, 메서드를 사용할 수 있지만 부모 클래스는 자식의 메서드 멤버변수를 사용할 수 없기 때문에 부모클래스에서 자식의 play() 메서드에 접근하면 안된다.
  • 자식클래스에서 부모클래스의 myWork()메서드를 오버라이딩했다.

상속을 통한 코드의 유지보수 실습

package inheritance;

public class Point {
    protected int x = 10;
    protected int y = 20;

    protected String getLocation() {
        return "현재 위치 : " + "x:" + x + " y:" + y;
    }
}
package inheritance;

public class Point3D extends Point {
    int z = 30;

    @Override
    public String getLocation() {
//        return "현재 위치 :" + " x:" + super.x + " y:" + super.y + " z:" + this.z;
        return super.getLocation() + " z:" + z;
    }
}
package inheritance;

public class Main {
    public static void main(String[] args){
        Point point = new Point();
        Point3D point3D = new Point3D();

        System.out.println(point.getLocation());
        System.out.println(point3D.getLocation());


    }
}
  • 2차원 점을 표현하는 Point Class에 있는 멤버 변수 x, y가 3차원 점을 표현하는 Point3D Class에서 공통적으로 사용할 수 있기 때문에 상속을 받고 따로 x, y 변수를 구현하지 않았다.
  • 자식클래스에서 오버라이드 한 getLocation메서드에서 super 참조 변수를 통해 부모의 메서드에 접근이 가능하고 이를 통하여 코드를 재사용할 수 있다.
    • 코드를 재사용할 경우 장점 : 코드의 유지보수가 용이하다. 예를 들면 getLocation()에서 위치 값을 출력할 때 사용하는 String 값 “현재 위치”를 “지금 위치”로 바꾸려고 할 때 부모 클래스만 바꾸어 주면 된다.

Object 클래스 toString 오버라이딩

package inheritance;

public class Book {
    String bookName;
    String author;
    double rating;

    Book(String bookName, String author, double rating){
        this.bookName = bookName;
        this.author = author;
        this.rating = rating;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + "\'" +
                ", author='" + author + "\'" +
                ", rating" + rating + "\'" +
                "}";
    }
}
  • Object 클래스는 모든 클래스의 조상 클래스이기 때문에 Object Class에 정의된 toString 클래스를 Book 클래스에서 toString 메서드를 오버라이딩 할 수 있다.

'Programming Language > Java' 카테고리의 다른 글

[Java] Polymorphism  (1) 2022.09.22
[Java] 변수의 종류  (0) 2022.09.15
[Java] Access Modifier, Encapsulation  (0) 2022.09.09
[Java] Object Oriented Programming  (0) 2022.09.09
[Java] Dependency  (0) 2022.09.02
Comments