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

πŸ“› μΆ”μƒν΄λž˜μŠ€

λ―Έμ™„μ„± λ©”μ„œλ“œ(좔상 λ©”μ„œλ“œ)λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” 클래슀. (일반 λ©”μ„œλ“œ λ˜λŠ” λ©€λ²„λ³€μˆ˜ 포함 κ°€λŠ₯)
클래슀 μ•žμ— abstract λΌλŠ” ν‚€μ›Œλ“œλ§Œ 뢙이면 λœλ‹€.

 

🚨 μΈμŠ€ν„΄μŠ€(ν΄λž˜μŠ€λ‘œλΆ€ν„° λ§Œλ“€μ–΄μ§„ 객체)λ₯Ό 생성할 수 μ—†λ‹€.
🚨 상속을 ν†΅ν•΄μ„œ μžμ† ν΄λž˜μŠ€μ— μ˜ν•΄μ„œλ§Œ 완성될 수 μžˆλ‹€.

abstract class 클래슀 이름 {
    ...
}

πŸ“› μΆ”μƒλ©”μ„œλ“œ

μ•žμ— abstract ν‚€μ›Œλ“œκ°€ λΆ™κ³ , κ΅¬ν˜„λΆ€(μ€‘κ΄„ν˜Έ{} 둜 감싸져 μžˆλŠ” λΆ€λΆ„)λ₯Ό μ—†μ•€ λ©”μ„œλ“œ

abstract λ¦¬ν„΄νƒ€μž… λ©”μ„œλ“œμ΄λ¦„();

κ΅¬ν˜„λΆ€λŠ” 상속을 톡해 완성될 수 μžˆλ‹€.

abstract class Player { // 좔상 클래슀
    abstract void play(int pos); // 좔상 λ©”μ„œλ“œ
    abstract void stop(); // 좔상 λ©”μ„œλ“œ
}

class AudioPlayer extends Player {
    void play(int pos) { ... }; // 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„
    void stop { ... }; // 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„
}

abstract class AbstractPlayer extends Player {
    void play(int pos) { ... } // 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„
}

πŸ“› μΈν„°νŽ˜μ΄μŠ€

μΌμ’…μ˜ μΆ”μƒν΄λž˜μŠ€.
였직! μΆ”μƒλ©”μ„œλ“œμ™€ μƒμˆ˜(λ³€ν•˜μ§€ μ•ŠλŠ” κ°’)λ§Œμ„ λ©€λ²„λ‘œ κ°€μ§ˆ 수 μžˆλ‹€.

interface μΈν„°νŽ˜μ΄μŠ€ 이름 {
    public static final νƒ€μž… μƒμˆ˜μ΄λ¦„ = κ°’;
    public abstract λ©”μ„œλ“œμ΄λ¦„(λ§€κ°œλ³€μˆ˜λͺ©λ‘);
}

🚨 λͺ¨λ“  멀버 λ³€μˆ˜λŠ” public static final μ΄μ–΄μ•Όν•˜λ©°, 이λ₯Ό μƒλž΅ν•  수 μžˆλ‹€.
🚨 λͺ¨λ“  λ©”μ„œλ“œλŠ” public abstract μ΄μ–΄μ•Όν•˜λ©°, 이λ₯Ό μƒλž΅ν•  수 μžˆλ‹€.
(μƒλž΅λœ μ œμ–΄μžλŠ” 컴파일 μ‹œμ— μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μΆ”κ°€ν•΄μ€€λ‹€.)

πŸ“› μΈν„°νŽ˜μ΄μŠ€μ˜ 상속

μΈν„°νŽ˜μ΄μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„°λ§Œ 상속받을 수 μžˆλ‹€.
ν΄λž˜μŠ€μ™€ 달리, 닀쀑 상속 κ°€λŠ₯. (ν•˜μ§€λ§Œ, μžλ°”μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ‘œ 닀쀑 상속을 κ΅¬ν˜„ν•˜λŠ” κ²½μš°λŠ” 거의 μ—†λ‹€.)

interface Movable {
    void move(int x, int y);
}

interface Attackable {
    void attack(Unit u);
}

interface Fightable extends Movable, Attackable { ... }

πŸ“› μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„

implements ('κ΅¬ν˜„ν•˜λ‹€'λΌλŠ” 뜻) ν‚€μ›Œλ“œλ‘œ μΈν„°νŽ˜μ΄μŠ€ λ‚΄λΆ€μ˜ μΆ”μƒλ©”μ„œλ“œλ₯Ό μ™„μ„±ν•΄ 쀄 수 μžˆλ‹€.

class 클래슀 이름 implements μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ {
    // μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λ„λ‹ˆ μΆ”μƒλ©”μ„œλ“œ κ΅¬ν˜„
}

class Fighter implements Fightable {
    pulic void move(int x, int y) { ... }
    public void attack(Unit u) { ... }
}

