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

Study/Java

μžλ°”ν”„λ‘œκ·Έλž˜λ° 7μ£Όμ°¨ 정리

μˆ˜μ—…λ‚ μ§œ/μ •λ¦¬λ‚ μ§œ

2022.04.19/2022.04.25

 

ν•™μŠ΅μ£Όμ œ
  • 09 μΈν„°νŽ˜μ΄μŠ€, λžŒλ‹€μ‹, νŒ¨ν‚€μ§€

 

ν•™μŠ΅λ‚΄μš©

09 μΈν„°νŽ˜μ΄μŠ€, λžŒλ‹€μ‹, νŒ¨ν‚€μ§€

Interface

  • μ„œλ‘œ λ‹€λ₯Έ μ •μΉ˜λ“€μ΄ μ—°κ²°λ˜μ–΄ μƒν˜Έ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” 규격
  • μΈν„°νŽ˜μ΄μŠ€κ°€ λ§žμ§€ μ•ŠμœΌλ©΄ μ—°κ²° λΆˆκ°€

β€» 좔상 ν΄λž˜μŠ€λ³΄λ‹€ 더 좔상적인 클래슀 (좔상 ν΄λž˜μŠ€λŠ” 객체 생성 λΆˆκ°€ → μƒμ†μš©)

 

μžλ°” μΈν„°νŽ˜μ΄μŠ€

- 클래슀 μ‚¬μ΄μ˜ μƒν˜Έ μž‘μš©μ˜ 규격

(μ½”λ”©μ˜ λ‹¨μœ„κ°€ ν΄λž˜μŠ€μ΄λ―€λ‘œ ν΄λž˜μŠ€μ™€ 클래슀 μ‚¬μ΄μ˜ μƒν˜Έ μž‘μš©μ˜ κ·œκ²©μ„ λ‚˜νƒ€λ‚Έ 것)

 

μΈν„°νŽ˜μ΄μŠ€μ˜ 예: 슀마트 ν™ˆ μ‹œμŠ€ν…œ

 

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

public interface μΈν„°νŽ˜μ΄μŠ€_이름 {
	λ°˜ν™˜ν˜• μΆ”μƒλ©”μ†Œλ“œ1(...);	// μΈν„°νŽ˜μ΄μŠ€μ—λŠ” λͺΈμ²΄κ°€ μ—†λŠ” 좔상 λ©”μ†Œλ“œλ§Œ μ •μ˜
    λ°˜ν™˜ν˜• μΆ”μƒλ©”μ†Œλ“œ2(...);
    ...
}

// 예
public interface RemoteControl{
	public void turnOn();
    public void turnOff();
}
  • λ©”μ†Œλ“œλ“€μ€ λͺ¨λ‘ 이름과 λ§€κ°œλ³€μˆ˜λ§Œ μ‘΄μž¬ν•˜κ³ , λͺΈμ²΄κ°€ μ—†μœΌλ©° μ„Έλ―Έμ½œλ‘ μœΌλ‘œ μ’…λ£Œλ˜λŠ” 점을 μœ μ˜ν•΄μ•Ό 함
  • μΈν„°νŽ˜μ΄μŠ€ μ•ˆμ˜ λͺ¨λ“  λ©”μ†Œλ“œλŠ” public을 뢙이지 μ•Šμ•„λ„ public 취급됨
더보기
  • C++ → μˆœμˆ˜κ°€μƒν•¨μˆ˜
  • APIμ—μ„œ ν΄λž˜μŠ€λŠ” μ •μž, μΈν„°νŽ˜μ΄μŠ€λŠ” μ΄νƒ€λ¦­μ²΄λ‘œ ꡬ뢄
  • μžλ°”μ—μ„œλŠ” β“˜ μ•„μ΄μ½˜μœΌλ‘œ ꡬ뢄

 

μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„

  • μΈν„°νŽ˜μ΄μŠ€λ§ŒμœΌλ‘œ 객체λ₯Ό 생성할 수 μ—†λ‹€.
  • μΈν„°νŽ˜μ΄μŠ€λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€μ— μ˜ν•˜μ—¬ κ΅¬ν˜„(implement)될 수 μžˆλ‹€.
