πŸ“• Backend/Java

객체지ν–₯의 사싀과 μ˜€ν•΄ - 2-2. 기계에 λΉ„μœ ν•œ 객체

Dongwoongkim 2023. 12. 4. 17:42

객체지ν–₯의 세계λ₯Ό μ°½μ‘°ν•˜λŠ” κ°œλ°œμžλ“€μ˜ 주된 μ—…λ¬΄λŠ” 객체의 μƒνƒœλ₯Ό μ‘°νšŒν•˜κ³  객체의 μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 일

  • μƒνƒœλ₯Ό μ‘°νšŒν•˜λŠ” μž‘μ—…μ„ 쿼리, μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” μž‘μ—…μ„ λͺ…령이라고 ν•©λ‹ˆλ‹€.
  • 객체가 외뢀에 μ œκ³΅ν•˜λŠ” ν•΄λ™μ˜ λŒ€λΆ€λΆ„μ€ 쿼리, λͺ…λ ΉμœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

 

 μ•„μ΄νŽ (Eiffel)μ΄λΌλŠ” μ–Έμ–΄λ₯Ό λ§Œλ“  λ²„νŠΈλž€λ“œ λ§ˆμ΄μ–΄λŠ” 객체λ₯Ό μš°λ¦¬κ°€ μΉœμˆ™ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 기계에 λΉ—λŒ€μ–΄ λΉ„μœ ν•˜μ—¬ μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

μ–΄λ–€ μΈ‘λ©΄μ—μ„œ 객체λ₯Ό 기계에 λΉ—λŒ€μ–΄ λΉ„μœ ν•˜μ˜€λŠ”μ§€ μ—˜λ¦¬μŠ€ 객체λ₯Ό 톡해 ν•œ 번 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

κΈ°κ³„λ‘œμ„œμ˜ μ•¨λ¦¬μŠ€ 객체

κΈ°κ³„μ˜ ν•˜λ‹¨λΆ€μ—λŠ” '음료λ₯Ό λ§ˆμ‹œλ‹€', '케이크λ₯Ό λ¨Ήλ‹€', 'λΆ€μ±„μ§ˆν•˜λ‹€', '버섯을 λ¨Ήλ‹€', '문을 ν†΅κ³Όν•˜λ‹€'와 같은 4κ°€μ§€μ˜ λ²„νŠΌκ³Ό, 'ν‚€', 'μœ„μΉ˜'λΌλŠ” λ²„νŠΌμ΄ μžˆμŠ΅λ‹ˆλ‹€. 

  • 'ν‚€','μœ„μΉ˜'에 λŒ€ν•œ λ²„νŠΌ 클릭 : ν˜„μž¬ μƒνƒœμ— λŒ€ν•œ 정보λ₯Ό μƒλ‹¨μ˜ λ””μŠ€ν”Œλ ˆμ΄μ— 좜λ ₯
  • λ™μž‘μ— λŒ€ν•œ 4κ°€μ§€ λ²„νŠΌ 클릭 : 각 ν–‰μœ„μ— λŒ€ν•œ λ‚΄λΆ€ λ™μž‘μœΌλ‘œ μƒνƒœ(ν‚€, μœ„μΉ˜)λ₯Ό λ³€κ²½ 

 

 

