nyximos.log

[Java] μΈν„°νŽ˜μ΄μŠ€ λ³Έλ¬Έ

Programming/JAVA

[Java] μΈν„°νŽ˜μ΄μŠ€

nyximos 2022. 8. 29. 11:28

πŸ‘©‍πŸš€ λͺ©ν‘œ

μžλ°”μ˜ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•΄ ν•™μŠ΅ν•˜μ„Έμš”.

πŸ‘©‍πŸ’» ν•™μŠ΅ν•  것

  • μΈν„°νŽ˜μ΄μŠ€ μ •μ˜ν•˜λŠ” 방법
  • μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ν•˜λŠ” 방법
  • μΈν„°νŽ˜μ΄μŠ€ 레퍼런슀λ₯Ό 톡해 κ΅¬ν˜„μ²΄λ₯Ό μ‚¬μš©ν•˜λŠ” 방법
  • μΈν„°νŽ˜μ΄μŠ€ 상속
  • μΈν„°νŽ˜μ΄μŠ€μ˜ κΈ°λ³Έ λ©”μ†Œλ“œ (Default Method), μžλ°” 8
  • μΈν„°νŽ˜μ΄μŠ€μ˜ static λ©”μ†Œλ“œ, μžλ°” 8
  • μΈν„°νŽ˜μ΄μŠ€μ˜ private λ©”μ†Œλ“œ, μžλ°” 9

 

 

 

πŸ‘©‍βš–οΈ μΈν„°νŽ˜μ΄μŠ€ μ •μ˜ν•˜λŠ” 방법

μΈν„°νŽ˜μ΄μŠ€

  • μΌμ’…μ˜ 좔상 클래슀
  • 좔상 λ©”μ„œλ“œμ˜ 집합
  • λ©€λ²„λ‘œ 좔상 λ©”μ„œλ“œμ™€ μƒμˆ˜λ§Œ κ°€μ§ˆ 수 μžˆλ‹€.
  • λ‹€λ₯Έ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ”λ° 도움 쀄 λͺ©μ μœΌλ‘œ μž‘μ„±λœλ‹€
  • 좔상 ν΄λž˜μŠ€λ³΄λ‹€ 좔상화 정도가 λ†’λ‹€.
  • Java 8 이전 λ²„μ „μ—μ„œλŠ” 좔상 ν΄λž˜μŠ€μ™€ 달리 λͺΈν†΅μ„ κ°–μΆ˜ 일반 λ©”μ„œλ“œ, 멀버 λ³€μˆ˜λ₯Ό κ΅¬μ„±μ›μœΌλ‘œ κ°€μ§ˆ 수 μ—†λ‹€.
  • μΈν„°νŽ˜μ΄μŠ€λŠ” ν΄λž˜μŠ€μ™€ 달리 Object ν΄λž˜μŠ€μ™€ 같은 졜고 쑰상이 μ—†λ‹€.

 

μΈν„°νŽ˜μ΄μŠ€ μ •μ˜

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

 

μΈν„°νŽ˜μ΄μŠ€ λ©€λ²„λ“€μ˜ μ œμ•½μ‚¬ν•­

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

 

μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점

1. 개발 μ‹œκ°„μ„ λ‹¨μΆ•μ‹œν‚¬ 수 μžˆλ‹€.

λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œλŠ” μ„ μ–ΈλΆ€λ§Œ μ•Œλ©΄ 호좜이 κ°€λŠ₯ν•˜λ‹€.

2. ν‘œμ€€ν™”κ°€ κ°€λŠ₯ν•˜λ‹€.

기본틀을 μΈν„°νŽ˜μ΄μŠ€λ‘œ μž‘μ„±ν•œ λ‹€μŒ,  κ°œλ°œμžλ“€μ—κ²Œ κ΅¬ν˜„ν•˜κ²Œ ν•˜λ©΄ μΌκ΄€λ˜κ³  μ •ν˜•ν™”λœ ν”„λ‘œκ·Έλž¨μ˜ 개발이 κ°€λŠ₯ν•˜λ‹€.