public class 클래슀_이름 implements μΈν„°νŽ˜μ΄μŠ€_이름 {
	λ°˜ν™˜ν˜• μΆ”μƒλ©”μ†Œλ“œ1(...) {	// μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€λŠ” 좔상 λ©”μ†Œλ“œμ˜ λͺΈμ²΄λ₯Ό κ΅¬ν˜„ν•΄μ•Ό 함
    	...
    }
    λ°˜ν™˜ν˜• μΆ”μƒλ©”μ†Œλ“œ2(...) {
    	...
    }
}
더보기
  • extends → ν™•μž₯ 상속 (λΆ€λͺ¨μ˜ 것을 λ¬Όλ €λ°›κ³  거기에 좔가함)
  • implements → μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„° 상속, μΈν„°νŽ˜μ΄μŠ€κ°€ 클래슀 κ΅¬ν˜„ (κ΅¬ν˜„, μ‹€ν–‰)

 

μΈν„°νŽ˜μ΄μŠ€ VS 좔상 클래슀
- 두 가지 λͺ¨λ‘ 객체화할 수 μ—†κ³ , 주둜 κ΅¬ν˜„μ΄ μ•ˆλœ λ©”μ†Œλ“œλ“€λ‘œ 이루어진닀.
- 좔상 ν΄λž˜μŠ€μ—μ„œλŠ” 일반적인 ν•„λ“œλ„ μ„ μ–Έν•  수 있고, 일반적인 λ©”μ†Œλ“œλ„ μ •μ˜ν•  수 μžˆλ‹€.
- μΈν„°νŽ˜μ΄μŠ€μ—μ„œλŠ” λͺ¨λ“  λ©”μ†Œλ“œλŠ” public, abstractκ°€ λœλ‹€.
- μžλ°”μ—μ„œλŠ” ν•˜λ‚˜μ˜ 클래슀만 상속받을 수 μžˆμ§€λ§Œ, μ—¬λŸ¬κ°œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ™μ‹œμ— κ΅¬ν˜„ν•  수 μžˆλ‹€.

Q. μ–Έμ œ μ‚¬μš©ν•΄μ•Όν•˜μ§€?
좔상 클래슀
- λ§Œμ•½ κ΄€λ ¨λœ ν΄λž˜μŠ€λ“€ μ‚¬μ΄μ—μ„œ μ½”λ“œλ₯Ό κ³΅μœ ν•˜κ³  싢을 λ•Œ
- 곡톡적인 ν•„λ“œλ‚˜ λ©”μ†Œλ“œμ˜ μˆ˜κ°€ λ§Žμ€ 경우, public μ΄μ™Έμ˜ μ ‘κ·Ό μ§€μ •μžλ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” 경우
- 정적이 μ•„λ‹Œ ν•„λ“œλ‚˜ μƒμˆ˜κ°€ μ•„λ‹Œ ν•„λ“œλ₯Ό μ„ μ–Έν•˜κΈ°λ₯Ό 원할 λ•Œ
μΈν„°νŽ˜μ΄μŠ€
- κ΄€λ ¨μ—†λŠ” ν΄λž˜μŠ€λ“€μ΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κΈΈ 원할 λ•Œ (ex. Comparableκ³Ό Cloneableκ³Ό 같은 μΈν„°νŽ˜μ΄μŠ€λŠ” κ΄€λ ¨μ—†λŠ” ν΄λž˜μŠ€λ“€μ΄ κ΅¬ν˜„ν•œλ‹€.)
- νŠΉμ •ν•œ μžλ£Œν˜•μ˜ λ™μž‘μ„ μ§€μ •ν•˜κ³  μ‹Άμ§€λ§Œ λˆ„κ°€ κ΅¬ν˜„ν•˜λ“ μ§€ μ‹ κ²½μ“Έ ν•„μš”κ°€ 없을 λ•Œ
- 닀쀑 상속이 ν•„μš”ν•  λ•Œ

β€» μΈν„°νŽ˜μ΄μŠ€λŠ” ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλ―€λ‘œ new μ—°μ‚°μžλŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

RemoteControl obj = new RemoteControl();    // 였λ₯˜

 

μΈν„°νŽ˜μ΄μŠ€μ™€ νƒ€μž…

  • μΈν„°νŽ˜μ΄μŠ€λ„ ν•˜λ‚˜μ˜ μžλ£Œν˜•μ΄λ‹€.
