λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Study/Java

μžλ°”ν”„λ‘œκ·Έλž˜λ° 4μ£Όμ°¨ 정리

μˆ˜μ—…λ‚ μ§œ/μ •λ¦¬λ‚ μ§œ

2022.03.29/2022.04.03

 

ν•™μŠ΅μ£Όμ œ
  • 07 상속

 

ν•™μŠ΅λ‚΄μš©

07 상속

상속(inheritance): 기쑴에 μ‘΄μž¬ν•˜λŠ” ν΄λž˜μŠ€λ‘œλΆ€ν„° μ½”λ“œμ™€ 데이터λ₯Ό 이어받고 μžμ‹ μ΄ ν•„μš”ν•œ κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 기법

 

μƒμ†μ˜ ν˜•μ‹

μžλ°”μ—μ„œμ˜ 상속은 클래슀 이름 뒀에 extendsλ₯Ό 써주고 λΆ€λͺ¨ 클래슀 이름은 적어쀀닀.

β€» extends: ν™•μž₯(λ˜λŠ” νŒŒμƒ)  → λΆ€λͺ¨ 클래슀λ₯Ό ν™•μž₯ν•˜μ—¬ μžμ‹ 클래슀λ₯Ό μž‘μ„±ν•œλ‹€λŠ” 의미.

class Childclass extends Parentclass	// Childclass: μžμ‹orμ„œλΈŒν΄λž˜μŠ€, Parentclass: λΆ€λͺ¨or수퍼클래슀
{
	// ν•„λ“œμ™€ λ©”μ†Œλ“œ μΆ”κ°€
}
더보기

무엇이 상속이 λ˜λŠ”κ°€?

  • λΆ€λͺ¨ 클래슀의 ν•„λ“œμ™€ λ©”μ†Œλ“œκ°€ μžμ‹ 클래슀둜 μƒμ†λœλ‹€.
  • λ”°λΌμ„œ μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό 자유둭게 μ‚¬μš©ν•  수 μžˆλ‹€.
  • μžμ‹ ν΄λž˜μŠ€λŠ” μžμ‹ λ§Œμ˜ ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.
  • μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ— 이미 μ‘΄μž¬ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.
  • μžμ‹ ν΄λž˜μŠ€λŠ” 항상 λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό ν¬ν•¨ν•˜κ²Œ λœλ‹€.
  • μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 public, protected, package λ©€λ²„λŠ” μƒμ†λ°›μ§€λ§Œ, private λ©€λ²„λŠ” μƒμ†λ˜μ§€ μ•ŠλŠ”λ‹€.

 

λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©

  • μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μƒμ†λœ λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜(μ˜€λ²„λΌμ΄λ”©)ν•œλ‹€.
  • λ©”μ†Œλ“œμ˜ 이름/λ°˜ν™˜ν˜•/λ§€κ°œλ³€μˆ˜κ°€ λͺ¨λ‘ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.
  • μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜λ©΄, μžμ‹ ν΄λž˜μŠ€μ—λŠ” λ™μΌν•œ λ©”μ†Œλ“œκ°€ 2개 μ‘΄μž¬ν•˜κ²Œ λœλ‹€. (λΆ€λͺ¨μ˜ λ©”μ†Œλ“œ, μžμ‹μ˜ λ©”μ†Œλ“œ)

β€» μ˜€λ²„λΌμ΄λ“œ(override): λ¬΄μ‹œν•œλ‹€.

 

@Override μ–΄λ…Έν…Œμ΄μ…˜

μž¬μ •μ˜λœ λ©”μ†Œλ“œ 이름 μ•žμ— @Override μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ΄λŠ” 것이 μ’‹λ‹€. λ§Œμ•½ λΆ€λͺ¨ ν΄λž˜μŠ€μ— 그런 이름이 λ©”μ†Œλ“œκ°€ μ—†λ‹€λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ 였λ₯˜λ₯Ό λ°œμƒν•œλ‹€.

