• [Java] ch5 μžλ°” 상속 (λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”© vs λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©) / μƒμ„±μž

    2023. 9. 5.

    by. @leeeun

    03 상속

    class A extends B{ }
    
    • extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀의 κΈ°λŠ₯을 κ·ΈλŒ€λ‘œ λ¬Όλ €λ°›μŒ
    • λΆ€λͺ¨ 클래슀λ₯Ό 상속받은 μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 κΈ°λŠ₯에 λ”ν•˜μ—¬ μƒˆλ‘œμš΄ λ©”μ†Œλ“œλ₯Ό μž‘μ„± κ°€λŠ₯

     

    IS-A 관계 vs HAS-A 관계

     

    IS-A 관계

    Animal dog = new Dog();  // Dog is a Animal (o)
    Dog dog = new Animal();  // Animal is a Dog (X) 컴파일 였λ₯˜
    
    • '~은 ~이닀.'둜 상속관계λ₯Ό 의미 (extendsλ₯Ό μ‚¬μš©)
    • μƒμœ„ ν΄λž˜μŠ€κ°€ 일반적인 κ°œλ… 클래슀이고 ν•˜μœ„ ν΄λž˜μŠ€κ°€ ꡬ체적인 κ°œλ… ν΄λž˜μŠ€κ°€ 됨
    • μžμ‹ 클래슀의 κ°μ²΄λŠ” λΆ€λͺ¨ 클래슀의 μžλ£Œν˜•μΈ κ²ƒμ²˜λŸΌ μ‚¬μš© κ°€λŠ₯ (λΆ€λͺ¨ ν΄λž˜μŠ€λŠ” μžμ‹ 클래슀만의 λ©”μ„œλ“œ μ‚¬μš©x)
    • λΆ€λͺ¨ 클래슀둜 λ§Œλ“€μ–΄μ§„ 객체λ₯Ό μžμ‹ 클래슀의 μžλ£Œν˜•μœΌλ‘œ μ‚¬μš© λΆˆκ°€

     

    HAS-A 관계

    public class Computer{
    
    }
    
    public class Power {
    	public void on(){
    		System.out.println("Power on");
    	}
    	public void off(){
    		System.out.println("Power off");
    	}
    }
    
    public Samsung extends Computer{
    	public void SamsungPower(){
    		Power power=new Power;
    		power.on();
    		}
    }
    
    • ‘~은 ~을 가지고 μžˆλ‹€.'둜 포함관계λ₯Ό 의미 상속x
    • κΈ°λŠ₯을 뢈러였기 λ•Œλ¬Έμ— μƒˆλ‘œμš΄ μƒμ„±μžλ₯Ό 생성해야 함

    has-a κ΄€κ³„λŠ” μ½”λ“œ μž¬μ‚¬μš©μ˜ ν•œ 방법이닀.

    상속관계(is-a관계)λ³΄λ‹€λŠ” 포함관계(has-a관계)λ₯Ό 훨씬 많이 μ“΄λ‹€.

     

    Object 클래슀

    • μžλ°”μ˜ μ΅œμƒμœ„ λΆ€λͺ¨ 클래슀
    • extends ν‚€μ›Œλ“œλ‘œ λ‹€λ₯Έ 클래슀λ₯Ό μƒμ†ν•˜μ§€ μ•ŠμœΌλ©΄ μ•”μ‹œμ μœΌλ‘œ 상속
    Object animal = new Animal();  // Animal is a Object
    Object dog = new Dog();  // Dog is a Object
    
    • μžλ°”μ—μ„œ λ§Œλ“œλŠ” λͺ¨λ“  κ°μ²΄λŠ” Object μžλ£Œν˜•μœΌλ‘œ μ‚¬μš© κ°€λŠ₯

     

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

    • 상속 관계에 μžˆλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 이미 μ •μ˜λœ λ©”μ†Œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것
    • μ˜€λ²„λΌμ΄λ”©ν•˜κ³ μž ν•˜λŠ” λ©”μ†Œλ“œμ˜ 선언이 동일해야 함 (λ©”μ†Œλ“œ 이름, μž…μΆœλ ₯이 동일) → μž¬μ •μ˜λœ λ©”μ„œλ“œκ°€ μš°μ„ μˆœμœ„

     

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

    • 기쑴에 μ—†λŠ” μƒˆλ‘œμš΄ λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 것
    • μžλ°”μ˜ ν•œ 클래슀 내에 같은 이름을 가진 λ©”μ†Œλ“œκ°€ μžˆλ”λΌλ„ λ§€κ°œλ³€μˆ˜μ˜ 개수 λ˜λŠ” νƒ€μž…μ΄ λ‹€λ₯΄λ©΄, 같은 이름을 μ‚¬μš©ν•΄μ„œ λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•˜λŠ” 것
    • c언어와 달리 μžλ°”λŠ” ν•˜λ‚˜μ˜ λ©”μ†Œλ“œ μ΄λ¦„μœΌλ‘œ μ—¬λŸ¬ κΈ°λŠ₯을 κ΅¬ν˜„ κ°€λŠ₯
    • λ©”μ†Œλ“œμ˜ 이름이 κ°™κ³ , λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λ‚˜ νƒ€μž…μ΄ 달라야 함

     

    ꡬ뢄 Overriding  Overloading
    μ ‘κ·Ό μ œμ–΄μž λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œμ˜ μ ‘κ·Ό μ œμ–΄μžλ³΄λ‹€ λ” 넓은 λ²”μœ„μ˜ μ ‘κ·Ό μ œμ–΄μžλ₯Ό μžμ‹ 클래슀의 λ©”μ†Œλ“œμ—μ„œ μ„€μ •ν•  수 μžˆλ‹€. λͺ¨λ“  μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
    λ¦¬ν„΄ν˜• 동일해야 ν•œλ‹€. 달라도 λœλ‹€.
    λ©”μ†Œλ“œλͺ… 동일해야 ν•œλ‹€. 동일해야 ν•œλ‹€.
    λ§€κ°œλ³€μˆ˜ 동일해야 ν•œλ‹€. λ‹¬λΌμ•Όλ§Œ ν•œλ‹€.
    적용 λ²”μœ„ μƒμ†κ΄€κ³„μ—μ„œ μ μš©λœλ‹€. 같은 클래슀 λ‚΄μ—μ„œ μ μš©λœλ‹€.

     

    닀쀑 상속

    • ν΄λž˜μŠ€κ°€ λ™μ‹œμ— ν•˜λ‚˜ μ΄μƒμ˜ 클래슀λ₯Ό μƒμ†λ°›λŠ” 것
    • μžλ°”λŠ” c++, 파이썬과 달리 닀쀑 상속을 μ§€μ›ν•˜μ§€ x

     

    인용

    2. Java μžλ°” [API] - Object 클래슀, Object 클래슀의 λ©”μ†Œλ“œ 1

    [Java]μ˜€λ²„λ‘œλ”© & μ˜€λ²„λΌμ΄λ”©(Overloading & Overriding)


    04 μƒμ„±μž(Constructor)

    • 객체가 생성될 λ•Œ(newν‚€μ›Œλ“œκ°€ μ‚¬μš©λ  λ•Œ) μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” λ©”μ†Œλ“œ, 객체의 μ΄ˆκΈ°ν™”λ₯Ό μœ„ν•΄ μ‚¬μš©

     

    νŠΉμ§•

    • μƒμ„±μžλŠ” κ°μ²΄κ°€ μƒμ„±λ λ•Œ μžλ™μœΌλ‘œ ν•œλ²ˆ 호좜됨
    • μƒμ„±μžλŠ” λ§€κ°œλ³€μˆ˜ 쑰건에 따라 μ—¬λŸ¬κ°œλ₯Ό μž‘μ„± κ°€λŠ₯ (μ˜€λ²„λ‘œλ”©)
    • μƒμ„±μžλŠ” ν΄λž˜μŠ€μ— μ΅œμ†Œ 1κ°œλŠ” μžˆμ–΄μ•Ό ν•˜λ©°, μƒμ„±μž μ½”λ“œκ°€ 없을 경우 μ»΄νŒŒμΌλŸ¬κ°€ κΈ°λ³Έμƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ 생성
    • μƒμ„±μžκ°€ ν•˜λ‚˜λΌλ„ 있으면 κΈ°λ³Έ μƒμ„±μž μžλ™ 생성x

     

    μ„ μ–Έ 쑰건

    • 클래슀λͺ…κ³Ό λ©”μ„œλ“œλͺ…이 동일
    • 리턴 νƒ€μž…μ„ μ •μ˜x (void μ‚¬μš©x)

     

    κΈ°λ³Έ μƒμ„±μž(default constructor)

    public class constructor{
    	public constructor(){} //κΈ°λ³Έ μƒμ„±μž μžλ™ 생성
    }
    
    • μƒμ„±μžμ˜ μž…λ ₯ ν•­λͺ©μ΄ μ—†κ³  μƒμ„±μž 내뢀에 아무 λ‚΄μš©μ΄ μ—†λŠ” μƒμ„±μž
    • ν΄λž˜μŠ€μ— μƒμ„±μžκ°€ μ„ μ–Έλ˜μ–΄μžˆμ§€ μ•Šμ€ 경우 μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ λ””ν΄νŠΈ μƒμ„±μžλ₯Ό μΆ”κ°€

     

    μƒμ„±μž μ˜€λ²„λ‘œλ”©

    • μžλ°”μ˜ ν•œ 클래슀 내에 같은 이름을 가진 μƒμ„±μžκ°€ μžˆλ”λΌλ„ 같은 이름을 μ‚¬μš©ν•΄μ„œ μž…λ ₯값이 λ‹€λ₯Έ μƒμ„±μžλ₯Ό μ •μ˜ν•˜λŠ” 것
    • λ¬Έμžμ—΄λ‘œ μž…λ ₯값을 λ°›λŠ” μƒμ„±μžμ™€ μ •μˆ˜λ‘œ μž…λ ₯값을 λ°›λŠ” μƒμ„±μžκ°€ 있으면 객체λ₯Ό 생성할 λ•Œ λ¬Έμžμ—΄ ν˜Ήμ€ μ •μˆ˜λ‘œ 생성할 수 μžˆλ‹€

    λŒ“κΈ€