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

πŸ“° μ–Έμ–΄/Java

μžλ°”, 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(3)

<Java의 정석 κ°œμ •3판>을 기본으둜 배운 λ‚΄μš©μž…λ‹ˆλ‹€.

 

λͺ©μ°¨

  • 1. λ‹€ν˜•μ„±
  • 2. μΆ”μƒν΄λž˜μŠ€
  • 3. μΈν„°νŽ˜μ΄μŠ€
  • 4. λ‚΄λΆ€ν΄λž˜μŠ€

 

 

1. λ‹€ν˜•μ„± polymorphism

1-1) λ‹€ν˜•μ„±μ΄λž€?

  • ν•˜λ‚˜μ˜ 객체가 μ—¬λŸ¬ 가지 νƒ€μž…μ„ κ°€μ§ˆ 수 μžˆλŠ” 것
  • μžλ°”μ—μ„œλŠ” μ΄λŸ¬ν•œ λ‹€ν˜•μ„±μ„ λΆ€λͺ¨ 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ μžμ‹ 클래슀 νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ„λ‘ ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€.
  • λ‹€ν˜•μ„±μ€ 상속, 좔상화와 λ”λΆˆμ–΄ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬μ„±ν•˜λŠ” μ€‘μš”ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜μ΄λ‹€.

 

1-2) μ°Έμ‘° λ³€μˆ˜μ˜ λ‹€ν˜•μ„±

  • λΆ€λͺ¨ 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ μžμ‹ 클래슀 νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.
  • μ΄λ•Œ μ°Έμ‘° λ³€μˆ˜κ°€ μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ κ°œμˆ˜κ°€ μ‹€μ œ μΈμŠ€ν„΄μŠ€μ˜ 멀버 κ°œμˆ˜λ³΄λ‹€ κ°™κ±°λ‚˜ 적어야 μ°Έμ‘°ν•  수 μžˆλ‹€.
class Parent { ... }
class Child extends Parent { ... }
...
Parent pa = new Parent(); // ν—ˆμš©
Child ch = new Child();   // ν—ˆμš©

Parent pc = new Child();  // ν—ˆμš©
Child cp = new Parent();  // (였λ₯˜ λ°œμƒ)μ°Έμ‘° λ³€μˆ˜κ°€ μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ 개수 > μ‹€μ œ μΈμŠ€ν„΄μŠ€μ˜ 멀버 개수


//같은 νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ“€
Child ch = new Child();
Parent pc = new Child();

 

1-3) μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž… λ³€ν™˜ : μ°Έμ‘°λ³€μˆ˜μ˜ ν˜•λ³€ν™˜μ„ 톡해, μ°Έμ‘°ν•˜κ³  μžˆλŠ” λ©€λ²„μ˜ 개수λ₯Ό μ‘°μ ˆν•  수 μžˆλ‹€.

(λ³€ν™˜ν• νƒ€μž…μ˜ν΄λž˜μŠ€μ΄λ¦„) λ³€ν™˜ν• μ°Έμ‘°λ³€μˆ˜
쑰건

1. μ„œλ‘œ 상속 관계에 μžˆλŠ” 클래슀 μ‚¬μ΄μ—λ§Œ νƒ€μž… λ³€ν™˜μ„ ν•  수 μžˆλ‹€.

2. μžμ‹ 클래슀 νƒ€μž…μ—μ„œ λΆ€λͺ¨ 클래슀 νƒ€μž…μœΌλ‘œμ˜ νƒ€μž… λ³€ν™˜μ€ μƒλž΅ν•  수 μžˆλ‹€.

3. ν•˜μ§€λ§Œ λΆ€λͺ¨ 클래슀 νƒ€μž…μ—μ„œ μžμ‹ 클래슀 νƒ€μž…μœΌλ‘œμ˜ νƒ€μž… λ³€ν™˜μ€ λ°˜λ“œμ‹œ λͺ…μ‹œν•΄μ•Όν•œλ‹€.

 

1-4) instanceof μ—°μ‚°μž

  • μ°Έμ‘° λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜κ³  μžˆλŠ” μΈμŠ€ν„΄μŠ€μ˜ μ‹€μ œ νƒ€μž…μ„ 확인할 수 μžˆλŠ” μ—°μ‚°μž
  • μ™Όμͺ½μ— μ „λ‹¬λœ μ°Έμ‘° λ³€μˆ˜κ°€ μ‹€μ œλ‘œ μ°Έμ‘°ν•˜κ³  μžˆλŠ” μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ΄ 였λ₯Έμͺ½μ— μ „λ‹¬λœ 클래슀 νƒ€μž…μ΄λ©΄ trueλ₯Ό λ°˜ν™˜ν•˜κ³ , μ•„λ‹ˆλ©΄ falseλ₯Ό λ°˜ν™˜ν•œλ‹€. λ§Œμ•½μ— μ°Έμ‘° λ³€μˆ˜κ°€ null을 가리킀고 있으면 falseλ₯Ό λ°˜ν™˜ν•œλ‹€