class Dog extends Animal{
	@Override
    public void sound(){
    	System.out.print("멍멍");
    }
}
더보기

sound()κ°€ μ•„λ‹Œ saund()둜 μž‘μ„±ν–ˆμ„ 경우(μ˜€νƒ€λ‘œ 인해 λ‹€λ₯΄κ²Œ μž‘μ„±ν–ˆμ„ 경우),

μ»΄νŒŒμΌλŸ¬λŠ” 고유의 λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•œκ±΄μ§€, λΆ€λͺ¨λ‘œλΆ€ν„° 받은 것을 μ˜€λ²„λΌμ΄λ”©ν•œ 것인지 μ•Œ 수 μ—†λ‹€.

→ @Override μ‚¬μš©! → λΆ€λͺ¨μ˜ 것과 같은 것인지 μ»΄νŒŒμΌλŸ¬κ°€ ν™•μΈν•˜κ³  였λ₯˜λ‘œ μ²˜λ¦¬ν•˜κ²Œ λœλ‹€.

 

ν‚€μ›Œλ“œ super(parentchild)

  • ν‚€μ›Œλ“œ superλŠ” 상속 κ΄€κ³„μ—μ„œ λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ‚œ ν•„λ“œλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ°Έμ‘°ν•˜κΈ° μœ„ν•΄ μ‚¬μš―λœλ‹€.
  • λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ‚˜ ν•„λ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•œ 경우 superλ₯Ό μ‚¬μš©ν•˜λ©΄ λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ‚˜ ν•„λ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.

 

μƒμ†μžμ™€ μƒμ„±μž

μžμ‹ 객체가 생성될 λ•Œ, μƒμ„±μžμ˜ 호좜 μˆœμ„œ

  • λΆ€λͺ¨μ˜ μƒμ„±μž → μžμ‹μ˜ μƒμ„±μž 순으둜 ν˜ΈμΆœλœλ‹€.
  • λΆ€λͺ¨μ˜ λ¬΅μ‹œμ  μƒμ„±μž μžλ™ 호좜이 기본이닀.
  • λΆ€λͺ¨μ˜ λͺ…μ‹œμ  μƒμ„±μž 호좜이 ν•„μš”ν•  μ‹œ, λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•΄μ•Όν•œλ‹€. (super ν‚€μ›Œλ“œ ν•„μš”)

 

λͺ…μ‹œμ μΈ λΆ€λͺ¨ μƒμ„±μž 호좜

class Shape{
	public Shape(String msg){
    	System.out.println("Shape μƒμ„±μž()" + msg);
    }
}

public class Rectangle extends Shape{
	public Rectangle(){
    	super("from Rectangle");	// λͺ…μ‹œμ μΈ 호좜
        System.out.println("Rectangle μƒμ„±μž()");
    }
}

 

λ¬΅μ‹œμ μΈ λΆ€λͺ¨ μƒμ„±μž 호좜

class Shape{
	public Shape(String msg){
    	System.out.println("Shape μƒμ„±μž()");
    }
}

class Rectangle extends Shape{
	public Rectangle(){		// 였λ₯˜: λ¬΅μ‹œμ  Shape()이 μ—†μŒ
    	System.out.println("Rectangle μƒμ„±μž()");
    }
}

μœ„μ˜ 경우 맀개 λ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžλ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ•„ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μƒμ„±μžκ°€ ν•˜λ‚˜λΌλ„ μ •μ˜λ˜μ–΄ 있으면 κΈ°λ³Έ μƒμ„±μžκ°€ μžλ™ μΆ”κ°€λ˜μ§€ μ•ŠλŠ”λ‹€.

λ•Œλ¬Έμ— μžμ‹ ν΄λž˜μŠ€μ—μ„œ 맀개 λ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  수 μ—†μ–΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

더보기

해결법

