상속이란 물려준다라는 의미입니다. 어떤 객체가 있을 때 그 객체의 변수와 메소드를 다른 객체가 물려 받을 수 있는 기능을 상속이라고 합니다.
표현방식 : 부모클래스와 자식클래스 | 상위클래스와 하위클래스 | 기초클래스와 유도클래스
기존객체가 가진 메소드외에 새로운 메소드를 추가하고 싶다면, Calculator클래스에 substract메소드를 추가하면 되는데 경우에 따라서 새 메소드를 추가하기가 어려울 때가 있습니다.
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) 요는, 다 같이 쓰는 기존 클래스 내 함수는 건들지 않고, 새로운 기능을 추가하는 방법으로 상속을 쓴다는거네요. 마치 라이브러리/헤더파일 같네요.
2) 클래스A extends 클래스B 에서, this를 사용하면 클래스B의 전역변수를 가져오는 점이 흥미롭네요. 클래스A와 클래스B의 전역변수 이름이 동일한 경우, 어떻게 되는지 궁금해요.
3) 클래스A extends 클래스B, 클래스C extends 클래스A 이런 경우에,
클래스A를 사용한다면, 클래스A,B,C의 함수 모두 사용 가능할까요?