3. μ„œλ‘œ κ΄€κ³„μ—†λŠ” ν΄λž˜μŠ€λ“€μ—κ²Œ 관계λ₯Ό λ§Ίμ–΄ 쀄 수 μžˆλ‹€.

상속 κ΄€κ³„λ‚˜ 같은 쑰상 클래슀λ₯Ό 가지고 μžˆμ§€ μ•Šμ€ μ„œλ‘œ μ•„λ¬΄λŸ° 관계도 μ—†λŠ” ν΄λž˜μŠ€λ“€μ—κ²Œ ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ³΅ν†΅μ μœΌλ‘œ κ΅¬ν˜„ν•¨μœΌλ‘œμ¨ κ΄€κ±”λ₯Ό 맺어쀄 수 μžˆλ‹€.

4. 독립적인 ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯ν•˜λ‹€.

클래슀의 μ„ μ–Έκ³Ό κ΅¬ν˜„μ„ λΆ„λ¦¬μ‹œν‚¬ 수 있기 λ•Œλ¬Έμ— μ‹€μ œ κ΅¬ν˜„μ— 독립적인 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

ν΄λž˜μŠ€μ™€ ν΄λž˜μŠ€κ°„μ˜ 직접적인 관계λ₯Ό μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•΄μ„œ 간접적인 κ΄€κ³„λ‘œ λ³€κ²½ν•˜λ©΄ ν•œ 클래슀의 변경이 λ‹€λ₯Έ ν΄λž˜μŠ€μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ” 독립적인 ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯ν•˜λ‹€.

 

 

 

πŸ‘©‍πŸ”¬ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ν•˜λŠ” 방법

μΈν„°νŽ˜μ΄μŠ€λ„ 좔상 클래슀처럼 κ·Έ μžμ²΄λ‘œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€.

implements ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€.

class 클래슀λͺ… implements μΈν„°νŽ˜μ΄μŠ€λͺ… {
	// μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ μΆ”μƒλ©”μ„œλ“œ λͺ¨λ‘ κ΅¬ν˜„
}

 

만일 μΈν„°νŽ˜μ΄μŠ€ λ©”μ„œλ“œμ€‘ μΌλΆ€λ§Œ κ΅¬ν˜„ ν•œλ‹€λ©΄ abstractλ₯Ό λΆ™μ—¬μ„œ 좔상 클래슀둜 μ„ μ–Έν•΄μ•Ό ν•œλ‹€.

abstract class 클래슀λͺ… implements μΈν„°νŽ˜μ΄μŠ€λͺ… {
	// μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ μΆ”μƒλ©”μ„œλ“œ 일뢀 κ΅¬ν˜„
}

 

상속과 κ΅¬ν˜„μ„ λ™μ‹œμ— ν•  μˆ˜λ„ μžˆλ‹€.

class 클래슀λͺ… extends μƒμœ„ν΄λž˜μŠ€ implements μΈν„°νŽ˜μ΄μŠ€λͺ… {
	// μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ μΆ”μƒλ©”μ„œλ“œ κ΅¬ν˜„
}

 

 

 

πŸ‘©‍🏫 μΈν„°νŽ˜μ΄μŠ€ 레퍼런슀λ₯Ό 톡해 κ΅¬ν˜„μ²΄λ₯Ό μ‚¬μš©ν•˜λŠ” 방법

μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ‘°μƒνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μ°Έμ‘°ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€λŠ” 것을 λ°°μ› λ‹€.

μΈν„°νŽ˜μ΄μŠ€ μ—­μ‹œ 이λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 쑰상이라 ν•  수 μžˆμœΌλ―€λ‘œ

ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ 이λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 있으며

μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜λ„ κ°€λŠ₯ν•˜λ‹€. 

 Cook c = (Cook)new Cooker();
 λ˜λŠ”
 Cook c = new Cooker();

 

μΈν„°νŽ˜μ΄μŠ€λŠ” λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μœΌλ‘œ μ‚¬μš©λ  수 μžˆλ‹€.

void bake(Cook c){

}

 

μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜κ°€ κ°–λŠ” μ˜λ―ΈλŠ”