β‘  λΆ€λͺ¨ ν΄λž˜μŠ€μ— λ¬΅μ‹œμ  μƒμ„±μžλ₯Ό μ˜€λ²„λ‘œλ”©ν•œλ‹€.

β‘‘ μžμ‹ 클래슀의 μƒμ„±μžμ—μ„œ λΆ€λͺ¨ 클래슀의 λͺ…μ‹œμ  μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€.

 

좔상 클래슀

  • μ™„μ „ν•˜κ²Œ κ΅¬ν˜„λ˜μ–΄ μžˆμ§€ μ•Šμ€ λ©”μ†Œλ“œλ₯Ό 가지고 μžˆλŠ” 클래슀λ₯Ό μ˜λ―Έν•œλ‹€.
  • λ©”μ†Œλ“œκ°€ λ―Έμ™„μ„±λ˜μ–΄ μžˆμœΌλ―€λ‘œ 좔상 ν΄λž˜μŠ€λ‘œλŠ” 객체λ₯Ό 생성할 수 μ—†λ‹€.
  • 주둜 상속 κ³„μΈ΅μ—μ„œ 좔상적인 κ°œλ…μ„ ν‘œν˜„ν•˜κΈ° μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©λœλ‹€.
  • 좔상 클래슀λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œ 클래슀 μ„ μ–Έ μ‹œ μ•žμ— μ˜ˆμ•½μ–΄ abstractλ₯Ό μ‚¬μš©ν•œλ‹€.
pubilc abstract class Animal{	// 좔상 클래슀
	public abstract void move();	// 좔상 λ©”μ†Œλ“œ, body λΆ€λΆ„(κ΅¬ν˜„ λΆ€λΆ„)이 μ—†μŒ 
    ...
}

 

상속과 λ‹€ν˜•μ„±

  • λ‹€ν˜•μ„±μ΄λž€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ ν•˜λ‚˜μ˜ μ‹λ³„μžλ‘œ λ‹€μ–‘ν•œ νƒ€μž…(클래슀)λ₯Ό μ²˜λ¦¬ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.
  • λ™μΌν•œ λ©”μ‹œμ§€μ— κ°μ²΄λ§ˆλ‹€ μ„œλ‘œ λ‹€λ₯΄κ²Œ λ™μž‘ν•œλ‹€.
  • 상ν–₯ ν˜•λ³€ν™˜, 동적 바인딩 κ°œλ…μ΄ ν•„μš”ν•˜λ‹€.

 

상ν–₯ ν˜•λ³€ν™˜

up-casting (μžμ‹ 객체가 λΆ€λͺ¨νƒ€μž…μœΌλ‘œ λ³€ν™˜)

λΆ€λͺ¨ ν΄λž˜μŠ€ν˜• 객체 μ°Έμ‘° λ³€μˆ˜λ‘œ μžμ‹ 클래슀의 객체 μ°Έμ‘°κ°€ κ°€λŠ₯ν•˜λ‹€.

class A{}
class B extends A{}			// BλŠ” Aλ‘œλΆ€ν„° 상속받아 μž‘μ„±λ¨
public class TypeTest{
	public static void main(String args[]){
    	A a = new B();		// λΆ€λͺ¨ 클래슀의 μ°Έμ‘° λ³€μˆ˜λ‘œ μžμ‹ 클래슀의 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.
    }
}

 

ꡐ재 339μͺ½ 예제

...		// Shape 클래슀(λΆ€λͺ¨)와 Rectangle 클래슀(μžμ‹) μƒλž΅. width와 heightλŠ” Rectangle클래슀의 λ³€μˆ˜
public class ShapeTest{
	public static void main(String args[]){
    	Shape s = new Rectangle();
        s.x = 0;
        s.y = 0;
        s.width = 100;	// 컴파일 였λ₯˜
        s.height = 100;	// 컴파일 였λ₯˜
    }
}

