BlueHarmel
BlueHarmel Devlog
BlueHarmel
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ

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

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (330)
    • Book (11)
    • Dev (29)
      • ArtCon (0)
      • ESTsoft ์˜ค๋ฅด๋ฏธ (29)
    • Study (290)
      • Web (18)
      • AWS (2)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (1)
      • GameDev (1)
      • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (201)
      • English (1)
      • Mathematics (24)
      • ๋จธ์‹ ๋Ÿฌ๋‹ (7)
      • ๋”ฅ๋Ÿฌ๋‹ (10)
      • ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ (5)
      • R (4)
      • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (6)
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๋ฐ์ดํ„ฐ ํ†ต์‹  (0)
      • ์šด์˜์ฒด์ œ (2)
      • TIL (0)
    • Project (0)
      • ๊ฐœ์ธ (0)
      • ๋‹จ์ฒด (0)

์ธ๊ธฐ ๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.
BlueHarmel

BlueHarmel Devlog

Dev/ESTsoft ์˜ค๋ฅด๋ฏธ

์ดํŒฉํ‹ฐ๋ธŒ ์ž๋ฐ”-์ธํ„ฐํŽ˜์ด์Šค

2024. 2. 23. 11:00
๐Ÿคฆโ€โ™‚๏ธ

1. ์ถ”์ƒ ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์šฐ์„ ํ•˜๋ผ

  • ์„ค๋ช…
    • ์ž๋ฐ”๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค์ค‘ ๊ตฌํ˜„ ๋ฉ”์ปค๋‹ˆ์ฆ˜
    ์ถ”์ƒ ํด๋ž˜์Šค์ธํ„ฐํŽ˜์ด์Šค
    ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์ •์˜ํ•œ ํƒ€์ž…์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

    ์ž๋ฐ”๋Š” ๋‹จ์ผ ์ƒ์†๋งŒ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ƒ ํด๋ž˜์Šค ๋ฐฉ์‹์€ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š”๋ฐ ํฐ ์ œ์•ฝ์ด ๋œ๋‹ค.
    ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์„ ์–ธํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์ •์˜ํ•˜๊ณ  ๊ทธ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ž˜ ์ง€ํ‚จ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ–ˆ๋“  ๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
    ๊ธฐ์กด ํด๋ž˜์Šค ์œ„์— ์ƒˆ๋กœ์šด ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๋ผ์›Œ๋„ฃ๊ธฐ๋Š” ์–ด๋ ต๋‹ค.
    (ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์ด ๊ณต๋™ ์ƒ์†์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—)
    ๊ธฐ์กด ํด๋ž˜์Šค์—๋„ ์†์‰ฝ๊ฒŒ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    Mixin ์ •์˜์— ๋งž์ง€์•Š๋‹ค

    ํด๋ž˜์Šค๋Š” ๋‘ ๋ถ€๋ชจ๋ฅผ ์„ฌ๊ธธ ์ˆ˜ ์—†๊ณ , ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ์—๋Š” ๋ฏน์Šค์ธ์„ ์‚ฝ์ž…ํ•˜๊ธฐ์— ํ•ฉ๋ฆฌ์ ์ธ ์œ„์น˜๊ฐ€ ์—†๋‹ค.
    Mixin ์ •์˜์— ์•Œ๋งž๋‹ค

    (Mixin : ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์œผ๋กœ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์— ์›๋ž˜์˜ ์ฃผ๋œ ๊ธฐ๋Šฅ ์™ธ์—๋„ ํŠน์ • ์„ ํƒ์  ํ–‰์œ„๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์ œ๊ณต)

    Ex) Comparable์€ ์ž์‹ ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ผ๋ฆฌ๋Š” ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ๋ฏน์Šค์ธ ์ธํ„ฐํŽ˜์ด์Šค
    ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ ์ „๋ถ€๋ฅผ ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•œ ๊ณ ๋„๋น„๋งŒ ๊ณ„์ธต๊ตฌ์กฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

    ์†์„ฑ์ด N๊ฐœ๋ผ๋ฉด, ์ง€์›ํ•ด์•ผํ•  ์กฐํ•ฉ์˜ ์ˆ˜๋Š” 2^n๊ฐœ๋‚˜ ๋œ๋‹ค. (combinational explosion | ์กฐํ•ฉ ํญ๋ฐœ)

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

    Ex) ์ž‘๊ณก๋„ํ•˜๋Š” ๊ฐ€์ˆ˜๋ฅผ ํ‘œํ˜„ํ• ๋•Œ, ๊ฐ„๋‹จํ•˜๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค ๋‘๊ฐœ๋ฅผ implements ํ•˜๊ฑฐ๋‚˜ SingerSongwriter์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.


    public interface Singer {
    AudioClip sing(Song s);
    }
    public interface Songwriter {
    Song compose(int chartPosition);
    }

    public interface SingerSongwriter extends Singer, Songwriter {
    AudioClip strumO;
    void actSensitiveO;
    }
    ํƒ€์ž…์„ ์ถ”์ƒํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜๋ฉด, ๊ทธ ํƒ€์ž…์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ƒ์†๋ฟ์ด๋‹ค.

    ์ƒ์†์œผ๋กœ ๋งŒ๋“  ํด๋ž˜์Šค๋Š” ๋ž˜ํผ ํด๋ž˜์Šค๋ณด๋‹ค ํ™œ์šฉ๋„๊ฐ€ ๋–จ์–ด์ง€๊ณ  ๊นจ์ง€๊ธฐ๋Š” ๋” ์‰ฝ๋‹ค.
    ๋ž˜ํผ ํด๋ž˜์Šค ๊ด€์šฉ๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์•ˆ์ „ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์ˆ˜๋‹จ์ด ๋œ๋‹ค.

    • ์ž๋ฐ” 8๋ถ€ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋„ default method๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๋‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋ชจ๋‘ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ์ค‘ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด ๋ช…๋ฐฑํ•œ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ๊ตฌํ˜„์„ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•ด ์ผ์„ ๋œ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
      default boolean removelf(Predicate<? super E> filter) {
      	Objects. requireNonNulK filter);
      	boolean result = false;
      	for (Iterator<E> it = iteratorO; it.hasNext();) {
      		if (filter.test(it.next())) {
      			it.removeO;
      			result = true;
      		}
      	}
      	return result;
      }
      • ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•  ๋•Œ๋Š” ์ƒ์†ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ์„ค๋ช…์„ @implSpec JavaDoc ํƒœ๊ทธ๋ฅผ ๋ถ™์—ฌ ๋ฌธ์„œํ™”ํ•ด์•ผํ•œ๋‹ค.
      • ๋””ํดํŠธ ๋ฉ”์„œ๋“œ์˜ ์ œ์•ฝ :
        • equals, hashCode ๊ฐ™์€ Object์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
        • ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค
        • public์ด ์•„๋‹Œ ์ •์  ๋งด๋ฒ„๋„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. (๋‹จ private ์ •์  ๋ฉ”์„œ๋“œ๋Š” ์˜ˆ์™ธ)
        • ์ž์‹ ์ด ๋งŒ๋“ค์ง€ ์•Š์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค.
      • ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด : ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ๊ณจ๊ฒฉ ๊ตฌํ˜„(Skeletal implementation) ํด๋ž˜์Šค๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ์‹์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์ทจํ•˜๋Š” ๋ฐฉ๋ฒ•
        • ์ธํ„ฐํŽ˜์ด์Šค :
          • ํƒ€์ž… ์ •์˜
          • (ํ•„์š”ํ•˜๋ฉด)๋””ํดํŠธ ๋ฉ”์„œ๋“œ ๋ช‡ ๊ฐœ๋„ ํ•จ๊ป˜ ์ œ๊ณต
        • ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค :
          • ๋‚˜๋จธ์ง€ ๋ฉ”์„œ๋“œ๋“ค๊นŒ์ง€ ๊ตฌํ˜„
        • ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด, ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ผ์ด ์™„๋ฃŒ๋œ๋‹ค. (ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด)
        • ๊ด€๋ก€์ƒ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์ด Interface๋ผ๋ฉด ๊ทธ ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์€ AbstractInterface๋กœ ์ง“๋Š”๋‹ค.
          • Ex) AbstractCollection, AbstractSet, AbstractList, AbstractMap์ด ํ•ต์‹ฌ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณจ๊ฒฉ ๊ตฌํ˜„์ด๋‹ค.
        public abstract class AbstractList<E> extends AbstractCollection<E> implements
         List<E> {
        
        	protected AbstractList(){
            }
        }
        /*
        AbstractList์—์„œ List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋Œ€๋ถ€๋ถ„ ๊ตฌํ˜„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋Š”
        ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ ๋‚จ๊ฒจ๋†จ๋‹ค. 
        set(int index , E element) ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ  ๊ตฌํ˜„ ๋‚ด์šฉ์€ ๋Š˜
        Exception์ด ๋˜์ ธ์ง€๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค. 
        ์ด๋ฅผ ํ†ตํ•ด list์— addAll() ์„ ํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ set์„ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ์ˆ˜ ์žˆ๋‹ค.
        AbstractList ๊ณจ๊ฒฉ ๊ตฌํ˜„์œผ๋กœ ํ™œ์šฉ */
        static List<Integer> intArrayAsList(int[] a) {
        	Objects.requireNonNulK a);
        
        	// ๋‹ค์ด์•„๋ชฌ๋“œ ์—ฐ์‚ฐ์ž๋ฃ” ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ์ž๋ฐ” 9๋ถ€ํ„ฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
        	// ๋” ๋‚ฎ์€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด <Integer>๋กœ ์ˆ˜์ •ํ•˜์ž.
        	return new AbstractList() {
        		@Override public Integer get(int i) {
        			return a[i]; // ์˜คํ† ๋ฐ•์‹ฑ(์•„์ดํ…œ 6)
        		}
        		@Override public Integer set(int i, Integer val) {
        			int oldVal = a[i];
        			a[i] = val; // ์˜คํ† ์–ธ๋ฐ•์‹ฑ
        			return oldVal; // ์˜คํ† ๋ฐ•์ƒ
        		}
        		@Override public int sizeO {
        			return a.length;
        		}
        	};
        }
        • ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค์˜ ์žฅ์  :
          • ์ถ”์ƒ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๊ตฌํ˜„์„ ๋„์™€์ค€๋‹ค
          • ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ ๋”ฐ๋ผ์˜ค๋Š” ์ œ์•ฝ์—์„œ๋Š” ์ž์œ ๋กญ๋‹ค
        • ๊ตฌ์กฐ์ƒ ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํ™•์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.
        • ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์šฐํšŒ์ ์œผ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
          • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ ํ•ด๋‹น ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํ™•์žฅํ•œ private ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ (Simulated multiple inheritance | ์‹œ๋ฎฌ๋ ˆ์ดํŠธํ•œ ๋‹ค์ค‘ ์ƒ์†)
        • ๊ณจ๊ฒฉ ๊ตฌํ˜„ ์ž‘์„ฑ ๋ฐฉ๋ฒ• :
          1. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž˜ ์‚ดํŽด ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋“ค์˜ ๊ตฌํ˜„์— ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ๋“ค์„ ์„ ์ •
            1. ์ด ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ๋“ค์€ ๊ณจ๊ฒฉ ๊ตฌํ˜„์—์„œ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ๋œ๋‹ค.
          1. ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•ด ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณต
            1. ๋‹จ, equals์™€ hashCode ๊ฐ™์€ Object์˜ ๋ฉ”์„œ๋“œ๋Š” ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
            1. ๋งŒ์•ฝ, ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ ๋ชจ๋‘๊ฐ€ ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ์™€ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ๋œ๋‹ค๋ฉด, ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค ์ด์œ ๋Š” ์—†๋‹ค.
          1. ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ๋‚˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค์ง€ ๋ชปํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚จ์•„์žˆ๋‹ค๋ฉด, ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ๋‚จ์€ ๋ฉ”์„œ๋“œ๋“ค์„ ์ž‘์„ฑํ•ด ๋„ฃ๋Š”๋‹ค.
            1. ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค์—๋Š” ํ•„์š”ํ•˜๋ฉด public ์ด ์•„๋‹Œ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๋œ๋‹ค.
          /*
          Map.Entry ์ธํ„ฐํŽ˜์ด์Šค
          
          getKey, getValue๋Š” ํ™•์‹คํžˆ ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ์ด๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ setvalue๋„ ํฌํ•จํ•  ์ˆ˜
          ์žˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” equals์™€ hashCode์˜ ๋™์ž‘ ๋ฐฉ์‹๋„ ์ •์˜ํ•ด๋†จ๋‹ค.
          Object ๋ฉ”์„œ๋“œ๋“ค์€ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฏ€๋กœ,
          ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋“ค์€ ๋ชจ๋‘ ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ๊ตฌํ˜„ํ•œ๋‹ค.
          toString๋„ ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•ด๋†จ๋‹ค.
          
          Map.Entry ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ๊ทธ ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋Š” ์ด ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์—†๋‹ค. 
          ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” equals, hashCode, toString ๊ฐ™์€ Object ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜
          ์—†๊ธฐ ๋•Œ
          */
          public abstract class AbstractMapEntry<K,V> implements Map.Entry<K,V> {
          	// ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์—”ํŠธ๋ฆฌ๋Š” ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
          	@Override public V setValue(V value) {
          		throw new UnsupportedOperationException();
          	}
          	// Map.Entry.equals์˜ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
          	@Override public boolean equals(Object o) {
          		if (o = this)
          			return true;
          		if (!(o instanceof Map.Entry))
          			return false;
          		Map.Entry<?,?> e = (Map.Entry) o;
          		return Obj ects. equa Is (e. getKey (), getKeyO)
          			&& Objects.equals(e.getValue(), getValue());
          	}
          	// Map.Entry.hashCode์˜ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
          	@Override public int hashCodeO {
          	return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());
          	}
          	@0verride public String toStringO {
          		return getKey() + "=" + getValueO;
          	}
          }
          • ๊ณจ๊ฒฉ ๊ตฌํ˜„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ ๊ฐ€์ •ํ•˜๋ฏ€๋กœ ์„ค๊ณ„ ๋ฐ ๋ฌธ์„œํ™” ์ง€์นจ์„ ๋ชจ๋‘ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.
            • ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜ํ•œ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋“  ๋ณ„๋„์˜ ์ถ”์ƒ ํด๋ž˜์Šค๋“ , ๊ณจ๊ฒฉ ๊ตฌํ˜„์€ ๋ฐ˜๋“œ์‹œ ๊ทธ ๋™์ž‘ ๋ฐฉ์‹์„ ์ž˜ ์ •์˜ํ•ด ๋ฌธ์„œํ™” ์ฃผ์„์œผ๋กœ ๋‚จ๊ฒจ์•ผํ•œ๋‹ค
          • ํ•ต์‹ฌ ์ •๋ฆฌ :
            • ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์ค‘ ๊ตฌํ˜„์šฉ ํƒ€์ž…์œผ๋กœ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค.
            • ๋ณต์žกํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด ๊ตฌํ˜„ํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ์–ด์ฃผ๋Š” ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ผญ ๊ณ ๋ คํ•ด๋ณด์ž.
            • ๊ณจ๊ฒฉ ๊ตฌํ˜„์€ โ€˜๊ฐ€๋Šฅํ•œ ํ•œโ€™ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•˜์—ฌ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋ชจ๋“  ๊ณณ์—์„œ ํ™œ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
            • โ€˜๊ฐ€๋Šฅํ•œ ํ•œโ€™์ด๋ผ๊ณ  ํ•œ ์ด์œ ๋Š”, ์ธํ„ฐํŽ˜์ด์Šค์— ๊ฑธ๋ ค ์žˆ๋Š” ๊ตฌํ˜„์ƒ์˜ ์ œ์•ฝ ๋•Œ๋ฌธ์— ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ํ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
            // ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜
            interface MyInterface {
                void myMethod();
            }
            
            // ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค
            public abstract class MyAbstractClass implements MyInterface {
                // ๊ธฐ๋ณธ ๋™์ž‘์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ
                public void myMethod() {
                    System.out.println("Default implementation of myMethod");
                }
            
                // ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋‚˜ ์ถ”๊ฐ€์ ์ธ ๋™์ž‘์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ
                public void anotherMethod() {
                    System.out.println("Some additional method");
                }
            }
            
            // ์‹ค์ œ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค
            public class MyClass extends MyAbstractClass {
                // ํ•„์š”์— ๋”ฐ๋ผ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ์ˆ˜์ • ๋˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅ
                public void myMethod() {
                    System.out.println("Custom implementation of myMethod");
                }
            
                public static void main(String[] args) {
                    MyClass myObject = new MyClass();
                    myObject.myMethod(); // ์ปค์Šคํ…€ ๊ตฌํ˜„์ด ํ˜ธ์ถœ๋จ
                    myObject.anotherMethod(); // ๊ธฐ๋ณธ ๊ตฌํ˜„์—์„œ ์ƒ์†๋œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
                }
            }

2. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•˜๋Š” ์ชฝ์„ ์ƒ๊ฐํ•ด ์„ค๊ณ„ํ•˜๋ผ

  • ์„ค๋ช…
    • ์ž๋ฐ” 8 ์ „ : ๊ธฐ์กด ๊ตฌํ˜„์ฒด๋ฅผ ๊นจ์ง€ ์•Š๊ณ ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋ฐฉ๋ฒ•์ด X
      • ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ณดํ†ต์€ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š”๋ฐ, ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์šฐ์—ฐํžˆ ๊ธฐ์กด ๊ตฌํ˜„์ฒด์— ์ด๋ฏธ ์กด์žฌํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์•„์ฃผ ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ
    • ์ž๋ฐ” 8 : ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ๊ตฌํ˜„ํ•œ ํ›„ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ํด๋ž˜์Šค์— ๋””ํดํŠธ ๊ตฌํ˜„์ด ์“ฐ์ธ๋‹ค.
      • ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์†Œ๊ฐœํ–ˆ์ง€๋งŒ, ๋ชจ๋“  ๊ธฐ์กด ๊ตฌํ˜„์ฒด๋“ค๊ณผ ๋งค๋„๋Ÿฝ๊ฒŒ ์—ฐ๋™๋˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์€ ์—†๋‹ค.
        • ์ž๋ฐ” 7 ๊นŒ์ง€๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ํ˜„์žฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋  ์ผ์€ ์˜์›์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ž‘์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ
    • ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ๋ถˆ๋ณ€์‹์„ ํ•ด์น˜์ง€ ์•Š๋Š” ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค
      • ์ž๋ฐ” 8์˜ Collection ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”๊ฐ€๋œ removeIf ๋ฉ”์„œ๋“œ
        /*
        ์ฃผ์–ด์ง„ ๋ถˆ๋ฆฌ์–ธ ํ•จ์ˆ˜๏ผˆpredicate๏ผ›๏ผ‰๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ์›์†Œ๋ฅผ ์ œ๊ฑฐ.
        ๋””ํดํŠธ ๊ตฌํ˜„์€ ๋ฐ˜๋ณต์ž๋ฅผ ์ด์šฉํ•ด ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ์›์†Œ๋ฅผ ์ธ์ˆ˜๋กœ ๋„ฃ์–ด predicate๋ฅผ
        ํ˜ธ์ถœํ•˜๊ณ , predicate๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฐ˜๋ณต์ž์˜ remove ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด 
        ๊ทธ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
        */
        default boolean removelf(Predicate<? super E> filter) {
        	Objects. requireNonNulK filter);
        	boolean result = false;
        	for (Iterator<E> it = iteratorO; it.hasNext(); ) {
        		if (filter.test(it.next())) {
        			it. removeO;
        			result = true;
        		}
        	}
        	return result;
        }
      • ์ด ์ฝ”๋“œ๋Š” ๋ฒ”์šฉ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์ง€๋งŒ, ํ˜„์กดํ•˜๋Š” ๋ชจ๋“  Collection ๊ตฌํ˜„์ฒด์™€ ์ž˜ ์–ด์šฐ๋Ÿฌ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค
      • Ex) org.apache.commons.collections4.collection.SynchronizedCollection
        • java.util์˜ Collections.synchronizedCollection ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋ž˜์Šค์™€ ๋น„์Šทํ•˜๋‹ค.
        • ํ•˜์ง€๋งŒ ์•„ํŒŒ์น˜ ๋ฒ„์ „์€ removeIf ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์•Œ์•„์„œ ๋™๊ธฐํ™”ํ•ด์ฃผ์ง€ ๋ชปํ•œ๋‹ค.
      • ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ์œ„ํ•ด ์ž๋ฐ” ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ทจํ•œ ์กฐ์น˜
        • ๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ , ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ๋Š” ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค
          • Collections.synchronizedCollection์ด ๋ฐ˜ํ™˜ํ•˜๋Š” package-private ํด๋ž˜์Šค๋“ค์€ removeIf๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋“ค์€ ๋””ํดํŠธ ๊ตฌํ˜„์„ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๋™๊ธฐํ™”๋ฅผ ํ•˜๋„๋ก ํ•œ๋‹ค
      • ํ•˜์ง€๋งŒ, ์ž๋ฐ” ํ”Œ๋žซํผ์— ์†ํ•˜์ง€ ์•Š์€ ์ œ3์˜ ๊ธฐ์กด ์ปฌ๋ ‰์…˜ ๊ตฌํ˜„์ฒด๋“ค์€ ์ด๋Ÿฐ ์–ธ์–ด ์ฐจ์›์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€ํ™”์— ๋ฐœ๋งž์ถฐ ์ˆ˜์ •๋  ๊ธฐํšŒ๊ฐ€ ์—†์—ˆ๊ณ , ์ผ๋ถ€๋Š” ์—ฌ์ „ํžˆ ์ˆ˜์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ
      • ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” (์ปดํŒŒ์ผ์— ์„ฑ๊ณตํ•˜๋”๋ผ๋„) ๊ธฐ์กด ๊ตฌํ˜„์ฒด์— ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
        • ๋”ฐ๋ผ์„œ ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค์— ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ผ์€ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ํ”ผํ•ด์•ผ ํ•œ๋‹ค.
        • ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ธฐ์กด ๊ตฌํ˜„์ฒด๋“ค๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š์„์ง€ ์‹ฌ์‚ฌ์ˆ™๊ณ ํ•ด์•ผํ•œ๋‹ค.
      • ๋ฐ˜๋ฉด, ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ํ‘œ์ค€์ ์ธ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์•„์ฃผ ์œ ์šฉํ•œ ์ˆ˜๋‹จ์ด๋ฉฐ, ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•ด์ค€๋‹ค.
      • ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋ฉ”์„œ๋“œ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์šฉ๋„๊ฐ€ ์•„๋‹˜์„ ๋ช…์‹ฌํ•ด์•ผํ•œ๋‹ค
        • ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ๊ธฐ์กด ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฌ๊ฒŒ ๋œ๋‹ค
      • ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ผ๋Š” ๋„๊ตฌ๊ฐ€ ์ƒ๊ฒผ๋”๋ผ๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ์—ฌ์ „ํžˆ ์„ธ์‹ฌํ•œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค.
        • ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด ๋ฆด๋ฆฌ์Šค ์ „์— ๋ฐ˜๋“œ์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณ์•ผํ•œ๋‹ค.
        • ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ํ™œ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋„ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค์–ด๋ด์•ผํ•œ๋‹ค.
        • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฆด๋ฆฌ์Šค ํ•œ ํ›„๋ผ๋„ ๊ฒฐํ•จ์„ ์ˆ˜์ •ํ•˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ ˆ๋Œ€ ๊ทธ ๊ฐ€๋Šฅ์„ฑ์— ๊ธฐ๋Œ€์„œ๋Š” ์•ˆ๋œ๋‹ค.

3. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋ผ

  • ์„ค๋ช…
    • ์ธํ„ฐํŽ˜์ด์Šค : ์ž์‹ ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… ์—ญํ• 
      • ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค == ์ž์‹ ์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์–˜๊ธฐํ•ด์ฃผ๋Š”๊ฒƒ (์˜ค์ง ์ด ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค)
    • ์ง€์นจ์— ๋งž์ง€์•Š๋Š” Ex) ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค
      • ๋ฉ”์„œ๋“œ ์—†์ด, static final ํ•„๋“œ๋กœ๋งŒ ๊ฐ€๋“ ์ฐฌ ์ธํ„ฐํŽ˜์ด์Šค
      • ์ด ์ƒ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ํด๋ž˜์Šค์—์„œ๋Š” ์ •๊ทœํ™”๋œ ์ด๋ฆ„(qualified name)์„ ์“ฐ๋Š” ๊ฑธ ํ”ผํ•˜๊ณ ์ž ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณคํ•œ๋‹ค.
      // ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค ์•ˆํ‹ฐํŒจํ„ด - ์‚ฌ์šฉ๊ธˆ์ง€!
      public interface PhysicalConstants {
      	// ์•„๋ณด๊ฐ€๋“œ๋กœ ์ˆ˜ (1/๋ชฐ)
      	static final double AVOGADROS.NUMBER = 6.022_140_857e23;
      	// ๋ณผ์ธ ๋งŒ ์ƒ์ˆ˜ (J/K)
      	static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
      	// ์ „์ž ์งˆ๋Ÿ‰ (kg)
      	static final double ELECTRON_MASS = 9.109_383_56e-31;
      }
      • ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์ˆ˜๋Š” ์™ธ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ํ•ด๋‹นํ•œ๋‹ค.
        • ๋”ฐ๋ผ์„œ ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ด ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ํด๋ž˜์Šค์˜ API๋กœ ๋…ธ์ถœํ•˜๋Š” ํ–‰์œ„์ด๋‹ค.
        • ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ ์˜คํžˆ๋ ค ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€์„ ์ค€๋‹ค
        • ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ํ•ด๋‹น๋˜๋Š” ์ด ์ƒ์ˆ˜๋“ค์— ์ข…์†๋˜๊ฒŒ ํ•ด์„œ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์— ์ด ์ƒ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ๋˜๋”๋ผ๋„, ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์—ฌ์ „ํžˆ ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.
        • final์ด ์•„๋‹Œ ํด๋ž˜์Šค๊ฐ€ ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ด๋ฆ„ ๊ณต๊ฐ„์ด ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜ํ•œ ์ƒ์ˆ˜๋“ค๋กœ ์˜ค์—ผ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.
    • ์ƒ์ˆ˜๋ฅผ ๊ณต๊ฐœํ•˜๋Š” ํ•ฉ๋‹นํ•œ ๋ฐฉ๋ฒ•๋“ค
      1. ํŠน์ • ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ด€๋œ ์ƒ์ˆ˜๋ฅผ ๊ทธ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด์— ์ถ”๊ฐ€
        1. Ex) ๋ชจ๋“  ์ˆซ์ž ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ•์‹ฑ ํด๋ž˜์Šค (Integer๊ณผ Double์— ์„ ์–ธ๋œ MIN_VALUE์™€ MAX_VALUE)
      1. ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ ์ ํ•ฉํ•œ ์ƒ์ˆ˜๋ผ๋ฉด ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด ๊ณต๊ฐœ
        public enum Day{ MON, TUE, WED, THU, FRI, SAT, SUN};
      1. ๋‘˜๋‹ค ์•„๋‹ˆ๋ผ๋ฉด, ์ธ์Šคํ„ด์Šคํ™” ํ•  ์ˆ˜ ์—†๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์— ๋‹ด์•„ ๊ณต๊ฐœ
        // ์ƒ์ˆ˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค
        /*
        ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด์— ์‚ฌ์šฉํ•œ ๋ฐ‘์ค„(_)์— ์ฃผ๋ชฉํ•ด๋ณด์ž. ์ž๋ฐ” 7๋ถ€ํ„ฐ ํ—ˆ์šฉ๋˜๋Š” ์ด ๋ฐ‘์ค„์€ ์ˆซ์ž ๋ฆฌํ„ฐ
        ๋Ÿด์˜ ๊ฐ’์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ, ์ฝ๊ธฐ๋Š” ํ›จ์”ฌ ํŽธํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ๊ณ ์ •์†Œ์ˆ˜์  ์ˆ˜
        ๋“  ๋ถ€๋™์†Œ์ˆ˜์  ์ˆ˜๋“  5์ž๋ฆฌ ์ด์ƒ์ด๋ผ๋ฉด ๋ฐ‘์ค„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ ๊ณ ๋ คํ•ด๋ณด์ž. ์‹ญ์ง„์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๋„
        (์ •์ˆ˜๋“  ๋ถ€๋™์†Œ์ˆ˜์  ์ˆ˜๋“ ) ๋ฐ‘์ค„์„ ์‚ฌ์šฉํ•ด ์„ธ ์ž๋ฆฟ์”ฉ ๋ฌถ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
        */
        package effectivejava.chapter4.item22.constantutilityclass;
        
        public class PhysicalConstants {
        	private PhysicalConstants() { } // ์ธ์Šคํ„ด์Šคํ™” ๋ฐฉ์ง€
        
        	// ์•„๋ณด๊ฐ€๋“œ๋กœ ์ˆ˜ (1/๋ชฐ)
        	public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
        	// ๋ณผ์ธ ๋งŒ ์ƒ์ˆ˜ (J/K)
        	public static final double BOLTZMANN_CONST = 1.380_648_52e-23;
        	// ์ „์ž ์งˆ๋Ÿ‰ (kg)
        	public static final double ELECTRON_MASS = 9.109_383_56e-31;
        }
        1. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์— ์ •์˜๋œ ์ƒ์ˆ˜๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋ž˜์Šค ์ด๋ฆ„๊นŒ์ง€ ํ•จ๊ป˜ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. (PhysicalConstants.AVOGADROS_NUMBER)
        1. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜๋ฅผ ๋นˆ๋ฒˆํžˆ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ •์  ์ž„ํฌํŠธ(static import)ํ•˜์—ฌ ํด๋ž˜์Šค ์ด๋ฆ„์€ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
          import static effectivejava.chapter4.item22.constantutilityclass.Physical
          Constants. *;
          
          public class Test {
          	double atoms(double mols) {
          		return AVOGADROS_NUMBER * mols;
          	}
          // PhysicalConstants๋ฅผ ๋นˆ๋ฒˆํžˆ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ •์  ์ž„ํฌํŠธ๊ฐ€ ๊ฐ’์–ด์น˜๋ฅผ ํ•œ๋‹ค.
          }

4. ์ฐธ์กฐ

  • ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค : https://xonmin.tistory.com/18
  • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” : ์•„์ดํ…œ 20,21,22

'Dev > ESTsoft ์˜ค๋ฅด๋ฏธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์Šค๋ ˆ๋“œ(Thread)  (0) 2024.02.23
์ŠคํŠธ๋ฆผ  (0) 2024.02.23
๋žŒ๋‹ค์‹  (0) 2024.02.23
์ปฌ๋ ‰์…˜  (0) 2024.02.23
๋ฆฌ์ŠคํŠธ  (0) 2024.02.23
    BlueHarmel
    BlueHarmel
    Interested in Mathematics, Foreign Language, and "Programming"

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