1. μ‚¬μš©μžκ°€ 객체 κΈ°κ³„μ˜ λ²„νŠΌμ„ 눌러 μƒνƒœλ₯Ό λ³€κ²½, 쑰회λ₯Ό μš”μ²­ν•˜λŠ” 것은 객체의 행동을 μœ λ°œν•˜κΈ° μœ„ν•΄ λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•˜λŠ” 것과 μœ μ‚¬ν•˜λ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ²„νŠΌμ„ λˆ„λ₯΄λŠ” 것은 κΈ°κ³„μ˜ μ‚¬μš©μžμ§€λ§Œ, λ²„νŠΌμ— 따라 μ–΄λ–€ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ” μ§€λŠ” 기계가 슀슀둜 κ²°μ •ν•œλ‹€λŠ” μΈ‘λ©΄μ—μ„œ μ „λ‹¬λœ λ©”μ‹œμ§€μ— 따라 슀슀둜 νŒλ‹¨ν•˜κ³  κ²°μ •ν•˜λŠ” 자율적인 객체의 νŠΉμ„±μ„ μ •ν™•ν•˜κ²Œ λ¬˜μ‚¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λͺ…λ Ήκ³Ό μΏΌλ¦¬λŠ” 객체가 외뢀에 μ œκ³΅ν•˜λŠ” ν–‰λ™μ΄λΌλŠ” 점에 μ£Όλͺ©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
λ‹€μ‹œ 말해, μ‚¬μš©μžλŠ” μ—˜λ¦¬μŠ€ 객체의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄μ„œλ§Œ 객체에 μ ‘κ·Όν•  수 μžˆλ‹€λŠ” 것.
μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 λͺ…λ Ή λ²„νŠΌκ³Ό 쿼리 λ²„νŠΌ μ΄μ™Έμ˜ λ‹€λ₯Έ 방법을 ν†΅ν•΄μ„œλŠ” μ—˜λ¦¬μŠ€ 객체λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€λŠ” κ²ƒμœΌλ‘œ  μΊ‘μŠν™”λ₯Ό κ°•μ‘°ν•©λ‹ˆλ‹€. ( λ²„νŠΌμ„ 톡해 μƒνƒœμ™€ ν–‰μœ„κ°€ ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ μΊ‘μŠν™” λœλ‹€λŠ” μ μ—μ„œ 객체의 μ •μ˜λ₯Ό 효과적으둜 ν‘œν˜„ )

 

2. 기계 μ€μœ λ₯Ό μ΄μš©ν•˜λ©΄ 객체의 μ‹λ³„μž μ—­μ‹œ 효과적인 μ„€λͺ…이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

λ§Œμ•½ μ—˜λ¦¬μŠ€ 기계가 두 개 μ‘΄μž¬ν•˜κ³  두 κΈ°κ³„μ˜ 초기 ν‚€μ˜ 값은 130, μœ„μΉ˜μ˜ 값은 0이라고 κ°€μ •ν•΄λ΄…μ‹œλ‹€.

두 κΈ°κ³„μ˜ 킀와 μœ„μΉ˜ λ²„νŠΌμ„ ν΄λ¦­ν•œλ‹€λ©΄ μ΄ˆκΈ°κ°’μ— μ˜κ±°ν•˜μ—¬ 두 기계 λͺ¨λ‘ 130, 0μ΄λΌλŠ” 값이 λ””μŠ€ν”Œλ ˆμ΄μ— 좜λ ₯될 κ²ƒμž…λ‹ˆλ‹€.

 

κ·Έλ ‡λ‹€λ©΄ 이 두 κΈ°κ³„λŠ” λ™μΌν•œ ν•˜λ‚˜μ˜ κΈ°κ³„μΌκΉŒμš”? κ²°μ½” κ·Έλ ‡μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μƒνƒœλŠ” 동일할 지라도 두 κΈ°κ³„λŠ” μ„œλ‘œ ꡬ뢄이 κ°€λŠ₯ν•œ 독립적인 기계이기 λ•Œλ¬Έμ— 이 두 기계가 λ™μΌν•˜λ‹€κ³  λ³Ό μˆ˜λŠ” μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

 

3. 기계 μ€μœ λ₯Ό 톡해 객체 κ°„μ˜ λ©”μ‹œμ§€λ₯Ό ν†΅ν•œ ν˜‘λ ₯ μ—­μ‹œ μ„€λͺ…이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ—˜λ¦¬μŠ€ 객체와 음료 객체