λ©”μ„œλ“œ ν˜ΈμΆœμ‹œ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ œκ³΅ν•΄μ•Ό ν•œλ‹€λŠ” 것

class Cooker extends Unit implements Cook {
    public void bake(int temperature){  }
    public void fry(Ingredient ingredient){  }
}

 

Cook μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ Cooker ν΄λž˜μŠ€κ°€ μžˆμ„ λ•Œ,

fry λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ Ingredient μΈμŠ€ν„΄μŠ€λ₯Ό λ„˜κ²¨ 쀄 수 μžˆλ‹€.

fry(new Ingredient())와 같이 μ“Έ 수 μžˆλ‹€.

 

λ©”μ„œλ“œμ˜ λ¦¬ν„΄νƒ€μž…μœΌλ‘œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ§€μ •ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.

Ingredient method() {
    Cooker c = new Cooker();
    return c;
}

 

리턴 νƒ€μž…μ΄ μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 것은

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

 

 

 

πŸ‘©‍🌾 μΈν„°νŽ˜μ΄μŠ€ 상속

μΈν„°νŽ˜μ΄μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„°λ§Œ 상속받을 수 있으며,

ν΄λž˜μŠ€μ™€ 달리 닀쀑 상속이 κ°€λŠ₯ν•˜λ‹€. (μ—¬λŸ¬κ°œμ˜ μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„° 상속을 λ°›λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.)

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

interface Attackable {
    void attack(Unit u);
}

interface Fightable extends Movable, Attackable { }

 

클래슀의 상속과 λ§ˆμ°¬κ°€μ§€λ‘œ μžμ† μΈν„°νŽ˜μ΄μŠ€μΈ Fightable은 쑰상 μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ 멀버λ₯Ό λͺ¨λ‘ 상속 λ°›λŠ”λ‹€.

κ·Έλž˜μ„œ Fightable μžμ²΄μ—λŠ” μ •μ˜λœ 멀버가 ν•˜λ‚˜λ„ μ—†μ§€λ§Œ 쑰상 μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„° 상속받은 λ‘κ°œμ˜ 좔상 λ©”μ„œλ“œ move(int x, int y)와 attack(Unit u)λ₯Ό λ©€λ²„λ‘œ κ°–κ²Œ λœλ‹€.

 

 

 

πŸ‘©‍πŸ”§ μΈν„°νŽ˜μ΄μŠ€μ˜ κΈ°λ³Έ λ©”μ†Œλ“œ (Default Method), μžλ°” 8

Defailt Method

  • 좔상 λ©”μ„œλ“œμ˜ 기본적인 κ΅¬ν˜„μ„ μ œκ³΅ν•˜λŠ” λ©”μ†Œλ“œ
  • ν‚€μ›Œλ“œ defaultλ₯Ό μ•žμ— 뢙이며, μΆ”μƒλ©”μ„œλ“œμ™€ 달리 일반 λ©”μ„œλ“œμ²˜λŸΌ λͺΈν†΅ { } 이 μžˆμ–΄μ•Ό ν•œλ‹€.
  • μ ‘κ·Ό μ œμ–΄μžκ°€ public이며 μƒλž΅ κ°€λŠ₯ν•˜λ‹€.
  • 좔상 λ©”μ†Œλ“œκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— λ””ν΄νŠΈ λ©”μ„œλ“œκ°€ μƒˆλ‘œ μΆ”κ°€λ˜μ–΄λ„ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
  • 이λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€λŠ” default methodλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•  수 μžˆλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€κ°€ λ³€κ²½λ˜λ©΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” λͺ¨λ“  ν΄λž˜μŠ€λ“€μ΄ ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•˜μ§€λ§Œ,
    default methodλŠ” μΈν„°νŽ˜μ΄μŠ€μ— λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ—¬ μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•΄μ€€λ‹€.
interface MyInterfacce {
  void method();
  default void newMethod(){
  	// κ΅¬ν˜„
  }
}

 

 

 

