[TIL] 2024-12-16_λ‹€ν˜•μ„±

YuriΒ·2024λ…„ 12μ›” 16일

TIL

λͺ©λ‘ 보기
8/59
post-thumbnail

πŸ“• Today I Learned - 였늘 λ‚΄κ°€ κ³΅λΆ€ν•œ 것을 μ •λ¦¬ν•©λ‹ˆλ‹€.

1. λ‹€ν˜•μ„±(Polymorphism)

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ λŒ€ν‘œμ μΈ νŠΉμ§•

  • μΊ‘μŠν™”
  • 상속
  • λ‹€ν˜•μ„±

λ‹€ν˜•μ„±

ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ‹€ν˜•μ„±μ€ ν•œ 객체가 μ—¬λŸ¬ νƒ€μž…μ˜ 객체둜 취급될 수 μžˆλŠ” λŠ₯λ ₯을 λœ»ν•œλ‹€.
= ν•˜λ‚˜μ˜ 객체가 λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ μ‚¬μš©λ  수 μžˆλ‹€λŠ” 뜻

λ‹€ν˜•μ„± 핡심 이둠

  • λ‹€ν˜•μ  μ°Έμ‘°
  • λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©

λ‹€ν˜•μ  μ°Έμ‘°

μžλ°”μ—μ„œ λΆ€λͺ¨ νƒ€μž…μ€ μžμ‹ μ€ 물둠이고, μžμ‹ μ„ κΈ°μ€€μœΌλ‘œ λͺ¨λ“  μžμ‹ νƒ€μž…μ„ μ°Έμ‘°ν•  수 μžˆλ‹€. 이것이 λ°”λ‘œ λ‹€μ–‘ν•œ ν˜•νƒœλ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€κ³  ν•΄μ„œ λ‹€ν˜•μ  참쑰라 ν•œλ‹€.

package poly.basic;

public class PolyMain {
    public static void main(String[] args) {
        // λΆ€λͺ¨ λ³€μˆ˜κ°€ μžμ‹ μΈμŠ€ν„΄μŠ€ μ°Έμ‘°(λ‹€ν˜•μ  μ°Έμ‘°)
        System.out.println("Parent -> Child");
        Parent poly = new Child();
        poly.parentMethod();
//      poly.childMethod(); // μžμ‹μ˜ κΈ°λŠ₯은 ν˜ΈμΆœν•  수 μ—†λ‹€. 컴파일 였λ₯˜ λ°œμƒ

//        Child child1 = new Parent(); // μžμ‹μ€ λΆ€λͺ¨λ₯Ό 담을 수 μ—†λ‹€.
    }
}

  • poly λŠ” Parent νƒ€μž…μ΄λ‹€. λ”°λΌμ„œ Parent ν΄λž˜μŠ€λΆ€ν„° μ‹œμž‘ν•΄μ„œ ν•„μš”ν•œ κΈ°λŠ₯을 μ°ΎλŠ”λ‹€. μƒμ†κ΄€κ³„λŠ” λΆ€λͺ¨ λ°©ν–₯으둜 μ°Ύμ•„ 올라갈 μˆ˜λŠ” μžˆμ§€λ§Œ μžμ‹ λ°©ν–₯으둜 μ°Ύμ•„ λ‚΄λ €κ°ˆ μˆ˜λŠ” μ—†λ‹€. = childMethod()λ₯Ό 찾을 수 μ—†μœΌλ―€λ‘œ 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

μžμ‹ 객체의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  μ‹ΆμœΌλ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ? = μΊμŠ€νŒ…(Casting)

λ‹€μš΄μΊμŠ€νŒ…

λΆ€λͺ¨λŠ” μžμ‹μ„ 담을 수 μžˆμ§€λ§Œ μžμ‹μ€ λΆ€λͺ¨λ₯Ό 담을 수 μ—†λ‹€.

  • Parent parent = new Child(); : λΆ€λͺ¨λŠ” μžμ‹μ„ 담을 수 μžˆλ‹€.
  • Parent parent = child; // Child child λ³€μˆ˜ : λΆ€λͺ¨λŠ” μžμ‹μ„ 담을 수 μžˆλ‹€.

  • Child child = poly; // Parent poly λ³€μˆ˜

λΆ€λͺ¨ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” λ³€μˆ˜λ₯Ό μžμ‹ νƒ€μž…μ— λŒ€μž…ν•˜λ €κ³  ν•˜λ©΄ 컴파일 였λ₯˜ λ°œμƒ

μ΄λ•Œ, λ‹€μš΄μΊμŠ€νŒ…μ΄λΌλŠ” κΈ°λŠ₯을 μ‚¬μš©ν•΄μ„œ λΆ€λͺ¨ νƒ€μž…μ„ 잠깐 μžμ‹ νƒ€μž…μœΌλ‘œ λ³€κ²½ν•˜λ©΄ λœλ‹€.

μΊμŠ€νŒ…

  • μ—…μΊμŠ€νŒ…(upcasting) : λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ λ³€κ²½
  • λ‹€μš΄μΊμŠ€νŒ…(downcasting) : μžμ‹ νƒ€μž…μœΌλ‘œ λ³€κ²½

λ‹€μš΄μΊμŠ€νŒ…κ³Ό 주의점

package poly.basic;

