πŸ“•JAVA

[JAVA] 상속

λΉ™λ””μš© 2024. 4. 10.

1. 상속 관계

- 상속은 κΈ°μ‘΄ 클래슀의 ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό μƒˆλ‘œμš΄ ν΄λž˜μŠ€μ—μ„œ μž¬ν™œμš©ν•  수 있게 ν•΄μ€€λ‹€.

- extendsλ₯Ό 뢙이면 되며, λŒ€μƒμ€ ν•˜λ‚˜λ§Œ 선택 κ°€λŠ₯ν•˜λ‹€.

 

- λΆ€λͺ¨ 클래슀(μžμ‹ μ˜ ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό λ‹€λ₯Έ ν΄λž˜μŠ€μ— μ μš©ν•˜λŠ” 클래슀)

public class Car {
	
    public void move() {
    	System.out.println("μ°¨λ₯Ό μ΄λ™ν•©λ‹ˆλ‹€.");
	}
    
    public void openDoor(){
    	System.out.println("문을 μ—½λ‹ˆλ‹€.");
	}
}

 

- μžμ‹ 클래슀(λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό 상속 λ°›λŠ” 클래슀)

public class ElectricCar extends Car {

	public void charge(){
    	System.out.println("μΆ©μ „ν•©λ‹ˆλ‹€.");
	}
}
public class GasCar extends Car {

	public void fillUp(){
    	System.out.println("기름을 μ£Όμœ ν•©λ‹ˆλ‹€.");
	}
}

μœ„μ™€ 같은 ꡬ쑰λ₯Ό 가짐

2. 상속과 λ©”λͺ¨λ¦¬ ꡬ쑰

- main문이 μžˆλ‹€κ³  κ°€μ •ν•΄ 보자.

- μœ„μ™€ 같이 본인 νƒ€μž…μ—μ„œ 확인 ν›„, μ—†μœΌλ©΄ λΆ€λͺ¨ 클래슀λ₯Ό ν™•μΈν•œλ‹€.

 

3. 상속과 λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©

- μ˜€λ²„λΌμ΄λ”© : 상속받은 κΈ°λŠ₯을 μžμ‹μ΄ μž¬μ •μ˜ ν•˜λŠ” 것

public class NewCar extends Car {
	
    @Override
    public void move(){
    	System.out.prinln("λΉ λ₯΄κ²Œ μ΄λ™ν•©λ‹ˆλ‹€.");
	}
    
    public void charge(){
    	System.out.println("μΆ©μ „ν•©λ‹ˆλ‹€");
	}
}

- @Override : μ»΄νŒŒμΌλŸ¬κ°€ 보고 λ©”μ„œλ“œκ°€ μ •ν™•νžˆ μ˜€λ²„λΌμ΄λ“œ λ˜μ—ˆλŠ”μ§€ 확인해쀀닀. μ‹€μˆ˜λ‘œ μ˜€λ²„λΌμ΄λ”©μ„ λͺ»ν•˜λŠ” 경우λ₯Ό 방지해 μ£ΌκΈ° μœ„ν•œ κΈ°λŠ₯

 

4. μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©

1) λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©

- λ©”μ„œλ“œ 이름이 κ°™κ³  νŒŒλΌλ―Έν„°κ°€ λ‹€λ₯Έ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬κ°œ μ •μ˜ν•˜λŠ” 것

2)λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©

- ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μƒμœ„ 클래슀 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ ν•˜λŠ” 과정을 의미

3) λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© 쑰건

- λ©”μ„œλ“œ 이름 : λ©”μ„œλ“œ 이름이 κ°™μ•„μ•Ό ν•œλ‹€.

- λ©”μ„œλ“œ λ§€κ°œλ³€μˆ˜(νŒŒλΌλ―Έν„°) : λ§€κ°œλ³€μˆ˜(νŒŒλΌλ―Έν„°) νƒ€μž…, μˆœμ„œ,  κ°œμˆ˜κ°€ κ°™μ•„μ•Ό ν•œλ‹€.

- λ°˜ν™˜ νƒ€μž… : λ°˜ν™˜ νƒ€μž…μ΄ κ°™μ•„μ•Ό ν•œλ‹€. 단 λ°˜ν™˜ νƒ€μž…μ΄ ν•˜μœ„ 클래슀 νƒ€μž…μΌ 수 μžˆλ‹€.