μœ„ κ·Έλ¦Όκ³Ό 같이 μ—˜λ¦¬μŠ€μ™€ 음료λ₯Ό 기계에 μ€μœ ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

  • 음료 κ΄€μ μ—μ„œλŠ” 'λ§ˆμ…”μ§€λ‹€'λΌλŠ” λͺ…λ Ή λ²„νŠΌμ„ 톡해 μžμ‹ μ˜ μƒνƒœμΈ 'μ–‘'을 μ‘°μ ˆν•  수 있고, μžμ‹ μ˜ 'μ–‘'을 좜λ ₯ν•  수 μžˆλŠ” λ²„νŠΌμœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ μ—˜λ¦¬μŠ€ κΈ°κ³„μ˜ '음료 λ§ˆμ‹œκΈ°' λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄, 각 기계듀은 μ•„λž˜μ™€ 같은 λ‚΄λΆ€ λ§€μ»€λ‹ˆμ¦˜μœΌλ‘œ λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

1) μ—˜λ¦¬μŠ€ κΈ°κ³„λŠ” 링크된 음료의 양을 ν™•μΈν•˜κ³  양이 μΆ©λΆ„ν•˜λ©΄ μžμ‹ μ˜ ν‚€λ₯Ό μ€„μž…λ‹ˆλ‹€.

2) 링크된 음료의 'λ§ˆμ…”μ§€λ‹€' λ²„νŠΌμ΄ λˆŒλ €μ§€λ„λ‘ μš”μ²­μ„ μ „μ†‘ν•˜κ²Œ λ©λ‹ˆλ‹€.

3) 음료 κΈ°κ³„λŠ” 'λ§ˆμ…”μ§€λ‹€' λ²„νŠΌμ΄ λˆŒλ €μ§€λ„λ‘ μš”μ²­μ„ λ°›μ•„ μžμ‹ μ˜ 양을 μ€„μž…λ‹ˆλ‹€.

 

객체지ν–₯ νŒ¨λŸ¬λ‹€μž„ κ΄€μ μ—μ„œ 이것은 '음료 λ§ˆμ‹œκΈ°'λΌλŠ” λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•œ μ•¨λ¦¬μŠ€ 객체가 λ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•˜λ˜ 도쀑 음료 κ°μ²΄μ—κ²Œ 'λ§ˆμ…”μ§€λ‹€' λΌλŠ” λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•œ 것과 λ™μΌν•©λ‹ˆλ‹€.

 

즉, 링크λ₯Ό 톡해 μ—°κ²°λœ 두 객체가 λ©”μ‹œμ§€ 전솑을 톡해 ν˜‘λ ₯ν•˜κ³  μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

 

이처럼 객체λ₯Ό κΈ°κ³„λ‘œμ„œ λ°”λΌλ³΄λŠ” 관점은 μƒνƒœ, 행동, μ‹λ³„μžμ— λŒ€ν•œ μ‹œκ°μ μΈ 이미지λ₯Ό μ œκ³΅ν•˜κ³  μΊ‘μŠν™”μ™€ λ©”μ‹œμ§€λ₯Ό ν†΅ν•œ ν˜‘λ ₯관계λ₯Ό 맀우 효과적으둜 μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

이제 이 μ—˜λ¦¬μŠ€ 객체에 λŒ€ν•œ 기계λ₯Ό 섀계해보며 μ„€λͺ…을 λ§ˆμΉ˜κ² μŠ΅λ‹ˆλ‹€.

package chapter2.machine;

public interface Alice {

    void drink();
    void eatCake();
    void fan();
    void eatMushroom(String part);
    void passDoor();

    void showHeight();

    void showPosition();
}
  • λ¨Όμ € λ²„νŠΌμž…λ‹ˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λŠ” κΈ°κ³„μ˜ λ²„νŠΌμ΄λΌκ³  μƒκ°ν•˜μ‹œλ©΄ λ˜λŠ”λ°μš”. 이 λ²„νŠΌμ— λŒ€ν•œ λ™μž‘μ„ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄μ— μž‘μ„±ν•˜μ—¬, κΈ°κ³„μ˜ λ‚΄λΆ€ λ™μž‘ λ§€μ»€λ‹ˆμ¦˜μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 
  • 이처럼 μΈν„°νŽ˜μ΄μŠ€λŠ” κΈ°κ³„μ˜ 외적인 뢀뢄듀을 μ„€κ³„ν•œ 섀계도라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