5~6쀄: Shape 클래슀(λΆ€λͺ¨)의 ν•„λ“œμ™€ λ©”μ†Œλ“œμ— μ ‘κ·Όν•˜λŠ” 것은 κ°€λŠ₯ν•˜λ‹€.

7~8쀄: sλ₯Ό ν†΅ν•΄μ„œλŠ” Rectangle 클래슀(μžμ‹)의 ν•„λ“œμ™€ λ©”μ†Œλ“œμ— μ ‘κ·Όν•  수 μ—†λ‹€. → 컴파일 였λ₯˜

 

ν•˜ν–₯ ν˜•λ³€ν™˜

Shape s = new Rectangle); // 상ν–₯ν˜•λ³€ν™˜μœΌλ‘œ 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” κ²½μš°μ— ν•œν•΄ ν•˜ν–₯ ν˜•λ³€ν™˜ κ°€λŠ₯!
((Rectangle)s).setWidth(100);	// ν•˜ν–₯ ν˜•λ³€ν™˜

 

동적 바인딩

  • λ©”μ†Œλ“œ ν˜ΈμΆœμ„ μ‹€μ œ λ©”μ†Œλ“œμ˜ λͺΈμ²΄μ™€ μ—°κ²°ν•˜λŠ” 것을 λ§ν•œλ‹€.
  • JVM은 μ‹€ν–‰ λ‹¨κ³„μ—μ„œ μ μ ˆν•œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.

β€» JVM: 각각의 μš΄μ˜μ²΄μ œμ— λ“€μ–΄μžˆλŠ” 가상머신. (μžλ°”μ—μ„œ 동적바인딩이 μ•Œμ•„μ„œ 이루어진닀.)

 

λ©”μ†Œλ“œμ˜ 맀개 λ³€μˆ˜

  • λ©”μ†Œλ“œμ˜ 맀개 λ³€μˆ˜λ‘œ λΆ€λͺ¨ 클래슀 μ°Έμ‘° λ³€μˆ˜λ₯Ό μ΄μš©ν•œλ‹€. → λ‹€ν˜•μ„±μ„ μ΄μš©ν•˜λŠ” μ „ν˜•μ μΈ 방법

 

Object 클래슀

  • Object 클래슀λ₯Ό μ œμ™Έν•˜κ³  λͺ¨λ“  ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀λ₯Ό 가지고 μžˆλ‹€.
  • Object ν΄λž˜μŠ€λŠ” java.lang νŒ¨ν‚€μ§€ μ†Œμ†μ΄λ‹€. → λͺ¨λ“  ν΄λž˜μŠ€μ— 곡톡적인 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€.
  • 클래슀 계측 ꡬ쑰의 μ΅œμƒμœ„ ν΄λž˜μŠ€μ΄λ‹€.

Object의 λ©”μ†Œλ“œ

λ©”μ†Œλ“œ μ„€λͺ…
Object clone() 객체 μžμ‹ μ˜ 볡사본을 μƒμ„±ν•˜μ—¬ λ°˜ν™˜
boolean equals(Object obj) objκ°€ ν˜„μž¬ 객체와 같은지λ₯Ό λ°˜ν™˜
void finalize() μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 객체가 제거되기 직전에 호좜(μ†Œλ©Έμž)
class getclass() μ‹€ν–‰ μ‹œκ°„μ— 객체의 클래슀 정보λ₯Ό λ°˜ν™˜
int hashCode() 객체에 λŒ€ν•œ 해쉬 μ½”λ“œλ₯Ό λ°˜ν™˜
String toString() 객체λ₯Ό κΈ°μˆ ν•˜λŠ” λ¬Έμžμ—΄μ„ λ°˜ν™˜

이 쀑 많이 μ‚¬μš©λ˜λŠ” λ©”μ†Œλ“œλ₯Ό μ‚΄νŽ΄λ³΄μž

getclass() λ©”μ†Œλ“œ

  • 객체가 μ–΄λ–€ 클래슀둜 μƒμ„±λ˜μ—ˆλŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό λ°˜ν™˜ν™˜λ‹€.