πŸ‘©‍🏭 μΈν„°νŽ˜μ΄μŠ€μ˜ static λ©”μ†Œλ“œ, μžλ°” 8

Static λ©”μ†Œλ“œ

  • ν‚€μ›Œλ“œ static을 μ•žμ— 뢙인닀.
  • static λ©”μ†Œλ“œλŠ” default 처럼 μΈν„°νŽ˜μ΄μŠ€μ—μ„œ κ΅¬ν˜„ν•œλ‹€.
  • κ·ΈλŸ¬λ‚˜ κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜κ°€ λΆˆκ°€λŠ₯ν•˜λ‹€.
  • λ°˜λ“œμ‹œ 클래슀λͺ…μœΌλ‘œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.
public interface Vehicle {
    
    // regular / default interface methods
    
    static int getHorsePower(int rpm, int torque) {
        return (rpm * torque) / 5252;
    }
}
Vehicle.getHorsePower(2500, 480));

 

 

 

πŸ‘©‍🎨 μΈν„°νŽ˜μ΄μŠ€μ˜ private λ©”μ†Œλ“œ, μžλ°” 9

private λ©”μ†Œλ“œ

  • default method와 static methodλŠ” public method둜 κ΅¬ν˜„ν•΄μ•Όν•˜λŠ” 뢀뢄이 λΆˆνŽΈν–ˆμ§€λ§Œ
  • Java 9μ—μ„œ μ œκ³΅ν•˜λŠ” private methodλŠ” μ½”λ“œμ˜ 쀑볡을 ν”Όν•˜κ³  μΊ‘μŠν™”λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•΄μ€€λ‹€.
  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€κ°€ ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό μƒμ†ν•˜λŠ” 것을 막아쀀닀.
  • static private methodλŠ” static methodμ—μ„œ 호좜 κ°€λŠ₯ν•˜λ‹€.
  • private λ©”μ„œλ“œλŠ” private, abstract, default λ˜λŠ” static λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  μˆ˜ μžˆλ‹€. private static은 static λ° static private λ©”μ„œλ“œλ§Œ ν˜ΈμΆœ ν•  μˆ˜ μžˆλ‹€.

 

Using private methods in interfaces have four rules :

  1. Private interface method cannot be abstract.
  2. Private method can be used only inside interface.
  3. Private static method can be used inside other static and non-static interface methods.
  4. Private non-static methods cannot be used inside private static methods.

 

ublic interface CustomInterface {
     
    public abstract void method1();
     
    public default void method2() {
        method4();  //private method inside default method
        method5();  //static method inside other non-static method
        System.out.println("default method");
    }
     
    public static void method3() {
        method5(); //static method inside other static method
        System.out.println("static method");
    }
     
    private void method4(){
        System.out.println("private method");
    } 
     
    private static void method5(){
        System.out.println("private static method");
    } 
}
 
public class CustomClass implements CustomInterface {
 
    @Override
    public void method1() {
        System.out.println("abstract method");
    }
     
    public static void main(String[] args){
        CustomInterface instance = new CustomClass();
        instance.method1();
        instance.method2();
        CustomInterface.method3();
    }
}
 
Output:
 
abstract method
private method
private static method
default method
private static method
static method

https://howtodoinjava.com/java9/java9-private-interface-methods/

 

Private Methods in Interface - Java 9

Java 9 onward, you are allowed to include private methods in interfaces. Using private methods, now encapsulation is possible in interfaces as well. In this java 9 tutorial, we will learn about interface private methods in detail. Table of Contents Interfa

howtodoinjava.com

 

 

 

μ°Έμ‘°

8주자 과제: μΈν„°νŽ˜μ΄μŠ€

남ꢁ성, μžλ°”μ˜ 정석 기초편, λ„μš°μΆœνŒ, 2019

 

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

[Java] λ©€ν‹°μ“°λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ°  (0) 2022.09.06
[Java] μ˜ˆμ™Έ 처리  (0) 2022.09.01
[Java] νŒ¨ν‚€μ§€  (0) 2022.08.17
[Java] 상속  (0) 2022.08.12
[Java] 클래슀  (0) 2022.08.05