[JAVA]상속

김주현·2021년 4월 1일
0

Java

목록 보기
11/15

상속

상속이란 물려준다라는 의미입니다. 어떤 객체가 있을 때 그 객체의 변수와 메소드를 다른 객체가 물려 받을 수 있는 기능을 상속이라고 합니다.

표현방식 : 부모클래스와 자식클래스 | 상위클래스와 하위클래스 | 기초클래스와 유도클래스

기존객체가 가진 메소드외에 새로운 메소드를 추가하고 싶다면, Calculator클래스에 substract메소드를 추가하면 되는데 경우에 따라서 새 메소드를 추가하기가 어려울 때가 있습니다.

  • Calculator클래스를 자신이 만든게 아닌 경우일때, 누군가의 코드를 내가 수정한 코드에 덮어쓸 때 내가 추가한 substract()메소드는 사라지게 됩니다.
  • Calculator클래스가 다양한 곳에서 사용되고 있는데 substract() 메소드의 기능이 필요하단 이유로 추가하게 되면 Calculator클래스를 사용중인 모든 곳에서 영향을 받게 됩니다.
class Calculator2{
	int left,right;

	public void setOperands(int left, int right) {
		this.left=left;
		this.right=right;	
	}
	public void sum() {
		System.out.println(left+right);
	
	}
	public void avg() {
		System.out.println((left+right)/2);
	
	}
	//substract메소드 생성하면 되지만 나중에 코드가 복잡해질때 
	//이런식으로 추가하게 되면 코드가 꼬여버릴 수 있게된다.
	public void substract() {
		System.out.println(left-right);
		
	}
	
}


public class practice {

	public static void main(String[] args) {
		
		Calculator2 c1=new Calculator2();
		c1.setOperands(10,20);
		c1.sum();
		c1.avg();
		//
		c1.substract();
	}

}

아래와 같이 abstract의 클래스를 만들어서 상위클래스인 Calculator의 기능을 하위클래스에서 확장시키면 자신이 정의하지 않은 다른 메소드들을 마치 자신이 가지고 있는 것처럼 호출 할 수 있게 됩니다.

class Calculator{
	int left,right;

	public void setOperands(int left, int right) {
		this.left=left;
		this.right=right;	
	}
	public void sum() {
		System.out.println(left+right);
	
	}
	public void avg() {
		System.out.println((left+right)/2);
	
	}
	//하위클래스SubstractionableCalculator는 상위클래스Calculator의 기능을 상속,확장하였기 때문에
	//substract메소드를 추가할 수 있게 되었던 것이다
	
}

class SubstractionableCalculator extends Calculator{
	public void substract() {
		//Calculator클래스에 정의되어있는 left,right값을 가져온다.
		System.out.println(this.left -this.right);
	}
}

public class CalculatorDemo4 {

	public static void main(String[] args) {
		
		SubstractionableCalculator c1=new SubstractionableCalculator();
		c1.setOperands(10,20);
		c1.sum();
		c1.avg();
		//뺄셈기능을 추가해서 출력하고 싶다면 substract에 관한 클래스를 만들어서 Calculator에 상속받도록 해야한다. 
		c1.substract();
	}

}

결과:
30
15
-10

다양한 상속

곱셈을 계산하는 클래스


class MultiplicationableCalculator extends Calculator{
	public void Multiplication() {
		//Calculator클래스에 정의되어있는 left,right값을 가져온다.
		System.out.println(this.left *this.right);
	}
}

public class CalculatorDemo5 {

	public static void main(String[] args) {
		
		MultiplicationableCalculator c1=new MultiplicationableCalculator();
		c1.setOperands(10,20);
		c1.sum();
		c1.avg();
		//곱셈기능을 추가해서 출력하고 싶다면 상위클래스를 상속하여 하위클래스 만든다.
		c1.Multiplication();
	}

}

나눗셈을 계산하는 클래스

MultiplicationableCalculator클래스를 상속하는 또다른 하위클래스를 만들 수 있습니다.

//DivisionableCalculator하위클래스가 MultiplicationableCalculator상위클래스의 기능을 상속받는다.
class DivisionableCalculator extends MultiplicationableCalculator{
	public void Division() {
		System.out.println(this.left / this.right);
	}
}

public class CalculatorDemo6 {

	public static void main(String[] args) {
		
		DivisionableCalculator c1=new DivisionableCalculator();
		c1.setOperands(10,20);
		c1.sum();
		c1.avg();
		//곱셈기능을 추가해서 출력하고 싶다면 상위클래스를 상속하여 하위클래스 만든다.
		c1.Division();
	}

}

상속의 장점

  • 부모가 만든 기능을 자식이 또 만들 필요가 없는 것과 같이 코드의 중복을 제거할 수 있습니다.
  • 부모가 만든 코드를 자식이 사용할 수 있다는 점에서 재활용성이 높습니다.
  • 부모가 만든 코드에서 어떤 개선이 일어나면 해당 부모클래스를 상속하는 모든 클래스에서 개선의 효과가 적용되기 때문에 유지보수가 편리합니다.

1개의 댓글

comment-user-thumbnail
2021년 5월 24일

1) 요는, 다 같이 쓰는 기존 클래스 내 함수는 건들지 않고, 새로운 기능을 추가하는 방법으로 상속을 쓴다는거네요. 마치 라이브러리/헤더파일 같네요.

2) 클래스A extends 클래스B 에서, this를 사용하면 클래스B의 전역변수를 가져오는 점이 흥미롭네요. 클래스A와 클래스B의 전역변수 이름이 동일한 경우, 어떻게 되는지 궁금해요.

3) 클래스A extends 클래스B, 클래스C extends 클래스A 이런 경우에,
클래스A를 사용한다면, 클래스A,B,C의 함수 모두 사용 가능할까요?

답글 달기