equals() λ©”μ†Œλ“œ

  • == μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 객체의 μ£Όμ†Œκ°€ λ™μΌν•œμ§€ κ²€μ‚¬ν•˜μ—¬ trueλ‚˜ flaseλ₯Ό λ°˜ν™˜ν•œλ‹€. (객체 μ°Έμ‘°κ°€ λ™μΌν•œμ§€ 검사)
  • Stirng은 Object의 equalsλ₯Ό μž¬μ •μ˜ ν•˜μ—¬ λ¬Έμžμ—΄μ„ λΉ„κ΅ν•œλ‹€. (λ¬Έμžμ—΄μ΄ κ°™μœΌλ©΄ 같은 객체둜 λ³Έλ‹€.)

toString() λ©”μ†Œλ“œ

  • 객체가 가진 정보λ₯Ό ν•œμ€„μ˜ λ¬Έμžμ—΄λ‘œ λ§Œλ“€μ–΄μ„œ λ°˜ν™˜ν•œλ‹€.

 

쒅단 (final) 클래슀/λ©”μ†Œλ“œ

쒅단 클래슀

  • 상속을 μ‹œν‚¬ 수 μ—†λŠ” 클래슀
  • λ³΄μ•ˆμƒμ˜ 이유 λ•Œλ¬Έ
public final class MyFinal{...}
public class ThisIsWrong extends MyFinal{...}	// λΆˆκ°€

쒅단 λ©”μ†Œλ“œ

  • νŠΉμ •ν•œ λ©”μ†Œλ“œλ§Œ μ˜€λ²„λΌμ΄λ“œ 될 수 μ—†κ²Œ λ§Œγ„·λŠ” λ©”μ†Œλ“œ
class Baduk{
	enum BadukPlayer{WHITE, BLACK};
    ...
	final BadukPlayer getFirstPlayer(){		// μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•  수 없도둝 final둜 지정
		return BadukPlayer.BLACK;
	}
}

 


ν•™μŠ΅λ‚΄μš© 이해도

90%정도. 예제λ₯Ό μ’€ 더 꼼꼼히 μ‚΄νŽ΄λ³΄λ©° 이해해야겠닀.

 

ν•™μŠ΅ν™œλ™ λŒμ•„λ³΄κΈ°

C++ν”„λ‘œκ·Έλž˜λ° λ•Œ 배운 κ°œλ…μ™€ λΉ„μŠ·ν•΄μ„œ μ΄ν•΄ν•˜λŠ”λ° 큰 어렀움은 μ—†μ—ˆλ‹€. λ‚΄μš© 정리λ₯Ό ν•˜λ©° μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©μ— λŒ€ν•œ κ°œλ…μ΄ μ œλŒ€λ‘œ μž‘νžˆμ§€ μ•Šμ€ μƒνƒœλΌλŠ” 것을 μ•Œ 수 μžˆμ—ˆλ‹€. 이 λ‘˜μ— λŒ€ν•΄ μ°Ύμ•„λ³΄λ‹ˆ μ˜€λ²„λ‘œλ”©μ€ 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬κ°œ κ°€μ§€λ©΄μ„œ λ§€κ°œλ³€μˆ˜μ˜ μœ ν˜•κ³Ό 개수λ₯Ό λ‹€λ₯΄κ²Œ ν•˜λŠ” 것. μ˜€λ²„λΌμ΄λ”©μ€ μƒμœ„ ν΄λž˜μŠ€κ°€ 가지고 μžˆλŠ” λ©”μ†Œλ“œλ₯Ό ν•˜μœ„ ν΄λž˜μŠ€κ°€ μž¬μ •μ˜ ν•˜λŠ” 것이라고 ν•œλ‹€.

 

λ‹€μŒ ν•™μŠ΅κ³„νš

μžλ°” GUI의 이해1