๊ฐœ๋ฐœ์ž HOON
๐Ÿ› HOON DEVLog
๊ฐœ๋ฐœ์ž HOON
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ˜Ž ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ (137)
    • ๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„ (7)
    • ๐Ÿฆ” ์ทจ์—…์ค€๋น„ ๊ธฐ๋ก (7)
    • โ˜• ์ž๋ฐ” : JAVA (5)
    • ๐Ÿ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„ : PS (80)
    • ๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend (13)
    • ๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS (11)
    • ๐Ÿ—‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : DB (1)
    • ๐Ÿƒ‍โ™‚๏ธ DEVLOG (8)
    • โš™๏ธ Trouble Shooting (5)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • GitHub
  • Resume

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๊ฐœ๋ฐœ์ž HOON

๐Ÿ› HOON DEVLog

โ˜• ์ž๋ฐ” : JAVA

[Java] ์ƒ์†๋Œ€์‹  ๊ตฌ์„ฑ(Composition)์„ ์‚ฌ์šฉํ•˜์ž

2022. 12. 8. 00:09

 

 

[Java] ์ƒ์†์˜ ์žฅ๋‹จ์ , ์ƒ์†์€ ์–ธ์ œ ์จ์•ผ ํ•˜๋Š”๊ฐ€?

๐Ÿง 1. ์ƒ์†์ด ๋ญ์ฃ ? [Java] ์ƒ์†(Inheritance) ์‚ฌ์šฉ๋ฒ•๊ณผ ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ๐Ÿง 1. ์ƒ์†์ด ๋ญ์ฃ ? ํ˜„์‹ค์„ธ๊ณ„์—์„œ์˜ ์ƒ์†์€, ๋ถ€๋ชจ๊ฐ€ ์ž์‹์—๊ฒŒ ์žฌ์‚ฐ์„ ๋ฌผ๋ ค์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ž์‹์€ ์ƒ์†์„ ๋ฐ›์œผ๋ฉด

hoons-dev.tistory.com

 

์ด์ „ ๊ธ€์—์„œ ์ƒ์†์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์บก์Аํ™”๊ฐ€ ๊นจ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ์š”?

๋ฐ”๋กœ, ์ƒ์† ๋Œ€์‹  ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

 

๐Ÿค” 1. ๊ตฌ์„ฑ?

 

 

์ƒ์†์—์„œ ๊ตฌ์„ฑ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€, ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ extends ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž์‹ ํด๋ž˜์Šค ๋ถ€๋ถ„์— private ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

class Base {}

/* ์ƒ์† */
class Child extends Base {
	private int code;
}

/* ๊ตฌ์„ฑ */
class CompositionObject{
	private Base base;
    private int code;
}

 

์ƒ์†์˜ ๋ฌธ์ œ๋Š”, ์ƒ์œ„ ํด๋ž˜์Šค์— ๊ฐ•ํ•˜๊ฒŒ ์˜์กด ๊ฒฐํ•ฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ํƒ€์ž… ๋ณ€๊ฒฝ, ๋ฉ”์†Œ๋“œ ์žฌ์ •์˜ ํ˜น์€ ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ์˜ ๊ฒฐ๊ณผ๋กœ ํฐ ์˜ค๋ฅ˜๋ฅผ ๋ฒ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ–๊ณ  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ํ†ตํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•ฉ์‹œ๋‹ค.

/* ๋ณ€๊ฒฝ ์ „ */
public class Lotto {
    protected List<Integer> lottoNumbers;

    public Lotto(List<Integer> lottoNumbers) {
        this.lottoNumbers = new ArrayList<>(lottoNumbers);
    }

    public  boolean contains(Integer integer) {
        return this.lottoNumbers.contains(integer);
    }
    ...
}

public class WinningLotto extends Lotto {
    private final BonusBall bonusBall;

    public WinningLotto(List<Integer> lottoNumbers, BonusBall bonusBall) {
        super(lottoNumbers);
        this.bonusBall = bonusBall;
    }

    public long compare(Lotto lotto) {
        return lottoNumbers.stream()
            .filter(lotto::contains)
            .count();
    }
    ...
}


/* ๋ณ€๊ฒฝ ํ›„ */
public class Lotto {
    protected int[] lottoNumbers; // ํƒ€์ž… ๋ณ€๊ฒฝ๋จ!

    public Lotto(int[] lottoNumbers) {
        this.lottoNumbers = lottoNumbers;
    }

    public boolean contains(Integer integer) {
        return Arrays.stream(lottoNumbers)
            .anyMatch(lottoNumber -> Objects.equals(lottoNumber, integer)); 
            // ๋ฉ”์„œ๋“œ ๋‚ด์šฉ ๋ณ€๊ฒฝ๋จ!
    }
    ...
}

public class WinningLotto extends Lotto {
    private final BonusBall bonusBall;

    // ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. (ํƒ€์ž… ์—๋Ÿฌ)
    public WinningLotto(List<Integer> lottoNumbers, BonusBall bonusBall) {
        super(lottoNumbers);
        this.bonusBall = bonusBall;
    }

    // ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. (int[]์—๋Š” .stream()์ด ์—†์Œ.)
    public long compare(Lotto lotto) {
        return lottoNumbers.stream()
            .filter(lotto::contains)
            .count();
    }
}

 

์ƒ์†์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์ „๊ณผ ํ›„์˜ ์ฐจ์ด๋Š”, Lotto ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ธ lottoNumbers์˜ ํƒ€์ž…์„ List<Integer>์—์„œ int[]๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ํ•ด๋‹น ํƒ€์ž… ๋ณ€๊ฒฝ์— ๋งž์ถฐ contains์˜ ๋กœ์ง์„ ๋ณ€๊ฒฝํ–ˆ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

 

Lotto๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋Š” WinningLotto๋Š” ๋ถ€๋ชจ์ธ Lotto์— ๊ฐ•ํ•˜๊ฒŒ ์˜์กด ๋ฐ ๊ฒฐํ•ฉ์„ ํ•˜๊ณ  ์žˆ์–ด์„œ ๊ทธ๋Œ€๋กœ ์ƒ์„ฑ์ž ๋ฐ compare ํ•จ์ˆ˜์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”?

 

/* ๋ณ€๊ฒฝ ์ „ */
public class Lotto {
    protected List<Integer> lottoNumbers;

    public Lotto(List<Integer> lottoNumbers) {
        this.lottoNumbers = new ArrayList<>(lottoNumbers);
    }

    public  boolean contains(Integer integer) {
        return this.lottoNumbers.contains(integer);
    }
    
    public boolean compare(Lotto otherLotto){
    	... ์ƒ๋žต
    }
}

/* ๋ณ€๊ฒฝ ํ›„ */
public class Lotto {
    protected int[] lottoNumbers;

    public Lotto(int[] lottoNumbers) {
        this.lottoNumbers = lottoNumbers;
    }

    public boolean contains(Integer integer) {
        return Arrays.stream(lottoNumbers)
            .anyMatch(lottoNumber -> Objects.equals(lottoNumber, integer));
    }
    
    public boolean compare(Lotto otherLotto){
    	... ์ƒ๋žต
    }
}

/* ๊ตฌ์„ฑ ์‚ฌ์šฉ */
public class WinningLotto {
    private Lotto lotto;
    private BonusBall bonusBall;
}

 

๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์บก์Аํ™”๋ฅผ ๊นจํŠธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ์กด ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์˜ํ–ฅ์ด ์ ์–ด์ง€๋ฉฐ, ์•ˆ์ „ํ•ด์ง‘๋‹ˆ๋‹ค.

๋ฌผ๋ก , WinningLotto์—์„œ compare ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์˜ํ–ฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Lotto ํด๋ž˜์Šค ๋‚ด๋ถ€๋กœ compare ํ•จ์ˆ˜๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฐ ๋ฐฉ์‹์ด๋ผ๋ฉด, ํƒ€์ž…์ด List<Integer>์—์„œ int[]๋กœ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ Lotto์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ํ†ตํ•œ ๊ฐ’๋งŒ ํ™œ์šฉํ•˜๋ฉด ๋˜๋ฏ€๋กœ WinningLotto ํด๋ž˜์Šค๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ๋ฅผ ๋„˜๊ฒจ ๋‚˜์ค‘์— ๋‹ค์‹œ ๋Œ๋ ค ๋ฐ›๋Š” ์ฝœ๋ฐฑ(call-back) ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” ๊ตฌ์„ฑ์ด ์ ํ•ฉํ•˜์ง€ ์•Š์œผ๋‹ˆ, ์ด ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ƒ์†๋ณด๋‹จ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)

'โ˜• ์ž๋ฐ” : JAVA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Effective Java] ์ƒ์„ฑ์ž ๋Œ€์‹  ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ  (0) 2023.01.06
[Java] ์ž๋ฐ” ์ง๋ ฌํ™” (Serialization)  (1) 2023.01.06
[Java] ์ƒ์†์˜ ์žฅ๋‹จ์ , ์ƒ์†์€ ์–ธ์ œ ์จ์•ผ ํ•˜๋Š”๊ฐ€?  (1) 2022.12.07
[Java] ์ƒ์†(Inheritance) ์‚ฌ์šฉ๋ฒ•๊ณผ ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ   (0) 2022.12.06
    'โ˜• ์ž๋ฐ” : JAVA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Effective Java] ์ƒ์„ฑ์ž ๋Œ€์‹  ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ
    • [Java] ์ž๋ฐ” ์ง๋ ฌํ™” (Serialization)
    • [Java] ์ƒ์†์˜ ์žฅ๋‹จ์ , ์ƒ์†์€ ์–ธ์ œ ์จ์•ผ ํ•˜๋Š”๊ฐ€?
    • [Java] ์ƒ์†(Inheritance) ์‚ฌ์šฉ๋ฒ•๊ณผ ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
    ๊ฐœ๋ฐœ์ž HOON
    ๊ฐœ๋ฐœ์ž HOON
    ์ข‹์€ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก์„ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค. # ์ฃผ๋‹ˆ์–ด # ๋ฐฑ์—”๋“œ # ๊ฐœ๋ฐœ์ž

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”