Skip to content

Latest commit

Β 

History

History
113 lines (87 loc) Β· 6.67 KB

File metadata and controls

113 lines (87 loc) Β· 6.67 KB

Abstract Class, Interface, Generic

Abstract Class

좔상 λ©”μ†Œλ“œλž€ μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”©ν•΄μ•Όλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ†Œλ“œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
좔상 λ©”μ†Œλ“œκ°€ ν¬ν•¨λœ 클래슀λ₯Ό μƒμ†λ°›λŠ” μžμ‹ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄ 쀑볡 λ˜λŠ” 곡톡적인 뢀뢄을 미리 λ§Œλ“€μ–΄μ§„ 것을 μ‚¬μš©ν•˜κ³  μžμ‹ μ—κ²Œ ν•„μš”ν•œ λΆ€λΆ„λ§Œμ„ μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•¨μœΌλ‘œμ¨ 생산성이 ν–₯μƒλ˜κ³  배포 등이 μ‰¬μ›Œμ§€κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
좔상 λ©”μ†Œλ“œλŠ” μ„ μ–ΈλΆ€λ§Œ μ‘΄μž¬ν•˜λ©΄ κ΅¬ν˜„λΆ€λŠ” μž‘μ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
이 μž‘μ„±λ˜μ–΄ μžˆμ§€ μ•Šμ€ κ΅¬ν˜„λΆ€λ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

abstract int fun();

μœ„μ™€ 같이 μ„ μ–ΈλΆ€λ§Œ 있고 κ΅¬ν˜„λΆ€κ°€ μ—†λ‹€λŠ” 의미둜 μ„ μ–ΈλΆ€ 끝에 μ„Έλ―Έμ½œλ‘ (;)을 μΆ”κ°€ν•©λ‹ˆλ‹€.

좔상 ν΄λž˜μŠ€λž€ ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” 클래슀λ₯Ό κ°€λ¦¬μΌœ 좔상 ν΄λž˜μŠ€ν•˜κ³  ν•©λ‹ˆλ‹€.
객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ€‘μš”ν•œ νŠΉμ§•μΈ λ‹€ν˜•μ„±μ„ κ°€μ§€λŠ” λ©”μ†Œλ“œμ˜ 집합을 μ •μ˜ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.
즉 λ°˜λ“œμ‹œ μ‚¬μš©λ˜μ–΄μ•Ό ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό 좔상 ν΄λž˜μŠ€μ— 좔상 λ©”μ†Œλ“œλ‘œ μ„ μ–Έν•΄ λ†“μœΌλ©΄, 이 클래슀λ₯Ό μƒμ†λ°›λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œλŠ” 이 좔상 λ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ μž¬μ •μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
κ΅¬ν˜„μ˜ κ°•μ œλ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

abstract class A {
  ...
  abstract int fun();
  ...
}

μ΄λŸ¬ν•œ 좔상 ν΄λž˜μŠ€λŠ” λ™μž‘μ΄ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šμ€ 좔상 λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆμœΌλ―€λ‘œ, μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μŠ΅λ‹ˆλ‹€.
상속을 톡해 μžμ‹ 클래슀λ₯Ό λ§Œλ“  ν›„, μžμ‹ ν΄λž˜μŠ€μ—μ„œ 좔상 클래슀의 λͺ¨λ“  좔상 λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜κ³  λ‚˜μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 있게 λ©λ‹ˆλ‹€.

abstract class Animal { abstract void cry(); }
class Cat extends Animal { void cry() { System.out.println("λƒμ˜Ήλƒμ˜Ή!"); } }
class Dog extends Animal { void cry() { System.out.println("멍멍!"); } }

public class Polymorphism02 {
    public static void main(String[] args) {
        // Animal a = new Animal(); // 좔상 ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μŒ.
        Cat c = new Cat();
        Dog d = new Dog();

        c.cry();
        d.cry();
    }
}

Interface