RemoteControl obj = new Television();	// μΈν„°νŽ˜μ΄μŠ€ μ°Έμ‘° λ³€μˆ˜ μ„ μ–Έ
obj.turnOn();
obj.turnOff();
  • Television 객체λ₯Ό μƒμ„±ν–ˆμ§€λ§Œ, RemoteControl μ°Έμ‘° λ³€μˆ˜λ‘œ 가리킀고 μžˆλ‹€. μΈν„°νŽ˜μ΄μŠ€ μ°Έμ‘° λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œ κ·Έ μΈν„°νŽ˜μ΄μŠ€ μ•ˆμ— μ •μ˜λœ λ©”μ†Œλ“œλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€. λ‹€λ₯Έ λ©”μ†Œλ“œλ‚˜ ν•„λ“œμ—λŠ” μ ‘κ·Όν•  수 μ—†λ‹€.

 

LAB: 타이머 이벀트 처리

  • μ–΄λ–€ 이벀트 처리λ₯Ό μœ„ν•œ 곡톡 규격이 ν•„μš”ν•˜λ‹€.
  • ActionListener μΈν„°νŽ˜μ΄μŠ€λŠ” μ•‘μ…˜ 이벀트 처리λ₯Ό μœ„ν•œ κ·œκ²©μ΄λ‹€.
public interface ActionListener{
	void actionPerformed(ActionEvent event);
}
더보기

- ActionListener → κ·€κΈ°μšΈμ—¬ λ“£κ³  μžˆμ–΄!(κ°μ‹œμž λŠλ‚Œ → 이벀트 작음)

- Timer 이벀트 μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©

- Time클래슀 → 주어진 μ‹œκ°„μ΄ 되면 이벀트 λ°œμƒ, actionPerformed() λ©”μ†Œλ“œ 호좜

 

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

  • μΈν„°νŽ˜μ΄μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.
public interface AdvancedRemoteControl extends RemoteControl{
	public void volumeUp();
    public void volumeDown();
}
λΆ€λͺ¨ class λΆ€λͺ¨ interface λΆ€λͺ¨ interface
extends implements extends (κ΅¬ν˜„ λΆˆκ°€, ν™•μž₯)
μžμ‹ class μžμ‹ class μžμ‹ interface (bodyμ—†μŒ)

 

닀쀑 상속

  • ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ 개의 λΆ€λͺ¨ 클래슀λ₯Ό κ°€μ§€λŠ” 것
  • μžλ°”μ—μ„œλŠ” 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. (→ extends와 implements 같이 μ‚¬μš© κ°€λŠ₯)
class Shpae{protected int x, y;}

interface Drawable{void draw();}

public class Rectangle extends Shape implements Drawable{
	int width, height;
    public void draw(){
    	System.out.println("Rectangle Draw");
    }
}

 

μƒμˆ˜ μ •μ˜

  • μΈν„°νŽ˜μ΄μŠ€λŠ” μƒμˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€μ˜ λ³€μˆ˜λŠ” μžλ™μœΌλ‘œ public static final(μ •μ μƒμˆ˜)둜 μ²˜λ¦¬λœλ‹€.
public interface MyConstants{
    int NORTH = 1;
    int EAST = 2;
    int SOUTH = 3;
    int WEST = 4;
}

// MyContants.EAST와 같이 μƒμˆ˜ μ°Έμ‘°ν•  수 μžˆλ‹€.
// λ§Œμ•½ ν΄λž˜μŠ€κ°€ MYContantsμΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€λ©΄ λ‹¨μˆœνžˆ EAST만 써도 λœλ‹€.

 

μƒμˆ˜ 곡유

interface Date{
	public static final int SUNDAY=1, MONDAY=2, TUESDAY=3, WEDNESDAY=4, THURSDAY=5, FRIDAY=6, SATURDAY=7;
}
    
public class DayTest implements Days{		// μƒμˆ˜λ₯Ό κ³΅μœ ν•˜λ €λ©΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€.
	public static void main(String[] args){
    	System.out.println("μΌμš”μΌ: " + SUNDAY);
    }
}

 

λ””ν΄νŠΈ λ©”μ†Œλ“œ

  • μΈν„°νŽ˜μ΄μŠ€ λ©”μ†Œλ“œμ˜ λ””ν΄λ“œ κ΅¬ν˜„ μ œκ³΅ν•  수 μžˆλŠ” κΈ°λŠ₯ (JDK8λΆ€ν„° μ‚¬μš© κ°€λŠ₯)
  • μ˜ˆμ•½μ–΄ defaultλ₯Ό μ‚¬μš©ν•œλ‹€.
  • λ””ν΄νŠΈ λ©”μ†Œλ“œκ°€ μ •μ˜λ˜μ–΄ 있으면 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€κ°€ λ©”μ†Œλ“œμ˜ λͺΈμ²΄λ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.