// λ‹€μš΄μΊμŠ€νŒ…μ„ μžλ™μœΌλ‘œ ν•˜μ§€ μ•ŠλŠ” 이유
public class CastingMain4 {
    public static void main(String[] args) {
        Parent parent1 = new Child();
        Child child1 = (Child) parent1;
        child1.childMethod(); // 문제 μ—†μŒ

        Parent parent2 = new Parent();
        Child child2 = (Child) parent2; // λŸ°νƒ€μž„ 였λ₯˜ - ClassCastException
        child2.childMethod(); // μ‹€ν–‰ λΆˆκ°€
    }
}

parent2 λŠ” Parent둜 생성이 λ˜μ—ˆλ‹€. λ”°λΌμ„œ λ©”λͺ¨λ¦¬ 상에 Child μžμ²΄κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

μžλ°”μ—μ„œλŠ” μ΄λ ‡κ²Œ μ‚¬μš©ν•  수 μ—†λŠ” νƒ€μž…μœΌλ‘œ λ‹€μš΄μΊμŠ€νŒ…ν•˜λŠ” κ²½μš°μ— ClassCastException μ΄λΌλŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€. μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ λ‹€μŒ λ™μž‘μ΄ μ‹€ν–‰λ˜μ§€ μ•Šκ³ , ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλœλ‹€.

instanceof

  • instanceof : λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λŠ” μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ„ 확인

λ‹€μš΄μΊμŠ€νŒ…μ„ μˆ˜ν–‰ν•˜κΈ° μ „ λ¨Όμ € instanceof λ₯Ό μ‚¬μš©ν•΄μ„œ μ›ν•˜λŠ” νƒ€μž…μœΌλ‘œ 변경이 κ°€λŠ₯ν•œμ§€ 확인

parent instanceof Child // parentλŠ” Parent의 μΈμŠ€ν„΄μŠ€
new Parent() instanceof Child // false

참고둜 instanceof ν‚€μ›Œλ“œλŠ” 였λ₯Έμͺ½ λŒ€μƒμ˜ μžμ‹ νƒ€μž…μ„ μ™Όμͺ½μ—μ„œ μ°Έμ‘°ν•˜λŠ” κ²½μš°μ—λ„ true λ°˜ν™˜

parent instanceof Parent
new Parent() instanceof Parent // parent κ°€ Parent의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” 경우: true
new Child() instanceof Parent // parent κ°€ Child의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” 경우: true

λ‹€ν˜•μ„±κ³Ό λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©


βœ¨Β μ˜€λ²„λΌμ΄λ”© 된 λ©”μ„œλ“œλŠ” 항상 μš°μ„ κΆŒμ„ κ°€μ§„λ‹€.

μ˜€λ²„λΌμ΄λ”©μ€ λΆ€λͺ¨ νƒ€μž…μ—μ„œ μ •μ˜ν•œ κΈ°λŠ₯을 μžμ‹ νƒ€μž…μ—μ„œ μž¬μ •μ˜ν•˜λŠ” 것이닀. λ§Œμ•½ μžμ‹μ—μ„œλ„ μ˜€λ²„λΌμ΄λ”©ν•˜κ³  μ†μžμ—μ„œλ„ 같은 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜λ©΄ μ†μžμ˜ μ˜€λ²„λΌμ΄λ”© λ©”μ„œλ“œκ°€ μš°μ„ κΆŒμ„ κ°€μ§„λ‹€. 더 ν•˜μœ„ μžμ‹μ˜ μ˜€λ²„λΌμ΄λ”© 된 λ©”μ„œλ“œκ°€ μš°μ„ κΆŒμ„ κ°€μ§€λŠ” 것이닀.

package poly.overriding;

public class OverridingMain {
    public static void main(String[] args) {
        // λΆ€λͺ¨ λ³€μˆ˜κ°€ μžμ‹ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°(λ‹€ν˜•μ  μ°Έμ‘°)
        Parent poly = new Child();
        System.out.println("Parent -> Child");
        System.out.println("value = " + poly.value); // λ³€μˆ˜λŠ” μ˜€λ²„λΌμ΄λ”©X
        poly.method(); // λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©!
    }
}
  • λ‹€ν˜•μ„± μ°Έμ‘°: ν•˜λ‚˜μ˜ λ³€μˆ˜ νƒ€μž…μœΌλ‘œ λ‹€μ–‘ν•œ μžμ‹ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” κΈ°λŠ₯
  • λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©: κΈ°μ‘΄ κΈ°λŠ₯을 ν•˜μœ„ νƒ€μž…μ—μ„œ μƒˆλ‘œμš΄ κΈ°λŠ₯으둜 μž¬μ •μ˜

πŸ’­ 5μ£Όμ°¨λ₯Ό μ‹œμž‘ν•˜λ©΄μ„œ 본캠프에 λ“€μ–΄κ°ˆ μ€€λΉ„λ₯Ό ν•˜κ³  μžˆλ‹€. 쑰원듀과 λ‚˜λˆ΄λ˜ 슀λͺ°ν† ν¬μ²˜λŸΌ μ—¬μœ μžˆμ„ λ•Œ 개인적으둜 λΆ€μ‘±ν•œ 점을 μ΅œλŒ€ν•œ μ±„μš°κ³  갈 수 있길 λ°”λž€λ‹€.

profile
μ•ˆλ…•ν•˜μ„Έμš” :)

0개의 λŒ“κΈ€