public class AliceImpl implements Alice {

    private Integer height;
    private Integer position;
    private Drink drink;

    public AliceImpl() {
        this.height = 130;
        this.position = 0;
        this.drink = new Drink(100);
    }

    @Override
    public void drink() {
        if (drink.isRemainAmount()) {
            drink.decrease(10);
            this.height -= 100;
        }
    }

    @Override
    public void eatCake() {
        this.height += 150;
    }

    @Override
    public void fan() {
        this.height -= 20;
    }

    @Override
    public void eatMushroom(String part) {
        if (part.equals("left")) {
            this.height += 10;
        }
        this.height -= 10;
    }

    @Override
    public void passDoor() {
        if (this.height < 40) {
            this.position = 1;
        }
    }

    @Override
    public void showHeight() {
        System.out.println(this.height);
    }

    @Override
    public void showPosition() {
        System.out.println(this.position);
    }
}
  • λ‹€μŒμ€ μ—˜λ¦¬μŠ€ κΈ°κ³„μ˜ 내뢀에 λŒ€ν•œ 섀계 ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
  • 이처럼 μΈν„°νŽ˜μ΄μŠ€μ— μž‘μ„±ν•œ μ„€κ³„λ„λ‘œ λ‚΄λΆ€μ˜ λ™μž‘μ„ κ΅¬ν˜„ν•œλ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
public class Drink {

    private Integer amount;

    public Drink(Integer amount) {
        this.amount = amount;
    }

    public void decrease(Integer amount) {
        this.amount -= amount;
    }

    public boolean isRemainAmount() {
        if (amount >= 10) {
            return true;
        }
        return false;
    }
}
  • λ§ˆμ§€λ§‰μœΌλ‘œ 음료 객체에 λŒ€ν•œ μ„€κ³„λ„μž…λ‹ˆλ‹€.
  • μ—˜λ¦¬μŠ€ 객체와 ν˜‘λ ₯을 ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.
    • 'λ§ˆμ…”μ§€λ‹€'λΌλŠ” λ²„νŠΌ 클릭의 μš”μ²­μ„ 전솑받아 μžμ‹ μ˜ 양을 쀄이도둝 λ™μž‘(ν–‰μœ„)ν•˜λŠ” κΈ°λŠ₯이 decrease() λ‘œμ„œ κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
    • μ—˜λ¦¬μŠ€ 객체가 '음료λ₯Ό λ§ˆμ‹œλ‹€'λΌλŠ” λ™μž‘μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” μ§€ μžμ‹ μ˜ μƒνƒœλ₯Ό κ²€μ¦ν•˜λŠ” κΈ°λŠ₯이 isRemainAmount() λ‘œμ„œ κ΅¬ν˜„λ˜μ–΄ μžˆλŠ”λ° 이처럼 μ™ΈλΆ€ κ°μ²΄μ—μ„œ μžμ‹ μ˜ μƒνƒœλ₯Ό κΊΌλ‚΄μ–΄ κ²€μ¦ν•˜μ§€ μ•Šκ³  슀슀둜의 μƒνƒœμ— λŒ€ν•œ 검증을 슀슀둜 μˆ˜ν–‰ν•  수 μžˆλ„λ‘ μž‘μ„±ν•¨μœΌλ‘œμ¨ μΊ‘μŠν™” 원칙을 지킬 수 μžˆκ² μŠ΅λ‹ˆλ‹€.

<참고 자료>

 

객체지ν–₯의 사싀과 μ˜€ν•΄

μœ„ν‚€λΆμŠ€ IT Leaders μ‹œλ¦¬μ¦ˆ 23ꢌ. 객체지ν–₯μ΄λž€ 무엇인가? 이 책은 이 μ§ˆλ¬Έμ— λŒ€ν•œ 닡을 μ°ΎκΈ° μœ„ν•΄ λ…Έλ ₯ν•˜κ³  μžˆλŠ” λͺ¨λ“  개발자λ₯Ό μœ„ν•œ 책이닀.

www.aladin.co.kr