JAVA의 정석 (ch 7) (4)

Du-Hyeon, KimΒ·2023λ…„ 8μ›” 12일
0

JAVA

λͺ©λ‘ 보기
11/11
post-thumbnail

πŸ’» OOPs - 3

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

  • μΌμ’…μ˜ μΆ”μƒν΄λž˜μŠ€
  • 좔상화 정도가 λ†’μŒ -> λͺΈν†΅μ„ κ°–μΆ˜ 일반 λ©”μ„œλ“œ or λ©€λ²„λ³€μˆ˜λ₯Ό κ΅¬μ„±μ›μœΌλ‘œ κ°€μ§ˆ 수 μ—†μŒ
  • 좔상 클래슀
    λΆ€λΆ„μ μœΌλ‘œ μ™„μ„±λœ 'λ―Έμ™„μ„± 섀계도'
  • μΈν„°νŽ˜μ΄μŠ€
    아무것도 μ—†κ³  λ°‘κ·Έλ¦Όλ§Œ μžˆλŠ” 'κΈ°λ³Έ 섀계도'

μž‘μ„±λ²•

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

μ œμ•½μ‚¬ν•­

  • λͺ¨λ“  λ©€λ²„λ³€μˆ˜λŠ” public static final 이어야 ν•˜λ©°, 이λ₯Ό μƒλž΅ν•  수 μžˆλ‹€.
  • λͺ¨λ“  λ©”μ„œλ“œλŠ” public abstract 이어야 ν•˜λ©°, 이λ₯Ό μƒλž΅ν•  수 μžˆλ‹€.
    (단, static λ©”μ„œλ“œμ™€ λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” μ˜ˆμ™Έ(JDK 1.8)λΆ€ν„°

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

  • μΈν„°νŽ˜μ΄μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„°λ§Œ 상속받을 수 있음
  • μΈν„°νŽ˜μ΄μŠ€λŠ” class와 달리 졜고 쑰상 objectκ°€ μ—†μŒ
  • μ—¬λŸ¬κ°œμ˜ μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„° 상속받을 수 μžˆλ‹€.
interface Movable{
	void move(int x, int y);
}

interface Attackable {
	void attack(Unit u);
}

interface Fightable extends Movable, Attackable{}

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

  • μΈν„°νŽ˜μ΄μŠ€ μžμ²΄λ‘œλŠ” instance 생성 λΆˆκ°€
  • μΆ”μƒν΄λž˜μŠ€λ‘œμ˜ 상속을 ν†΅ν•΄μ„œ μ™„μ„±
  • μΈν„°νŽ˜μ΄μŠ€ -> 클래슀 의 상속은 implementsλ₯Ό μƒμš”ν•¨

μž‘μ„±λ°©λ²•

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

class Fighter implements Fightable{
	public void move(int x, int y) { /* κ΅¬ν˜„λΆ€ */}
	public void attack(Unit u) { /* κ΅¬ν˜„λΆ€ */}
}

μ΄λ•Œ, λ§Œμ•½ μΈν„°νŽ˜μ΄μŠ€μ˜ 일뢀 λ©”μ„œλ“œλ§Œ μ™„μ„±ν–ˆλ‹€λ©΄
implement받은 ν΄λž˜μŠ€λŠ” abstract둜 μ •μ˜ν•΄μ•Όν•œλ‹€.


4. μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•œ λ‹€ν˜•μ„±

(리뷰) λ‹€ν˜•μ„± : 상속 받은 μžμ†μ€ μ‘°μƒμ˜ λͺ¨λ“  λ©”μ„œλ“œ λ°‘ λ©€λ²„λ³€μˆ˜λ₯Ό 가지고 있기 λ•Œλ¬Έμ—, λ‚˜μ€‘μ— μ°Έμ‘°ν•  λ•Œ 쑰상 클래슀의 ν˜•μ‹μœΌλ‘œ 선언해도 λœλ‹€.

μ˜ˆμ‹œ
class : Fighter
interface : Fightable

Fighter implemetns Fightable인 μƒν™©μ—μ„œ

μ˜ˆμ‹œ1 (Fighter μΈμŠ€ν„°μŠ€λ₯Ό Fighteable 인퍼페이슀 μ°Έμ‘°ν˜•μœΌλ‘œ μ°Έμ‘° κ°€λŠ₯)

Fightable f = new Fighter();
Fightable f = (Fightable)new Fighter();

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

void attack(Fightabel f){
	//...
}

μ˜ˆμ‹œ3 (μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ„ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ œκ³΅ν•  경우, κ·Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ™„μ„±ν•œ 클래슀의 μ°Έμ‘°λ³€μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ œκ³΅ν•΄μ•Όν•œλ‹€)

class Fighter extends Unit implements Fightable{
	public void move(int x, int y){ /*κ΅¬ν˜„λΆ€*/ }
	public void attack(Fightable f){ /*κ΅¬ν˜„λΆ€*/ }
}

μ˜ˆμ‹œ4 (λ¦¬ν„΄νƒ€μž…μ— μΈν„°νŽ˜μ΄μŠ€ν˜•μ„ μ‚¬μš©ν•˜λŠ” 것도 κ°€λŠ₯)

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

예제4 초 κ°•μ‘° λΆ€λΆ„

λ¦¬ν„΄νƒ€μž…μ΄ μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 것은 λ©”μ„œλ“œκ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. 이 λ¬Έμž₯은 μ™ΈμšΈ λ•ŒκΉŒμ§€ λ°˜λ³΅ν•΄μ„œ 읽어야 ν•œλ‹€.


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

  1. κ°œλ°œμ‹œκ°„μ„ λ‹¨μΆ•μ‹œν‚¬ 수 μžˆλ‹€.
    μΈν„°νŽ˜μ΄μŠ€λ‘œ μ„ μ–ΈλΆ€λ§Œ μž‘μ„±ν•΄λ‘λ©΄, κ·Έ κΈ°λŠ₯의 κ΅¬ν˜„μ„ λ‹΄λ‹Ήν•˜λŠ” λΆ€μ„œμ™€ κ·Έ κΈ°λŠ₯을 ν™œμš©ν•˜λŠ” λΆ€μ„œκ°„μ— λ™μ‹œκ°œλ°œμ§„ν–‰μ΄ κ°€λŠ₯ν•˜λ‹€.
    ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œ 자유둭게 μž‘μ„±κ°€λŠ₯
  1. ν‘œμ€€ν™”κ°€ κ°€λŠ₯ν•˜λ‹€.
    ν”„λ‘œμ νŠΈμ— μ‚¬μš©λ˜λŠ” κΈ°λ³Έ 틀을 μΈν„°νŽ˜μ΄μŠ€λ‘œ μž‘μ„±ν•œ λ‹€μŒ, κ°œλ°œμžλ“€μ—κ²Œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ„λ‘ ν•¨μœΌλ‘œμ¨ 보닀 μΌκ΄€λ˜κ³  μ •ν˜•ν™”λœ ν”„λ‘œκ·Έλž¨μ˜ 개발이 κ°€λŠ₯ν•˜λ‹€.
  1. μ„œλ‘œ κ΄€κ³„μ—†λŠ” ν΄λž˜μŠ€λ“€μ—κ²Œ 관계λ₯Ό λ§Ίμ–΄ 쀄 수 μžˆλ‹€.
    클래슀의 상속은 라인이 ν•˜λ‚˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€μ˜ 상속을 μ—¬λŸ¬κ°€μ§€κ°€ κ°€λŠ₯ν•˜κΈ°μ— ν΄λž˜μŠ€κ°„μ˜ μ—°κ²°κ³ λ¦¬μ˜ 역할을 ν•  수 μžˆλ‹€.
  1. 독립적인 ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯ν•˜λ‹€.
    ν΄λž˜μŠ€κ°„μ—λŠ” 직접적인 관계λ₯Ό μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•˜μ—¬ 간접적인 κ΄€κ³„λ‘œ λ³€ν˜•μ‹œμΌœ ν•œ 클래슀의 변경이 λ‹€λ₯Έ ν΄λž˜μŠ€μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ” 독립적인 ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯ν•˜λ‹€.

6. λ””ν΄νŠΈ λ©”μ„œλ“œμ™€ static λ©”μ„œλ“œ

  • JDK1.8 μ΄μƒμ—μ„œλŠ” λ””ν¬νŠΈ λ©”μ„œλ“œμ™€ static λ©”μ„œλ“œλ₯Ό μΈν„°νŽ˜μ΄μŠ€μ— μ‚¬μš©κ°€λŠ₯
  • staticλ©”μ„œλ“œλŠ” μ• μ΄ˆμ— μžμ†κ³Ό 관련이 μ—†μ—ˆκΈ°μ— interface좔가에 별 μ œν•œμ΄ μ—†λ‹€.
  • default λ©”μ„œλ“œμ˜ 경우 ν΄λž˜μŠ€μ—μ„œ 쑰상 ν΄λž˜μŠ€μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 것과 κ°™λ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€.

μ›λž˜, interface에 μΆ”κ°€λ˜λŠ” 좔상 λ©”μ„œλ“œλŠ” μžμ†μ—μ„œ λ‹€μ‹œ μ •μ˜ν•΄μ•Όλ˜μ§€λ§Œ,
default methodλŠ” 쑰상 ν΄λž˜μŠ€μ— μΆ”κ°€λœ μ—­ν• λ‘œ μžμ†μ—μ„œ λ”°λ‘œ μ •μ˜ν•  ν•„μš”μ—†κ²Œ νŽΈμ˜μ„±μ„ μ¦κ°€μ‹œμΌ°λ‹€.

μ˜ˆμ‹œ

μ›λž˜ μ½”λ“œ

interface MyInterface2 {
	default void method1() { 
		System.out.println("method1() in MyInterface2");
	}

	static void staticMethod() { 
		System.out.println("staticMethod() in MyInterface2");
	}
}

κ²°κ³Ό

default νƒ€μž… ν‘œμ‹œ 제거 μ‹œ

interface MyInterface2 {
	void method1() { 
		System.out.println("method1() in MyInterface2");
	}

	static void staticMethod() { 
		System.out.println("staticMethod() in MyInterface2");
	}
}

κ²°κ³Ό : μ—λŸ¬ λ°œμƒ(좔상 λ©”μ„œλ“œλŠ” bodyλ₯Ό κ°€μ§ˆ 수 μ—†κΈ° 떄문에!!!)

κ²°λ‘ 

default or static으둜 μ •μ˜ν•œ methodλŠ” interfaceμ—μ„œ bodyκΉŒμ§€ κ°€μ§ˆ 수 있으며, μžμ† ν΄λž˜μŠ€μ™€ 독립적인 κΈ°λŠ₯을 μˆ˜ν–‰ν•œλ‹€.


7. λ‚΄λΆ€ 클래슀(inner class)

  • 클래슀 내에 μ„ μ–Έλœ 클래슀

μž‘μ„±λ²•

class A{	//μ™ΈλΆ€ 클래슀
	classB{	//λ‚΄λΆ€ 클래슀
	}
}

λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ„ μ–Έ μœ„μΉ˜μ— 따라 λ‹€μŒκ³Ό 같이 κ΅¬λΆ„λœλ‹€.

<μ’…λ₯˜μ™€ νŠΉμ§•>
1. μΈμŠ€ν„΄μŠ€ 클래슀(instance class)

  • μ™ΈλΆ€ 클래슀의 λ§΄λ²„λ³€μˆ˜ μ„ μ–Έμœ„μΉ˜μ— μ„ μ–Έ
  • 주둜 μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 멀버듀과 κ΄€λ ¨λœ μž‘μ—…μ— μ‚¬μš©λ¨
  1. μŠ€νƒœν‹± 클래슀(static class)
  • μ™ΈλΆ€ 클래슀의 λ§΄λ²„λ³€μˆ˜ μ„ μ–Έμœ„μΉ˜μ— μ„ μ–Έ
  • 주둜 μ™ΈλΆ€ 클래슀의 static멀버, 특히 static λ©”μ„œλ“œμ—μ„œ μ‚¬μš©λ  λͺ©μ μœΌλ‘œ μ„ μ–Έλœλ‹€.
  1. 지역 클래슀(local class)
  • μ™ΈλΆ€ 클래슀의 λ©”μ„œλ“œλ‚˜ μ΄ˆκΈ°ν™”λΈ”λŸ­ μ•ˆμ— μ„ μ–Έ
  • μ„ νƒλœ μ˜μ—­ μ•ˆμ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯
  1. 읡λͺ… 클래슀(anonymous class)
  • 클래슀의 μ„ μ–Έκ³Ό 객체의 생성을 λ™μ‹œμ— ν•˜λŠ” μ΄λ¦„μ—†λŠ” 클래슀(일회용)

8. λ‚΄λΆ€ 클래슀의 μ„ μ–Έ

μ„ μ–Έκ³Ό μ œμ–΄μž μ ‘κ·Όμžλ„ λͺ¨λ‘ λ§΄λ²„λ³€μˆ˜ μ„ μ–Έκ³Ό λ™μΌν•œ ν˜•νƒœλ₯Ό λˆλ‹€.


9. λ‚΄λΆ€ 클래슀 예제λ₯Ό ν†΅ν•œ 뢄석

  • static 클래슀만 static멀버λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
  • final static은 μƒμˆ˜μ΄κΈ° λ•Œλ¬Έμ— ν—ˆμš©
  • μΈμŠ€ν„΄μŠ€ ν΄λž˜μŠ€λŠ” static methodμ—μ„œ μ ‘κ·Όν•  수 μ—†λ‹€.
  • μΈμŠ€ν„΄μŠ€ ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœ 후에 μ ‘κ·Ό κ°€λŠ₯함
  • static classλŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 멀버에 μ ‘κ·Ό ν•  수 μ—†λ‹€.
  • thisλŠ” ν˜„μž¬ ν¬ν•¨λœ 클래슀 selfμ°Έμ‘°ν˜•μž„
  • Outerclass.this.valueλ₯Ό ν•΄μ•Ό 동일 이름 μ™ΈλΆ€ 클래슀 λ³€μˆ˜μ— μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.

10. 읡λͺ…ν΄λž˜μŠ€(anonymous class)

읡λͺ… 클래슀 λ³€ν˜• μ „ 클래슀

import java.awt.*;
import java.awt.event.*;

class Ex7_18 {
	public static void main(String[] args) {
		Button b = new Button("Start");
		b.addActionListener(new EventHandler());
	}
}

class EventHandler implements ActionListener {
	public void actionPerformed(ActionEvent e) {
		System.out.println("ActionEvent occurred!!!");
	}
}

읡λͺ… 클래슀둜으둜 λ³€ν˜• ν›„ μ½”λ“œ

import java.awt.*;
import java.awt.event.*;

class Ex7_19 {
	public static void main(String[] args) {
		Button b = new Button("Start");
		b.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					System.out.println("ActionEvent occurred!!!");
				}
			}
		);
	}
} 

0개의 λŒ“κΈ€