interface MyInterface{
	public void myMethod1();	// λ³΄ν†΅μ˜ μΆ”μƒλ©”μ†Œλ“œ
    default void myMethod2(){System.out.println("myMethod2()");}	// λ””ν΄νŠΈ λ©”μ†Œλ“œ. λ©”μ†Œλ“œμ˜ λͺΈμ²΄λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€.
}

public class DefaultMethodTest implements MyInterface{
	public void myMethod1(){System.out.println("myMethod()");}
    public static void main(String[] args){
    	DefaultMethodTest obj = new DefaultMethodTest();
        obj.Method1();
        obj.Method2();	// λ””ν΄νŠΈ λ©”μ†Œλ“œλŠ” κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
    }
}

 

정적 λ©”μ†Œλ“œ

  • μΈν„°νŽ˜μ΄μŠ€μ—λ„ 정적 λ©”μ†Œλ“œ μ •μ˜κ°€ κ°€λŠ₯ν•˜λ‹€. (JDK 8λΆ€ν„° μ‚¬μš© κ°€λŠ₯)
  • λ©”μ†Œλ“œ 이름 μ•žμ— static ν‚€μ›Œλ“œλ₯Ό 뢙이면 λœλ‹€.
interface MyInterface{
    static void print(String msg){	// μΈν„°νŽ˜μ΄μŠ€μ˜ 정적 λ©”μ†Œλ“œ
    	System.out.println(msg + ": μΈν„°νŽ˜μ΄μŠ€μ˜ 정적 λ©”μ†Œλ“œ 호좜");
    }
}

public class StaticMethodTest{
    public static void main(String[] args){
    	MyInterface.print("Java 8");	// 직접 호좜
    }
}

 

무λͺ… 클래슀

  • 클래슀 λͺΈμ²΄λŠ” μ •μ˜λ˜μ§€λ§Œ 이름이 μ—†λŠ” 클래슀 (상속 λ˜λŠ” κ΅¬ν˜„μœΌλ‘œ)
  • 클래슀 μ •μ˜μ™€ λ™μ‹œμ— 객체 생성
  • 이름이 μ—†κΈ° λ•Œλ¬Έμ— ν•œλ²ˆλ§Œ μ‚¬μš© κ°€λŠ₯
// 이름이 μžˆλŠ” 경우
class TV implements RemotControl{
	...
}
TV obj = new TV();

// 무λͺ… 클래슀의 경우
RemoteControl obj = new RemoteControl(){ ... };

// 무λͺ… 클래슀 ν˜•μ‹
new λΆ€λͺ¨ν΄λž˜μŠ€μ΄λ¦„()	// μƒμ†λ°›κ³ μž ν•˜λŠ” λΆ€λͺ¨ 클래슀의 이름 or κ΅¬ν˜„ν•˜κ³ μž ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ 이름
{
	...	// 클래슀 λͺΈμ²΄
}

 

λžŒλ‹€μ‹(lambda expression)

  • λ‹€λ₯Έ 곳에 전달될 수 μžˆλŠ” μ½”λ“œ 블둝 (λ‚˜μ€‘μ— 싀행될 λͺ©μ μœΌλ‘œ λ‹€λ₯Έ 곳에 전달될 수 μžˆλŠ” ν•¨μˆ˜)
  • 이름이 μ—†λŠ” λ©”μ†Œλ“œλΌκ³  ν•  수 있음
  • λžŒλ‹€μ‹μ„ μ‚¬μš©ν•˜λŠ” 이유: 간결함 → λžŒλ‹€μ‹ μ΄μš©ν•˜λ©΄ λ©”μ†Œλ“œκ°€ ν•„μš”ν•œ 곳에 κ°„λ‹¨νžˆ λ©”μ†Œλ“œ 보낼 수 있음
  • 즉, λ©”μ†Œλ“œκ°€ λ…λ¦½λœ λ‹¨μœ„λ‘œ 취급될 수 있음
  • class 없이 λ©”μ†Œλ“œ λ§Œλ“€ 수 있음
  • λžŒλ‹€μ‹μ€ ( ) -> { } ꡬ문을 μ‚¬μš©ν•˜μ—¬ μž‘μ„± ( ):argument, λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜ 리슀트 / { }:body
  • -> : λžŒλ‹€ μ—°μ‚°μž