μžλ°”μ—μ„œλŠ” λ©”μ†Œλ“œ 좜처의 λͺ¨ν˜Έμ„± λ“±μ˜ 문제둜 인해 클래슀λ₯Ό ν†΅ν•œ 닀쀑 상속이 μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
이λ₯Ό λ³΄μ™„ν•˜κΈ° μœ„ν•΄ μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 것을 톡해 닀쀑 상속을 μ§€μ›ν•©λ‹ˆλ‹€.
μΈν„°νŽ˜μ΄μŠ€λž€ λ‹€λ₯Έ 클래슀λ₯Ό μž‘μ„±ν•  λ•Œ 기본이 λ˜λŠ” 틀을 μ œκ³΅ν•˜λ©΄μ„œ,
λ‹€λ₯Έ 클래슀 μ‚¬μ΄μ˜ 쀑간 맀개 μ—­ν• κΉŒμ§€ λ‹΄λ‹Ήν•˜λŠ” μΌμ’…μ˜ 좔상 클래슀λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

βœ… Abstract Class vs Interface
좔상 ν΄λž˜μŠ€λŠ” 좔상 λ©”μ†Œλ“œλΏλ§Œ μ•„λ‹ˆλΌ μƒμ„±μž, ν•„λ“œ, 일반 λ©”μ†Œλ“œλ„ 포함할 수 μžˆμ§€λ§Œ,
μΈν„°νŽ˜μ΄μŠ€λŠ” 졜고 μˆ˜μ€€μ˜ 좔상화 λ‹¨κ³„λ‘œ, μ˜€λ‘œμ§€ 좔상 λ©”μ†Œλ“œμ™€ μƒμˆ˜λ§Œμ„ 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.
JDK 8λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€μ—μ„œ default method와 static methodλ₯Ό 톡해 κ΅¬ν˜„λΆ€λ„ μž‘μ„±ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Generic

μ œλ„€λ¦­μ΄λž€ λ°μ΄ν„°μ˜ νƒ€μž…μ„ μΌλ°˜ν™”ν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
ν΄λž˜μŠ€λ‚˜ λ©”μ†Œλ“œμ—μ„œ μ‚¬μš©ν•  λ‚΄λΆ€ 데이터 νƒ€μž…μ„ 컴파일 μ‹œμ— 미리 μ§€μ •ν•˜λŠ” λ°©λ²•μœΌλ‘œ, 컴파일 μ‹œ 미리 νƒ€μž… 검사λ₯Ό μˆ˜ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.
이둜써 ν΄λž˜μŠ€λ‚˜ λ©”μ†Œλ“œ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ˜λŠ” 객체의 νƒ€μž… μ•ˆμ •μ„±μ„ 높일 수 있고, λ°˜ν™˜κ°’μ— λŒ€ν•œ νƒ€μž… λ³€ν™˜ 및 νƒ€μž… 검사에 λ“€μ–΄κ°€λŠ” λ…Έλ ₯을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

JDK 1.5μ΄μ „μ—μ„œλŠ” μ—¬λŸ¬ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ ν΄λž˜μŠ€λ‚˜ λ©”μ†Œλ“œμ—μ„œ μΈμˆ˜λ‚˜ λ°˜ν™˜κ°’μœΌλ‘œ Object νƒ€μž…μ„ μ‚¬μš©ν–ˆμœΌλ‚˜, λ°˜ν™˜λœ 객체λ₯Ό λ‹€μ‹œ μ›ν•˜λŠ” νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•΄μ•Ό ν•˜λ©° 이 λ•Œ 였λ₯˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
이λ₯Ό λ³΄μ™„ν•˜κΈ° μœ„ν•΄ JDK 1.5λΆ€ν„° λ„μž…λœ μ œλ„€λ¦­μ„ 톡해 컴파일 μ‹œμ— 미리 νƒ€μž…μ΄ μ •ν•΄μ Έ 번거둜운 μž‘μ—…μ„ μƒλž΅ν•  수 있게 λ©λ‹ˆλ‹€.

μ œλ„€λ¦­ 클래슀의 선언은 λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class MyArray<T> {
    T element;
    void setElement(T element) { this.element = element; }
    T getElement() { return element; }
}

