Programming/Java

[Java] 상속

yuri lee 2022. 10. 24. 21:46
λ°˜μ‘ν˜•
이 글은 μƒν™œμ½”λ”©μ˜ 'Java' κ°•μ’Œλ₯Ό λ°”νƒ•μœΌλ‘œ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

μƒμ†μ΄λž€?

객체 지ν–₯μ—μ„œ κ°€μž₯ μ€‘μš”ν•œ λͺ©ν‘œ 쀑 ν•˜λ‚˜λŠ” λ°”λ‘œ μž¬ν™œμš©μ„±μž…λ‹ˆλ‹€. 상속은 객체지ν–₯의 μž¬ν™œμš©μ„±μ„ κ·ΉλŒ€ν™”μ‹œν‚¨ ν”„λ‘œκ·Έλž˜λ° 기법이라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ™μ‹œμ— 객체 지ν–₯을 λ³΅μž‘ν•˜κ²Œ ν•˜λŠ” μ£Όμš” 원인이라고도 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

상속(Inheritance)μ΄λž€ λ¬Όλ €μ€€λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. μ–΄λ–€ 객체가 μžˆμ„ λ•Œ κ·Έ 객체의 ν•„λ“œ(λ³€μˆ˜)와 λ©”μ†Œλ“œλ₯Ό λ‹€λ₯Έ 객체가 물렀받을 수 μžˆλŠ” κΈ°λŠ₯을 상속이라고 ν•©λ‹ˆλ‹€. 

package org.opentutorials.javatutorials.object;
 
class Calculator{
    int left, right;
      
    public void setOprands(int left, int right){
        this.left = left;
        this.right = right;
    }
      
    public void sum(){
        System.out.println(this.left+this.right);
    }
      
    public void avg(){
        System.out.println((this.left+this.right)/2);
    }
}
  
public class CalculatorDemo4 {
      
    public static void main(String[] args) {
          
        Calculator c1 = new Calculator();
        c1.setOprands(10, 20);
        c1.sum();       
        c1.avg();       
          
        Calculator c2 = new Calculator();
        c2.setOprands(20, 40);
        c2.sum();       
        c2.avg();
    }
  
}

이 μ˜ˆμ œμ—μ„œ 객체 CalculatorλŠ” sumκ³Ό avg λ©”μ†Œλ“œλ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. 이 객체가 가지고 μžˆλŠ” κΈ°λŠ₯에 λΉΌκΈ°λ₯Ό μΆ”κ°€ν•˜κ³  싢을 κ²½μš°μ—λŠ” μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”? κ°€μž₯ μ‰¬μš΄ 방법은 이 객체에 λΉΌκΈ°(substract)λ₯Ό μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ•„λž˜μ™€ 같은 경우라면, 객체에 λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 것이 μ–΄λ €μšΈ κ²ƒμž…λ‹ˆλ‹€. 

 

1. 객체λ₯Ό μžμ‹ μ΄ λ§Œλ“€μ§€ μ•Šμ•˜μ„ 경우

2. 객체가 λ‹€μ–‘ν•œ κ³³μ—μ„œ ν™œμš©λ˜κ³  μžˆμ„ 경우 / λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ λ‹€λ₯Έ κ³³μ—μ„œ λΆˆν•„μš”ν•œ κΈ°λŠ₯이 포함될 수 μžˆμŠ΅λ‹ˆλ‹€. 

 

κ·Έλ ‡λ‹€λ©΄ 기쑴의 객체λ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•˜λ©΄μ„œ κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 방법은 μ—†μ„κΉŒμš”? λ°”λ‘œ 이런 λ§₯λ½μ—μ„œ λ“±μž₯ν•œ 것이 μƒμ†μž…λ‹ˆλ‹€. 기쑴의 객체λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„, μƒˆλ‘œμš΄ 객체가 기쑴의 객체λ₯Ό 기반으둜 λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ•Œ κΈ°μ‘΄ κ°μ²΄λŠ” κΈ°λŠ₯을 λ¬Όλ €μ€€λ‹€λŠ” μ˜λ―Έμ—μ„œ λΆ€λͺ¨κ°€ 되고, μƒˆλ‘œμš΄ κ°μ²΄λŠ” κΈ°λŠ₯을 λ¬Όλ €λ°›λŠ”λ‹€λŠ” μ˜λ―Έμ—μ„œ μžμ‹ 객체가 λ©λ‹ˆλ‹€. 

 

λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ μžμ‹ 클래슀의 관계λ₯Ό μƒμœ„(super) ν΄λž˜μŠ€μ™€ ν•˜μœ„(sub) 클래슀라고 ν‘œν˜„ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€. 

 

package org.opentutorials.javatutorials.Inheritance.example1;
 
class Calculator {
    int left, right;
 
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }
 
    public void sum() {
        System.out.println(this.left + this.right);
    }
 
    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }
}
 
class SubstractionableCalculator extends Calculator {
    public void substract() {
        System.out.println(this.left - this.right);
    }
}
 
public class CalculatorDemo1 {
 
    public static void main(String[] args) {
 
        SubstractionableCalculator c1 = new SubstractionableCalculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.substract();
    }
 
}

// output
// 30
// 15
// -10

extends CalculatorλŠ” 클래슀 Calculatorλ₯Ό 상속 λ°›λŠ”λ‹€λŠ” μ˜λ―Έλ‹€. λ”°λΌμ„œ SubstaractableCalculatorλŠ” Calculatorμ—μ„œ μ •μ˜ν•œ λ©”μ†Œλ“œ setOprands, sub, avgλ₯Ό μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€. 상속을 ν†΅ν•΄μ„œ μ½”λ“œμ˜ 쀑볡을 μ œκ±°ν•  수 있고, λΆ€λͺ¨ 클래슀λ₯Ό κ°œμ„ ν•˜λ©΄ 이λ₯Ό 상속받고 μžˆλŠ” λͺ¨λ“  μžμ‹ ν΄λž˜μŠ€λ“€μ—κ²Œ κ·Έ ν˜œνƒμ΄ μžλ™μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€. 즉 μœ μ§€λ³΄μˆ˜κ°€ νŽΈλ¦¬ν•΄μ§‘λ‹ˆλ‹€. 

 

Calculator을 상속 λ°›λŠ” 클래슀λ₯Ό ν•˜λ‚˜ 더 λ§Œλ“€μ–΄λ΄…μ‹œλ‹€. 

package org.opentutorials.javatutorials.Inheritance.example1;
 
class MultiplicationableCalculator extends Calculator {
    public void multiplication() {
        System.out.println(this.left * this.right);
    }
}
 
public class CalculatorDemo2 {
 
    public static void main(String[] args) {
 
        MultiplicationableCalculator c1 = new MultiplicationableCalculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.multiplication();
    }
 
}

// outout
// 30
// 15
// 200

 

μƒμ†ν•œ 클래슀λ₯Ό λ‹€μ‹œ 상속할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ˜ μ˜ˆμ œλŠ”  κ³±ν•˜κΈ°κ°€ κ°€λŠ₯ν•œ 클래슀인 MultiplicationableCalculator을 상속받고 μžˆμŠ΅λ‹ˆλ‹€. 

package org.opentutorials.javatutorials.Inheritance.example1;
 
class DivisionableCalculator extends MultiplicationableCalculator {
    public void division() {
        System.out.println(this.left / this.right);
    }
}
 
public class CalculatorDemo3 {
 
    public static void main(String[] args) {
 
        DivisionableCalculator c1 = new DivisionableCalculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.multiplication();
        c1.division();
    }
 
}

 

상속은 μž₯점이 μžˆμœΌλ©΄μ„œλ„ 단점도 μžˆμŠ΅λ‹ˆλ‹€. 단점은 λ³΅μž‘λ„μ˜ 증가라고 말할 수 μžˆμŠ΅λ‹ˆλ‹€. 객체 지ν–₯을 λ‘κ°œμ˜ μ‹œμ¦ŒμœΌλ‘œ λ‚˜λˆˆλ‹€λ©΄ ν΄λž˜μŠ€μ™€ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ 이해가 μ‹œμ¦Œ 1 / 상속은 μ‹œμ¦Œ2라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그만큼 μ€‘μš”ν•œ κ°œλ…μž…λ‹ˆλ‹€. 

λ°˜μ‘ν˜•