⚙️ Backend/JAVA

JAVA(자바) - 상속(Inheritance)

코너(Corner) 2020. 11. 9.
반응형

상속 (inheritance)

 

iu-corner.tistory.com/entry/JAVA%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EA%B0%9D%EC%B2%B4

앞 글에서 평균을 구하는 클래스로부터 student 객체를 생성하는 과정을 살펴보았다.평균을 구하는 클래스로부터 생성된 객체들은 같은 속성과 기능(메소드)을 가지고 있다.
student 객체와는 비슷하지만 속성과 메소드가 약간 다른 객체를 생성하려면 어떻게 하여야 하는가?
당연히 새로운 클래스가 작성되어야 한다. 그러나 새로 작성되는 클래스는 기존의 평균을 구하는 클래스를 이용하여 작성될 수 있다. 즉 기존 클래스로부터 모든 속성과 메소드를 상속받고, 더 필요한 속성과 메소드를 추가하여 새로운 클래스를 생성할 수 있다. 이러한 개념이 상속이다.

 


실습예제 : 평균을 구하는 클래스에 총점을 구하는 방법이 추가된 클래스를 상속을 이용하여 작성


더보기

 

package 객체지향개념;

import java.util.Scanner;

class Avg {
	String name; // 속성
	int avg; // 
	public String average(int kor, int eng) { // 기능
		avg = (kor+eng)/2; // 평균의 값
		return name+" 학생의 평균 점수는 "+avg+"점 입니다."; // 이름과 평균으로 돌려보내기
	} // 기능 end
}

class Sum extends Avg{ // Sum은 Avg를 상속 받는다
	public int total(int kor, int eng) {
		int sum = (kor+eng);
		return sum; 
	}
}

public class Main {

	public static void main(String[] args) {
		// 사용
		Scanner sc = new Scanner(System.in);
		
		Sum student1 = new Sum(); // 자식 클래스는 부모 클래스의 메소드(기능)을 이용할 수 있다.
		Sum student2 = new Sum(); // student1,2라는 객체를 생성한 것.
		
		student1.name ="김철수"; // student1,2 객체의 이름 지정 
		student2.name ="김영희"; // 생성된 객체의 속성에 서로 다른 값을 저장한 것이다.
		
		String st1_avg = student1.average(70,80);
		String st2_avg = student2.average(80,90);

		int st1_total = student1.total(70,80);
		System.out.println(student1.name+"학생의 총 합 점수 :"+st1_total);
		System.out.println(student1.name+"학생의 평균 점수 :"+st1_avg);

		int st2_total = student2.total(80,90);
		System.out.println(student1.name+"학생의 총 합 점수 :"+st2_total);
		System.out.println(student2.name+"학생의 평균 점수 :"+st2_avg);
		
	}

}

 

프로그램 설명 : Avg 클래스 정의 - Sum은 Avg 클래스를 상속 받아 Summation 클래스 정의

Summation 클래스에 total 메소드를 추가

Avg크래스를 상속 받은 Summation 클래스로 부터 객체 생성

Avg으로부터 상속받은 name 속성의 값을 설정한다.

Summation total 클래스에서 새로 정의한 total 메소드를 호출한다.


위에 예에서 보듯이 클래스의 상속은 확장(extend)의 개념을 가진다. 즉 상위 클래스의 모든 것을 상속받고 추가로 더 가지는 클래스를 구성하는 것이 상속이다.

ㅐ부분의 실세계에 있는 요소들은 많은 공통점을 가지고 있다. 다양한 공통점들은 많은 클래스들을 생성할 수 있게 하고 각각의 클래스들은 연관 관계에 따라 계층 구조를 이룰 수 있다.

다음 그림은 클래스 계층 구조의 예를 그림으로 나타낸 것이다. 상위 계층으로 갈수록 공통점은 일반화되고 간단해진다. 하위 계층으로 갈수록 특수화되고 개별화된다.

클래스 계층 구조에서의 상속의 예는 다음과 같다.

생물 = 호흡하는 기능
동물 = 호흡하는 기능 + 걸어다님
포유류 = 호흡    기능 + 걸어다님 + 양육성
사람 = 호흡하는 기능 + 걸어다님 + 양육성 + 감정표현

이런 식으로 중복 기능을 가지는 것을 줄이기 위해 상속을 사용하고, 속성과 기능을 쓰는 것이다.

클래스들 사이의 상속은 소프트웨어 설계를 간단하게 할 수 있는 이점을 제공한다. 즉 기존의 클래스로부터 모든 요소를 상속받고 새로운 클래스에는 추가되는 자료구조와 메소드만 지정하면 된다. 상속의 개념은 코드를 간결하게 하고, 코드의 재사용성(reusing)을 높이는 요인이 된다.

클래스의 상속은 하나의 클래스로부터 상속되는 것이 일반적이지만, 다수 개의 클래스로부터 상속받아 새로운 클래스를 생성하는 경우도 있다. 이를 다중상속(multiple inheritance)이라 한다. 자바 언어는 상속관계에서 하나의 상위 클래스만 허용하며, 다중상속은 허용하지 않는다.

 

반응형

댓글