() -> System.out.println("Hello World");
(String s) -> {System.out.println(s);}
() -> 69
() -> {return 3.141592;}

 

λžŒλ‹€μ‹μ˜ ν•„μš”μ„±

- 이벀트 처리 μ½”λ“œ μž‘μ„± 방법

1. 이벀트 처리 κ·œμΉ™ μΈν„°νŽ˜μ΄μŠ€λ₯Ό,

   1) 클래슀둜 μ •μ˜(implements) ν•˜κ³ ,

   2) κ΅¬ν˜„λœ ν΄λž˜μŠ€μ—μ„œ 객체λ₯Ό μƒμ„±ν•œ ν›„,

   3) 이벀트 처리 μ½”λ“œλ‘œ 등둝

2. 이벀트 처리 κ·œμΉ™ μΈν„°νŽ˜μ΄μŠ€λ₯Ό,

   1) 무λͺ… 클래슀둜 μ •μ˜ν•˜κ³ ,

   2) 이벀트 처리 μ½”λ“œ 등둝

3. 이벀트 처리 κ·œμΉ™ μΈν„°νŽ˜μ΄μŠ€λ₯Ό,

   1) λžŒλ‹€μ‹μœΌλ‘œ 이벀트 처리 μ½”λ“œ 등둝

 

ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€μ™€ λžŒλ‹€μ‹

  • ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€: ν•˜λ‚˜μ˜ 좔상 λ©”μ†Œλ“œλ§Œ μ„ μ–Έλœ μΈν„°νŽ˜μ΄μŠ€ → 예) java.lang.Runnable
  • λžŒλ‹€μ‹μ„ ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€μž… κ°€λŠ₯, λ§€κ°œλ³€μˆ˜λ‘œ 전달가λŠ₯ → 예) Runnable r = () -> System.out.println(" ");

 

νŒ¨ν‚€μ§€

  • μ„œλ‘œ κ΄€λ ¨ μžˆλŠ” ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€λ“€μ˜ 묢음

 

νŒ¨ν‚€μ§€ μ •μ˜

package νŒ¨ν‚€μ§€μ΄λ¦„;

// 예
package library;

 

νŒ¨ν‚€μ§€ μ‚¬μš©

1. κ²½λ‘œκΉŒμ§€ ν¬ν•¨ν•˜λŠ” μ™„μ „ν•œ μ΄λ¦„μœΌλ‘œ μ°Έμ‘°

   μ˜ˆ) library.Rectangle myRect = new library.Rectangle();

2. μ›ν•˜λŠ” νŒ¨ν‚€μ§€ λ©€λ²„λ§Œ import (→μ΄ν΄λ¦½μŠ€κ°€ μžλ™μœΌλ‘œ ν•΄μ€Œ...)

   μ˜ˆ) import library.Rectangle;

3. νŒ¨ν‚€μ§€ 전체λ₯Ό import (단점: 쓰지 μ•ŠλŠ” νŒ¨ν‚€μ§€κΉŒμ§€ λΆˆλŸ¬μ™€ 파일이 컀짐)

   μ˜ˆ) import library.*;

 

 


ν•™μŠ΅λ‚΄μš© 이해도

85% 정도. μ΄λ²ˆμ— μ’€ μ–΄λ ΅λ‹€.

 

ν•™μŠ΅ν™œλ™ λŒμ•„λ³΄κΈ°

μ΄λ²ˆμ— 배운 λ‚΄μš©μ€ κ·Έ μ „ λ‚΄μš©λ“€λ³΄λ‹€ 더 μ–΄λ ΅λ‹€κ³  λŠκ»΄μ‘Œλ‹€. μƒˆλ‘œμš΄ κ°œλ…μΈ μΈν„°νŽ˜μ΄μŠ€μ™€ λžŒλ‹€μ‹μ„ λ°°μ›Œμ„œ κ·ΈλŸ°λ“―ν•˜λ‹€. 많이 보고 μ˜ˆμ œλ„ 보고 ν•΄μ•Όκ² λ‹€.

 

λ‹€μŒ ν•™μŠ΅κ³„νš

이벀트 처리1