μ°Έμ‘°λ³€μˆ˜ instanceof ν΄λž˜μŠ€μ΄λ¦„

 


2. μΆ”μƒν΄λž˜μŠ€ abstract method : λ―Έμ™„μ„± 섀계도

2-1) 좔상 λ©”μ„œλ“œ(abstract method)

  • μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”©ν•΄μ•Όλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ†Œλ“œ
  • 좔상 λ©”μ†Œλ“œκ°€ ν¬ν•¨λœ 클래슀λ₯Ό μƒμ†λ°›λŠ” μžμ‹ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
  • 좔상 λ©”μ†Œλ“œλŠ” μ„ μ–ΈλΆ€λ§Œμ΄ μ‘΄μž¬ν•˜λ©°, κ΅¬ν˜„λΆ€λŠ” μž‘μ„±λ˜μ–΄ μžˆμ§€ μ•Šλ‹€. λ°”λ‘œ 이 μž‘μ„±λ˜μ–΄ μžˆμ§€ μ•Šμ€ κ΅¬ν˜„λΆ€λ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이닀.
abstract λ°˜ν™˜νƒ€μž… λ©”μ†Œλ“œμ΄λ¦„();

 

2-2) 좔상 클래슀(abstract class)

  • ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” 클래슀
  • 좔상 ν΄λž˜μŠ€λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ€‘μš”ν•œ νŠΉμ§•μΈ λ‹€ν˜•μ„±μ„ κ°€μ§€λŠ” λ©”μ†Œλ“œμ˜ 집합을 μ •μ˜ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.
  • λ°˜λ“œμ‹œ μ‚¬μš©λ˜μ–΄μ•Ό ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό 좔상 ν΄λž˜μŠ€μ— 좔상 λ©”μ†Œλ“œλ‘œ μ„ μ–Έν•΄ λ†“μœΌλ©΄, 이 클래슀λ₯Ό μƒμ†λ°›λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œλŠ” 이 좔상 λ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ μž¬μ •μ˜ν•΄μ•Όν•œλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” λ™μž‘μ΄ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šμ€ 좔상 λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆμœΌλ―€λ‘œ, μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€. μΆ”μƒν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€λŠ” 상속을 ν†΅ν•΄μ„œ μžμ†ν΄λž˜μŠ€μ— μ˜ν•΄μ„œλ§Œ 생성할 수 μžˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” 좔상 λ©”μ†Œλ“œ(λ―Έμ™„μ„± λ©”μ„œλ“œ)λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€λŠ” 점을 μ œμ™Έν•˜λ©΄, 일반 ν΄λž˜μŠ€μ™€ λͺ¨λ“  점이 κ°™λ‹€.
abstract class ν΄λž˜μŠ€μ΄λ¦„ {
    ...
    abstract λ°˜ν™˜νƒ€μž… λ©”μ†Œλ“œμ΄λ¦„();  //μΆ”μƒλ©”μ„œλ“œ
   
    ...
}

 


3. μΈν„°νŽ˜μ΄μŠ€ interface : 기본섀계도 

3-1) μΈν„°νŽ˜μ΄μŠ€(interface)

  • μžλ°”μ—μ„œλŠ” 클래슀λ₯Ό ν†΅ν•œ 닀쀑 상속은 μ§€μ›ν•˜μ§€ μ•Šμ§€λ§Œ, 닀쀑 μƒμ†μ˜ 이점을 버릴 μˆ˜λŠ” 없기에 μžλ°”μ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 것을 톡해 닀쀑 상속을 μ§€μ›ν•˜κ³  μžˆλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€(interface)λž€ λ‹€λ₯Έ 클래슀λ₯Ό μž‘μ„±ν•  λ•Œ 기본이 λ˜λŠ” 틀을 μ œκ³΅ν•˜λ©΄μ„œ, λ‹€λ₯Έ 클래슀 μ‚¬μ΄μ˜ 쀑간 맀개 μ—­ν• κΉŒμ§€ λ‹΄λ‹Ήν•˜λŠ” μΌμ’…μ˜ 좔상 ν΄λž˜μŠ€μ΄λ‹€.
  • μžλ°”μ—μ„œ 좔상 ν΄λž˜μŠ€λŠ” 좔상 λ©”μ†Œλ“œλΏλ§Œ μ•„λ‹ˆλΌ μƒμ„±μž, ν•„λ“œ, 일반 λ©”μ†Œλ“œλ„ 포함할 수 μžˆλ‹€. ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€λŠ” μ˜€λ‘œμ§€ 좔상 λ©”μ†Œλ“œμ™€ μƒμˆ˜λ§Œμ„ 포함할 수 μžˆλ‹€.

 

