[JAVA] 객체지향 프로그래밍 - 상속과 포함

2023. 11. 28. 18:17프로그래밍 언어/Java

1. 상속의 정의와 방법

상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속은 서로 연관된 클래스들을 공통적으로 관리할 수 있고, 코드의 재사용성을 높이며 중복을 제거하여 프로그램의 유지보수에 크게 도움이 된다.

 

상속을 구현하는 방법은 개로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 extends와 함께 써 주기만 하면 된다.

calss Child extends Parent{

}

위의 경우에는 Child가 Parent를 상속받으며 Child를 자식 클래스, Parent를 부모 클래스라 한다.

 

자식 클래스는 부모 클래스의 모든 멤버를 상속받는다. 만일 Parent클래스에 age라는 멤버 변수를 추가하면 Child에도 자동으로 추가된다. 단, 생성자와 초기화 블록은 상속되지 않고 멤버만 상속된다. 또, 자바에서는 여러 부모를 허락하지 않는다. 즉 단일 상속만 가능하다는 것을 주의하자. 추가로 Obejct클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다. Obejct클래스에는 toString(), equals()와 같은 메서드들이 존재하며 모든 클래스는 자동으로 Obejct클래스를 상속하므로 두 메서드 같은 기본적인 메서드를 사용할 수 있다.


2. 클래스간의 관계 - 포함 관계, 상속 관계

상속 이외에도 클래스 간에 관계를 맺어주고 클래스를 재사용하는 방법이 있는데, 포함 관계를 맺어주는 것이다. 예를 들어 원을 표현하기 위한 Circle 클래스와 좌표의 한 점을 다루기 위한 Point 클래스가 있다고 가정하자.

class Circle{
    int x;
    int y;
    int r;
}

class Point{
    int x;
    int y;
}

이 예시에서는 Circle클래스의 원점을 위한 x, y 보다는 Point클래스를 재사용하는 편이 훨씬 좋다.

class Circle{
	Point c = new Point();
	int r;
}

이런 관계를 Circle이 Point를 포함하고 있다고 한다.

 

클래스를 작성할 때 상속관계를 맺어줄지 포함관계를 맺어줄지 헷갈리는 경우가 많다. 그럴 때는 is-a, has-a를 통해 클래스 간의 관계를 구성할 수 있다.

SportsCar is a Car -> 상속

Circle has a Point -> 포함

예를 들어 형태를 정의하는 Shape 클래스와 Circle, Point 클래스가 있다고 생각하면 그들의 관계는 아래와 같다.

class Shape{
    String color;
    void draw(){
    	System.out.println(color);
    }
}

class Point{
	int x;
	int y;
}

class Circle extends Shape{
	Point center;
	int r;
	void draw(){
		System.out.println(center + ' ' + r);
	}
}

이제 왜 이런 관계가 형성되는지 알 수 있을 것이다. 그런데 예제를 잘 보면 Circle과 Shape 모두 draw() 메서드가 정의되어 있다. 이 경우에는 Circle클래스의 draw() 함수가 호출된다. 이처럼 조상 클래스에 정의된 메서드와 같은 메서드를 자손 클래스에 정의하는 것을 오버라이딩이라고 한다.