- μ ‘κ·Ό μ œμ–΄μž : μ˜€λ²„λΌμ΄λ”© λ©”μ„œλ“œμ˜ μ ‘κ·Ό μ œμ–΄μžλŠ” μƒμœ„ 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ 더 μ œν•œμ μ΄μ–΄μ„œλŠ” μ•ˆλœλ‹€.

- μ˜ˆμ™Έ : μ˜€λ²„λΌμ΄λ”© λ©”μ„œλ“œλŠ” μƒμœ„ 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ 더 λ§Žμ€ 체크 μ˜ˆμ™Έλ₯Ό throws둜 μ„ μ–Έν•  수 μ—†λ‹€.

- static, final, private : ν‚€μ›Œλ“œκ°€ 뢙은 경우 μ˜€λ²„λΌμ΄λ”© 될 수 μ—†λ‹€.

- μƒμ„±μž μ˜€λ²„λΌμ΄λ”© : μƒμ„±μžλŠ” μ˜€λ²„λΌμ΄λ”© ν•  수 μ—†λ‹€.

4. super

- λΆ€λͺ¨μ™€ μžμ‹μ˜ ν•„λ“œλͺ…이 κ°™κ±°λ‚˜ λ©”μ„œλ“œκ°€ μ˜€λ²„λΌμ΄λ”© λ˜μ–΄ 있으면 μžμ‹μ—μ„œ λΆ€λͺ¨μ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μ—†λŠ”λ°, super을 μ‚¬μš©ν•˜λ©΄ λΆ€λͺ¨λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.

 

- λΆ€λͺ¨ 클래슀

public class ClassA {
	
    public ClassA() {
    	System.out.println("λΆ€λͺ¨ 클래슀");
	}
}

 

- μžμ‹ 클래슀

public class ClassB extends ClassA {

	public ClassB(int a) {
    	super(); //κΈ°λ³Έ μƒμ„±μž μƒλž΅ κ°€λŠ₯
        System.out.println("ClassB μƒμ„±μž a = " + a);
	}
    
    public Class B(int a, int b) {
    	super(); //κΈ°λ³Έ μƒμ„±μž μƒλž΅ κ°€λŠ₯
        System.out.println("ClassB μƒμ„±μž a = " + a + " b = "  + b);
	}
}

- μœ„ 처럼 상속을 λ°›μœΌλ©΄ μƒμ„±μžμ˜ 첫쀄에 super(...)을 μ‚¬μš©ν•΄ λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ•Όν•œλ‹€.

- λΆ€λͺ¨ 클래슀의 μƒμ„±μžκ°€ κΈ°λ³Έ μƒμ„±μžμΈ 경우 super()μƒλž΅ κ°€λŠ₯

public class ClassC extends ClassB {

	public ClassC(){
    	super(10, 20);
        System.out.println("ClassC μƒμ„±μž");
	}
}

- ClassB의 μƒμ„±μž 쀑 ClassCλŠ” ν•˜λ‚˜λ§Œ μ„ νƒν•˜λ©΄ λœλ‹€. (ClassB(int a, int b)λ₯Ό 선택)

- ClassBμ—λŠ” κΈ°λ³Έ μƒμ„±μžκ°€ μ—†μœΌλ―€λ‘œ super()을 μƒλž΅ν•  수 μ—†λ‹€.

public class SuperMain{

public static void main(String[] args) {
	ClassC classC = new ClassC();
    }
}
μ‹€ν–‰κ²°κ³Ό
Class A μƒμ„±μž
Class B μƒμ„±μž a=10 b=20
Class C μƒμ„±μž

- μƒμ„±μžμ˜ μ‹€ν–‰ μˆœμ„œκ°€ μ΅œμƒμœ„ λΆ€λͺ¨λΆ€ν„° ν•˜λ‚˜μ”© μ•„λž˜λ‘œ λ‚΄λ €μ˜€λŠ” 것을 확인할 수 μžˆλ‹€. 즉, μ΄ˆκΈ°ν™”λŠ” μ΅œμƒμœ„ λΆ€λͺ¨λΆ€ν„° 이루어진닀.

좜처 : κΉ€μ˜ν•œμ˜ μ‹€μ „ μžλ°”-기본편 

λŒ“κΈ€