3-2) μ„ μ–Έ

  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•  λ•Œμ—λŠ” μ ‘κ·Ό μ œμ–΄μžμ™€ ν•¨κ»˜ interface ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.
  • ν΄λž˜μŠ€μ™€λŠ” 달리 μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  ν•„λ“œλŠ” public static final이어야 ν•˜λ©°, λͺ¨λ“  λ©”μ†Œλ“œλŠ” public abstract이어야 ν•œλ‹€.  이 뢀뢄은 λͺ¨λ“  μΈν„°νŽ˜μ΄μŠ€μ— κ³΅ν†΅μœΌλ‘œ μ μš©λ˜λŠ” λΆ€λΆ„μ΄λ―€λ‘œ 이 μ œμ–΄μžλŠ” μƒλž΅ν•  수 있고, μ΄λ ‡κ²Œ μƒλž΅λœ μ œμ–΄μžλŠ” 컴파일 μ‹œ μžλ™μœΌλ‘œ μΆ”κ°€λœλ‹€.
μ ‘κ·Όμ œμ–΄μž interface μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ {
    public static final νƒ€μž… μƒμˆ˜μ΄λ¦„ = κ°’;
    ...
    public abstract λ©”μ†Œλ“œμ΄λ¦„(λ§€κ°œλ³€μˆ˜λͺ©λ‘);
    ...
}

 

3-3) κ΅¬ν˜„

μΈν„°νŽ˜μ΄μŠ€λŠ” 좔상 ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μžμ‹ μ΄ 직접 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 μˆ˜λŠ” μ—†λ‹€. λ”°λΌμ„œ μΈν„°νŽ˜μ΄μŠ€κ°€ ν¬ν•¨ν•˜κ³  μžˆλŠ” 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄ 쀄 클래슀λ₯Ό μž‘μ„±ν•΄μ•Όν•œλ‹€.

class ν΄λž˜μŠ€μ΄λ¦„ implements μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ { ... }  //κ΅¬ν˜„
class ν΄λž˜μŠ€μ΄λ¦„ implements μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ extend μƒμœ„ν΄λž˜μŠ€μ΄λ¦„ { ... }  //κ΅¬ν˜„+상속

 

λ‹€μŒμ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•œ 닀쀑 μƒμ†μ˜ μ˜ˆμ œμ΄λ‹€.

interface Animal { public abstract void cry(); }
interface Pet { public abstract void play(); }
 
class Cat implements Animal, Pet {
    public void cry() {
        System.out.println("λƒμ˜Ήλƒμ˜Ή!");
    }
    public void play() {
        System.out.println("μ₯ 작기 λ†€μ΄ν•˜μž~!");
    }
}
 
class Dog implements Animal, Pet {
    public void cry() {
        System.out.println("멍멍!");
    }
    public void play() {
        System.out.println("μ‚°μ±…κ°€μž~!");
    }
}
 
public class Polymorphism04 {
    public static void main(String[] args) {
        Cat c = new Cat();
        Dog d = new Dog();
 
        c.cry();
        c.play();
        d.cry();
        d.play();
    }
}

 

3-4) μž₯점

  1. λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈ 개발 μ‹œ μΌκ΄€λ˜κ³  μ •ν˜•ν™”λœ κ°œλ°œμ„ μœ„ν•œ ν‘œμ€€ν™”κ°€ κ°€λŠ₯ν•˜λ‹€.
  2. 클래슀의 μž‘μ„±κ³Ό μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ„ λ™μ‹œμ— 진행할 수 μžˆμœΌλ―€λ‘œ, 개발 μ‹œκ°„μ„ 단좕할 수 μžˆλ‹€.
  3. ν΄λž˜μŠ€μ™€ 클래슀 κ°„μ˜ 관계λ₯Ό μΈν„°νŽ˜μ΄μŠ€λ‘œ μ—°κ²°ν•˜λ©΄, ν΄λž˜μŠ€λ§ˆλ‹€ 독립적인 ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯ν•˜λ‹€.

 