🚨 μΌλΆ€μ˜ μΆ”μƒλ©”μ„œλ“œλ§Œ μ™„μ„±ν•΄ μ£Όκ³  μ‹Άλ‹€λ©΄ abstract λ₯Ό λΆ™μ—¬μ„œ μΆ”μƒν΄λž˜μŠ€ 둜 μ„ μ–Έν•΄μ€˜μ•Όν•œλ‹€.

abstract class Fighter implements Fightable {
    public void move(int x, int y) { ... }
}

🚨 상속(extends)κ³Ό κ΅¬ν˜„(implements)은 λ™μ‹œμ— μ‚¬μš©ν•  수 μžˆλ‹€.

class Fighter extends Unit implements Fightable {
    public void move(int x, int y) { ... }
    public void attack(Unit u) { ... }
}

πŸ“› μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점

  • 개발 μ‹œκ°„μ„ 단좕 μ‹œν‚¬ 수 μžˆλ‹€.
  • ν‘œμ€€ν™”κ°€ κ°€λŠ₯ν•˜λ‹€.
  • μ„œλ‘œ 관계 μ—†λŠ” ν΄λž˜μŠ€λ“€μ—κ²Œ 관계λ₯Ό 맺어쀄 수 μžˆλ‹€.
  • 독립적인 ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯ν•˜λ‹€.

πŸ“› λ‹€ν˜•μ„±

μ—¬λŸ¬κ°€μ§€ ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆλŠ” λŠ₯λ ₯.
쑰상 클래슀 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ†ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것.

class Tv { // 쑰상 클래슀
    boolean power;
    int channeel;

    void power() { power = !power; }
    void channelUp { ++channel; }
    void channelDown { --channel; }
}

class CaptionTv extends Tv { // μžμ‹ 클래슀
    String text;
    void caption() { ... }
}  

Tv t = new CaptionTv(); // 쑰상 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ† μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°

μ°Έμ‘°λ³€μˆ˜ t의 νƒ€μž…μ΄ 쑰상(Tv)이기 λ•Œλ¬Έμ— μ‹€μ œ μΈμŠ€ν„΄μŠ€κ°€ CaptionTv 라 할지라도,
μ°Έμ‘°λ³€μˆ˜ t λ‘œλŠ” CaptionTv μΈμŠ€ν„΄μŠ€μ˜ λͺ¨λ“  멀버λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.

Tv 클래슀의 λ©€λ²„λ“€λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

λ•Œλ¬Έμ— μ°Έμ‘°λ³€μˆ˜κ°€ μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ κ°œμˆ˜λŠ” μΈμŠ€ν„΄μŠ€μ˜ 멀버 κ°œμˆ˜λ³΄λ‹€ κ°™κ±°λ‚˜ 적닀.

πŸ“› μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•œ λ‹€ν˜•μ„±

μΈν„°νŽ˜μ΄μŠ€λŠ” μ–΄λ–€ 클래슀λ₯Ό κ΅¬ν˜„(implements) ν•˜λ©΄μ„œ 완성될 수 μžˆλ‹€κ³  ν–ˆλ‹€.
즉, κ΅¬ν˜„ν•œ 클래슀의 쑰상이라할 수 μžˆλŠ” μ…ˆμ΄λ‹€.

λ•Œλ¬Έμ— μ•žμ„œ μ„€λͺ…ν•œ λ‹€ν˜•μ„±μ˜ νŠΉμ§•μ΄ μΈν„°νŽ˜μ΄μŠ€μ—μ„œλ„ μ μš©λœλ‹€.

 

μΈν„°νŽ˜μ΄μŠ€ Fightable을 클래슀 Fighterκ°€ κ΅¬ν˜„ν–ˆμ„ λ•Œ,
μ•„λž˜μ™€ 같이 μ°Έμ‘°λ³€μˆ˜(f)의 νƒ€μž…μ„ 쑰상(Fightable)으둜 μ •μ˜ν•΄ 쀄 수 μžˆλ‹€.

Fightable f = new Fighter();

πŸš¨λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄ μΈν„°νŽ˜μ΄μŠ€μΈ 경우🚨

void attack(Fightable f) {
    ...
}

Fightable μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜ f κ°€ κ°–λŠ” μ˜λ―ΈλŠ”
λ©”μ„œλ“œ 호좜 μ‹œ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ œκ³΅ν•΄μ•Όν•œλ‹€λŠ” 것이닀.

λ”°λΌμ„œ attack λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” λ§€κ°œλ³€μˆ˜λ‘œ Fightable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ„˜κ²¨μ£Όμ–΄μ•Ό ν•œλ‹€.

attac(new Fighter());

πŸš¨λ¦¬ν„΄νƒ€μž…μ΄ μΈν„°νŽ˜μ΄μŠ€μΈ 경우🚨

Fightable method() {
    Fighter f = new Fighter();
    return f;
}

λ©”μ„œλ“œκ°€ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•΄μ•Όν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

'JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

JDBCλž€?  (1) 2023.10.29

Seize the day!

Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | μžκΈ°κ³„λ°œ | 미라클 λͺ¨λ‹ | 일상