Tλ₯Ό νƒ€μž… λ³€μˆ˜(type variable)라고 ν•˜λ©°, μž„μ˜μ˜ μ°Έμ‘°ν˜• νƒ€μž…μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
μ–΄λ– ν•œ 문자λ₯Ό μ‚¬μš©ν•΄λ„ μƒκ΄€μ—†μœΌλ©°, μ—¬λŸ¬ 개의 νƒ€μž… λ³€μˆ˜λŠ” μ‰Όν‘œ(,)둜 κ΅¬λΆ„ν•˜μ—¬ λͺ…μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
νƒ€μž… λ³€μˆ˜λŠ” ν΄λž˜μŠ€μ—μ„œλΏλ§Œ μ•„λ‹ˆλΌ λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‚˜ λ°˜ν™˜κ°’μœΌλ‘œλ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ œλ„€λ¦­ 클래슀λ₯Ό 생성할 λ•ŒλŠ” λ‹€μŒκ³Ό 같이 νƒ€μž… λ³€μˆ˜ μžλ¦¬μ— μ‹€μ œ μ‚¬μš©ν•  νƒ€μž…μ„ λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.

MyArray<Integer> myArr = new MyArray<Integer>();

μ΄λ ‡κ²Œ μ‹€μ œ μ‚¬μš©ν•  νƒ€μž…μ„ λͺ…μ‹œν•˜λ©΄ λ‚΄λΆ€μ μœΌλ‘œλŠ” μ •μ˜λœ νƒ€μž… λ³€μˆ˜κ°€ λͺ…μ‹œλœ μ‹€μ œ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ˜μ–΄ μ²˜λ¦¬λ©λ‹ˆλ‹€.
νƒ€μž…μ„ λͺ…μ‹œν•  λ•Œ κΈ°λ³Έ νƒ€μž…μ„ λ°”λ‘œ μ‚¬μš©ν•  수 μ—†κ³ , Wrapper Classλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Java SE 7λΆ€ν„° μΈμŠ€ν„΄μŠ€ 생성 μ‹œ νƒ€μž…μ„ μΆ”μ •ν•  수 μžˆλŠ” 경우 νƒ€μž…μ„ μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

MyArray<Integer> myArr = new MyArray<Integer>();

μ œλ„€λ¦­ νƒ€μž…μ€ 컴파일 μ‹œ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μžλ™μœΌλ‘œ κ²€μ‚¬λ˜μ–΄ νƒ€μž… λ³€ν™˜λ©λ‹ˆλ‹€.
이 λ•Œ μ½”λ“œ λ‚΄μ˜ λͺ¨λ“  μ œλ„€λ¦­ νƒ€μž…μ€ μ œκ±°λ˜μ–΄ 컴파일된 클래슀 νŒŒμΌμ—λŠ” μ–΄λ– ν•œ μ œλ„€λ¦­ νƒ€μž…λ„ ν¬ν•¨λ˜μ§€ μ•Šκ²Œ λ©λ‹ˆλ‹€.
μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œμ™€μ˜ ν˜Έν™˜μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ μ΄λ ‡κ²Œ λ™μž‘λ©λ‹ˆλ‹€.

πŸ’‘ Java Generic vs C++ Template
- Templateμ—λŠ” int와 같은 κΈ°λ³Έ νƒ€μž…μ„ 인자둜 λ„˜κΈΈ 수 μžˆμ§€λ§Œ, Genericμ—μ„œλŠ” Integer을 λŒ€μ‹  μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
- Template은 인자둜 주어진 νƒ€μž…μœΌλ‘œλΆ€ν„° 객체λ₯Ό λ§Œλ“€μ–΄ λ‚Ό 수 μžˆμ§€λ§Œ, Genericμ—μ„œλŠ” λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.
- Generic Class둜 λ§Œλ“  λͺ¨λ“  κ°μ²΄λŠ” μ „λΆ€ λ™λ“±ν•œ νƒ€μž…μ΄μ§€λ§Œ, TemplateλŠ” λ‹€λ₯Έ νƒ€μž… 인자 μ‚¬μš© μ‹œ μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ˜ κ°μ²΄μž…λ‹ˆλ‹€.
- Generic은 νƒ€μž… 인자λ₯Ό νŠΉμ •ν•œ νƒ€μž…μ΄ λ˜λ„λ‘ μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- Generic은 정적 λ©”μ„œλ“œλ‚˜ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 데 μ‚¬μš©ν•  수 μ—†μ§€λ§Œ, TemplateλŠ” κ°€λŠ₯ν•©λ‹ˆλ‹€.