4. λ‚΄λΆ€ν΄λž˜μŠ€ inner class

4-1) λ‚΄λΆ€ 클래슀(inner class) : ν•˜λ‚˜μ˜ 클래슀 내뢀에 μ„ μ–Έλœ 또 λ‹€λ₯Έ 클래슀

class Outer {     // μ™ΈλΆ€ 클래슀
    ...
    class Inner { // λ‚΄λΆ€ 클래슀
        ...
    }
    ...
}
λ‚΄λΆ€ν΄λž˜μŠ€μ˜ μ’…λ₯˜ μ„ μ–Έ μœ„μΉ˜ νŠΉμ§•
instance class μ™ΈλΆ€ 클래슀의 λ©€λ²„λ³€μˆ˜ μ„ μ–Έμœ„μΉ˜ μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λ©€λ²„μ²˜λŸΌ 닀뀄지고, 주둜 그와 κ΄€λ ¨λœ μž‘μ—…μ— μ‚¬μš©λœλ‹€.
static class μ™ΈλΆ€ 클래슀의 λ©€λ²„λ³€μˆ˜ μ„ μ–Έμœ„μΉ˜ μ™ΈλΆ€ 클래슀의 staticλ©€λ²„μ²˜λŸΌ 닀뀄지고, 주둜 그와 κ΄€λ ¨λœ μž‘μ—…μ— μ‚¬μš©λœλ‹€.
local class μ™ΈλΆ€ 클래슀의 λ©”μ„œλ“œλ‚˜ μ΄ˆκΈ°ν™”λΈ”λŸ­ μ•ˆ μ„ μ–Έλœ μ˜μ—­ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©λ  수 μžˆλ‹€.
anonymous class   클래슀의 μ„ μ–Έκ³Ό 객체의 생성을 λ™μ‹œμ— ν•˜λŠ” μ΄λ¦„μ—†λŠ” 클래슀(일회용)

 

4-2) λ‚΄λΆ€ 클래슀의 μž₯점

  1. λ‚΄λΆ€ ν΄λž˜μŠ€μ—μ„œ μ™ΈλΆ€ 클래슀의 멀버에 μ†μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆλ‹€.
  2. μ„œλ‘œ κ΄€λ ¨ μžˆλŠ” 클래슀λ₯Ό λ…Όλ¦¬μ μœΌλ‘œ λ¬Άμ–΄μ„œ ν‘œν˜„ν•¨μœΌλ‘œμ¨, μ½”λ“œμ˜ μΊ‘μŠν™”λ₯Ό μ¦κ°€μ‹œν‚¨λ‹€.
  3. μ™ΈλΆ€μ—μ„œλŠ” λ‚΄λΆ€ ν΄λž˜μŠ€μ— μ ‘κ·Όν•  수 μ—†μœΌλ―€λ‘œ, μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ 쀄일 수 μžˆλ‹€.

 

4-3) 읡λͺ… 클래슀(anonymous class)

  • λ‹€λ₯Έ λ‚΄λΆ€ ν΄λž˜μŠ€μ™€λŠ” 달리 이름을 가지지 μ•ŠλŠ” 클래슀
  • 읡λͺ… ν΄λž˜μŠ€λŠ” 클래슀의 μ„ μ–Έκ³Ό λ™μ‹œμ— 객체λ₯Ό μƒμ„±ν•˜λ―€λ‘œ, 단 ν•˜λ‚˜μ˜ κ°μ²΄λ§Œμ„ μƒμ„±ν•˜λŠ” 일회용 ν΄λž˜μŠ€μ΄λ‹€.
  • μƒμ„±μžλ₯Ό μ„ μ–Έν•  μˆ˜λ„ μ—†κ³ , μ˜€λ‘œμ§€ 단 ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λ‚˜ 단 ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›κ±°λ‚˜ κ΅¬ν˜„ν•  수 μžˆλ‹€.
  • κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” λ©”μ†Œλ“œκ°€ 맀우 적은 클래슀λ₯Ό κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©λœλ‹€.
// 읡λͺ… ν΄λž˜μŠ€λŠ” μ„ μ–Έκ³Ό λ™μ‹œμ— μƒμ„±ν•˜μ—¬ μ°Έμ‘°λ³€μˆ˜μ— λŒ€μž…ν•¨.
ν΄λž˜μŠ€μ΄λ¦„ μ°Έμ‘°λ³€μˆ˜μ΄λ¦„ = new ν΄λž˜μŠ€μ΄λ¦„(){
    // λ©”μ†Œλ“œμ˜ μ„ μ–Έ
};