Amenable
Amenable's Blog
Amenable
  • λΆ„λ₯˜ 전체보기 (189)
    • πŸ“‚ JAVA (87)
      • μ΄νŽ™ν‹°λΈŒ μžλ°” (65)
      • μ£Όμš” κ°œλ… (22)
    • πŸ“‚ 개발 μ„œμ  (22)
      • μ‹€μš©μ£Όμ˜ ν”„λ‘œκ·Έλž˜λ¨Έ (1)
      • 객체지ν–₯의 사싀과 μ˜€ν•΄ (2)
      • 클린 μ½”λ“œ (8)
      • ν•¨κ»˜ 자라기 (1)
      • 그림으둜 λ°°μš°λŠ” HTTP&Network Basic (10)
    • πŸ“‚ λ°μ΄ν„°λ² μ΄μŠ€ (8)
      • κ°œλ… (8)
      • λ¬Έμ œν’€μ΄ (0)
    • πŸ“‚ λ„€νŠΈμ›Œν¬ (14)
      • κ°œλ… (6)
      • 성곡과 μ‹€νŒ¨λ₯Ό κ²°μ •ν•˜λŠ” 1%의 λ„€νŠΈμ›Œν¬ 원리 (8)
    • πŸ“‚ μŠ€ν”„λ§ (13)
      • κΈ°λ³Έ κ°œλ… (13)
    • πŸ“‚ WEB (5)
    • πŸ“‚ 자료ꡬ쑰 (12)
      • κ°œλ… (2)
      • μ •λ ¬ (8)
      • 트리 (2)
    • πŸ“‚ μ•Œκ³ λ¦¬μ¦˜ (10)
      • μ΅œμ†Œμ‹ μž₯트리 (2)
      • μ΅œλ‹¨ 경둜 (2)
      • λ¬Έμžμ—΄ (2)
      • ETC (4)
    • πŸ“‚ μ•Œκ³ λ¦¬μ¦˜_λ¬Έμ œν’€μ΄ (4)
      • BOJ_λ°±μ€€ (4)
    • πŸ“‚ ν”„λ‘œκ·Έλž˜λ° (3)
    • πŸ“‚ DevOps (2)
      • 배포 (2)
    • πŸ“‚ ν›„κΈ° (8)
      • μš°μ•„ν•œ ν…Œν¬μ½”μŠ€(ν”„λ¦¬μ½”μŠ€) (4)
      • 2023λ…„ (3)
      • 2024λ…„ (1)
    • πŸ“‚ 회고 (1)
      • 2023λ…„ (1)

λΈ”λ‘œκ·Έ 메뉴

  • πŸš€ GitHub

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
Amenable

Amenable's Blog

λ°°μ—΄λ³΄λ‹€λŠ” 리슀트λ₯Ό μ‚¬μš©ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ28)]
πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

λ°°μ—΄λ³΄λ‹€λŠ” 리슀트λ₯Ό μ‚¬μš©ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ28)]

2023. 5. 30. 00:04

1. λ°°μ—΄κ³Ό μ œλ„€λ¦­ νƒ€μž…μ˜ 차이 πŸ¦—

πŸ“— 1. 배열은 곡변이고, μ œλ„€λ¦­μ€ λΆˆκ³΅λ³€μ΄λ‹€.

  • 배열은 κ³΅λ³€(Convariant)이닀.
    Subκ°€ Super의 ν•˜μœ„ νƒ€μž…이라면 Sub[]λŠ” λ°°μ—΄ Super[]의 ν•˜μœ„ νƒ€μž…이닀.
  • μ œλ„€λ¦­μ€ λΆˆκ³΅λ³€(Invariant)이닀.
    μ„œλ‘œ λ‹€λ₯Έ νƒ€μž… Type1κ³Ό Type2κ°€ μžˆμ„ λ•Œ, List<Type1>은 List<Type2>의 ν•˜μœ„ νƒ€μž…도 μ•„λ‹ˆκ³  μƒμœ„ νƒ€μž…도 μ•„λ‹ˆλ‹€.

 

  곡변과 λΆˆκ³΅λ³€ 쀑 μ–΄λŠ μͺ½μ΄ λ¬Έμ œκ°€ μžˆμ„κΉŒ? μ½”λ“œλ₯Ό ν†΅ν•΄ μ•Œμ•„λ³΄μž.

public static void main(String[] args) {
    // λ°°μ—΄
    Object[] objectArray = new Long[1];
    objectArray[0] = "νƒ€μž…μ΄ λ‹¬λΌμ„œ 넣을 수 μ—†λ‹€."; // ArrayStoreException (λŸ°νƒ€μž„μ— λ°œμƒ)

    // μ œλ„€λ¦­
    List<Object> objectList = new ArrayList<Long>(); // ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” νƒ€μž…μ΄λ‹€. (μ»΄νŒŒμΌμ— λ°œμƒ)
    objectList.add("νƒ€μž…μ΄ λ‹¬λΌμ„œ 넣을 수 μ—†λ‹€.");
}

  λ°°μ—΄κ³Ό μ œλ„€λ¦­ λͺ¨λ‘ Long용 μ €μž₯μ†Œμ— String을 넣을 수 μ—†λ‹€. λ‹€λ§Œ λ°°μ—΄μ—μ„œλŠ” κ·Έ μ‹€μˆ˜λ₯Ό λŸ°νƒ€μž„에 μ•Œκ²Œ λ˜μ§€λ§Œ, λ¦¬μŠ€νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄ μ»΄νŒŒμΌν•  λ•Œ λ°”λ‘œ μ•Œ μˆ˜ μžˆλ‹€.

  λŸ°νƒ€μž„μ— μ‹€μˆ˜λ₯Ό μ•Œμ•„μ°¨λ¦¬λŠ” 것보닀 컴파일 μ‹œμ μ— μ‹€μˆ˜λ₯Ό μ•Œμ•„μ°¨λ¦¬λŠ” 게 더 λ‚˜μ„ 것이닀.

 

πŸ“— 2. λ°°μ—΄μ€ μ‹€μ²΄ν™”(reify)되고, μ œλ„€λ¦­μ€ νƒ€μž… μ •보가 μ†Œκ±°λœλ‹€.

  배열은 싀체화(reify)λœλ‹€. 배열은 λŸ°νƒ€μž„μ—λ„ μžμ‹ μ΄ λ‹΄κΈ°λ‘œ ν•œ μ›μ†Œμ˜ νƒ€μž…μ„ μΈμ§€ν•˜κ³  ν™•μΈν•œλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— Long배열에 String을 λ„£μœΌλ €κ³  ν•˜λ©΄ ArrayStoreException이 λ°œμƒν•œλ‹€.

public static void main(String[] args) {
    Object[] objectArray = new Long[1];
    objectArray[0] = "νƒ€μž…μ΄ λ‹¬λΌμ„œ 넣을 수 μ—†λ‹€."; // ArrayStoreException (λŸ°νƒ€μž„μ— λ°œμƒ)
}

  λ°˜λ©΄μ— μ œλ„€λ¦­μ€ νƒ€μž… 정보가 λŸ°νƒ€μž„μ—λŠ” μ†Œκ±°(erasure)λœλ‹€. μ›μ†Œ νƒ€μž…을 μ»΄νŒŒμΌνƒ€μž„μ—λ§Œ κ²€μ‚¬ν•˜λ©΄ λŸ°νƒ€μž„μ—λŠ” μ•Œ 수쑰차 μ—†κ²Œ λœλ‹€.

 

 

2. μ œλ„€λ¦­ 배열은 μ‚¬μš©ν•  수 μ—†λ‹€. 🐝

  μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ λ°°μ—΄κ³Ό μ œλ„€λ¦­μ˜ 차이점으둜 μΈν•΄μ„œ λ°°μ—΄κ³Ό μ œλ„€λ¦­μ€ 잘 μ–΄μš°λŸ¬μ§€μ§€ λͺ»ν•œλ‹€. κ·Έλž˜μ„œ λ‘˜μ„ μ„žμ–΄ μ“°κΈ°κ°€ μ‰½μ§€ μ•Šλ‹€.

  배열은 μ œλ„€λ¦­ νƒ€μž…, λ§€κ°œλ³€μˆ˜ν™” νƒ€μž…, νƒ€μž… λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•  수 μ—†λ‹€. 즉, μ½”λ“œλ₯Ό new List<E>[], new List<String>[], new E[] μ‹μœΌλ‘œ μž‘μ„±ν•˜λ©΄ μ»΄νŒŒμΌν•  λ•Œ μ œλ„€λ¦­ λ°°μ—΄ μƒμ„± μ˜€λ₯˜κ°€ λ°œμƒν•œλ‹€.

 

  μ œλ„€λ¦­ 배열을 λ§Œλ“€μ§€ λͺ»ν•˜κ²Œ 막은 μ΄μœ λŠ” νƒ€μž…μ΄ μ•ˆμ „ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

  μ œλ„€λ¦­ 배열을 λ§Œλ“€λ„λ‘ ν—ˆμš©ν•˜κ²Œ 되면 μ»΄νŒŒμΌλŸ¬κ°€ μžλ™ μƒμ„±ν•œ ν˜•λ³€ν™˜ μ½”λ“œμ—μ„œ λŸ°νƒ€μž„μ— ClassCastException이 λ°œμƒν•  수 μžˆλ‹€. 이것은 λŸ°νƒ€μž„에 ClassCastException이 λ°œμƒν•˜λŠ” μΌμ„ λ§‰μ•„μ£Όκ² λ‹€λŠ” μ œλ„€λ¦­ νƒ€μž…μ˜ μ·¨μ§€μ— μ–΄κΈ‹λ‚˜λŠ” κ²ƒμ΄λ‹€.

  μ½”λ“œλ₯Ό 톡해 μ œλ„€λ¦­ 배열을 ν—ˆμš©ν•˜λ©΄ μ–΄λ–»κ²Œ λ˜λŠ”μ§€ μ‚΄νŽ΄λ³΄μž.

List<String>[] stringLists = new List<String>[1]; // (1)

List<Integer> intList = List.of(42); // (2)
Object[] objects = stringLists; // (3)

objects[0] = intList; // (4)

String s = stringLists[0].get(0); // (5)
  1. (1)이 ν—ˆμš©λœλ‹€κ³  κ°€μ •ν•΄ 보자.
  2. (2)λŠ” μ›μ†Œκ°€ ν•˜λ‚˜μΈ List<Integer>λ₯Ό μƒμ„±ν•œλ‹€.
  3. (3)은 (1)μ—μ„œ μƒμ„±ν•œ List<String>의 λ°°μ—΄μ„ Object λ°°μ—΄μ— ν• λ‹Ήν•œλ‹€. λ°°μ—΄μ€ κ³΅λ³€μ΄κΈ° λ•Œλ¬Έμ—  Object λ°°μ—΄μ— List<String> λ°°μ—΄μ„ ν• λ‹Ήν•  μˆ˜ μžˆλ‹€.
  4. (4)λŠ” (2)μ—μ„œ μƒμ„±ν•œ List<Integer>의 μΈμŠ€ν„΄μŠ€λ₯Ό Object λ°°μ—΄μ˜ μ²« μ›μ†Œλ‘œ μ €μž₯ν•œλ‹€. μ œλ„€λ¦­μ€ μ†Œκ±° λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λ˜κΈ° λ•Œλ¬Έμ— μ΄κ²ƒ λ˜ν•œ κ°€λŠ₯ν•˜λ‹€.
  5. (5)μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€. (1)~(4)의 κ³Όμ •을 κ±°μΉ˜λ©΄μ„œ (1)μ—μ„œ List<String>만 λ‹΄μœΌλ €κ³  ν–ˆλ˜ λ°°μ—΄μ— List<Integer>κ°€ λ‹΄κ²¨ μžˆλŠ” κ²ƒμ΄λ‹€. κ·Έλž˜μ„œ (5)μ—μ„œ μ»΄νŒŒμΌλŸ¬λŠ” κΊΌλ‚Έ μ›μ†Œλ₯Ό μžλ™μœΌλ‘œ String으둜 ν˜•λ³€ν™˜ν•˜λŠ”λ°, μ΄ μ›μ†ŒλŠ” Integerμ΄λ―€λ‘œ λŸ°νƒ€μž„에 ClassCastException이 λ°œμƒν•œλ‹€.

  κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ²˜μŒλΆ€ν„° μ œλ„€λ¦­ 배열이 μƒμ„±λ˜μ§€ μ•Šλ„λ‘ (1)μ—μ„œ 컴파일 였λ₯˜κ°€ λ‚˜μ•Ό ν•œλ‹€.

 

 

3. 배열을 리슀트둜 λŒ€μ²΄ν•˜λŠ” 방법 🐞

  μ»¬λ ‰μ…˜ μ•ˆμ˜ μ›μ†Œ 쀑 ν•˜λ‚˜λ₯Ό λ¬΄μž‘μœ„λ‘œ 선택해 λ°˜ν™˜ν•˜λŠ” choose λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λŠ” 클래슀λ₯Ό μ‚΄νŽ΄λ³΄μž.

public class Chooser_Array {

    private final Object[] choiceList;

    public Chooser_Array(Collection choices) {
        choiceList = choices.toArray();
    }

    public Object choose() {
        Random rnd = ThreadLocalRandom.current();
        return choiceList[rnd.nextInt(choiceList.length)];
    }
}

  이 클래슀λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ choose λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ λ°˜ν™˜λœ Objectλ₯Ό μ›ν•˜λŠ” νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•΄μ•Ό ν•œλ‹€.

public static void main(String[] args) {
    List<Integer> intList = List.of(1, 2, 3, 4, 5);
    Chooser_Array chooser = new Chooser_Array(intList);

    for(int i = 0; i < intList.size(); i++){
        Number choice = (Number) chooser.choose(); // μ˜¬λ°”λ₯΄κ²Œ ν˜•λ³€ν™˜μ„ ν•œ 경우
        System.out.println(choice);
    }
}

  ν•˜μ§€λ§Œ μœ„μ™€ 같이 μ˜¬λ°”λ₯΄κ²Œ ν˜•λ³€ν™˜ ν•  μˆ˜λ„ μžˆμ§€λ§Œ, μ•„λž˜μ™€ 같이 μ˜¬λ°”λ₯΄μ§€ μ•Šκ²Œ ν˜•λ³€ν™˜ ν•  μˆ˜λ„ μžˆλ‹€.

public static void main(String[] args) {
    List<String> intList = List.of("amenable", "choi");
    Chooser_Array chooser = new Chooser_Array(intList);

    for(int i = 0; i < intList.size(); i++){
        Number choice = (Number) chooser.choose(); // μ˜¬λ°”λ₯΄μ§€ μ•Šκ²Œ ν˜•λ³€ν™˜μ„ ν•œ 경우
        System.out.println(choice);
    }
}

 

  이런 상황을 μ˜ˆλ°©ν•˜κΈ° μœ„ν•΄μ„œ μ œλ„€λ¦­μ„ μ‚¬μš©ν•  μˆ˜ μžˆλ‹€.

public class Chooser_Array<T> {
    private final Object[] choiceList;

    @SuppressWarnings("unchecked")
    public Chooser_Array(Collection<T> choices) {
        choiceList = (T[]) choices.toArray(); // Unchecked cast: 'java.lang.Object[]' to 'T[]'
    }

    @SuppressWarnings("unchecked")
    public Object choose() {
        Random rnd = ThreadLocalRandom.current();
        return choiceList[rnd.nextInt(choiceList.length)];
    }
}

public static void main(String[] args) {
    List<Integer> intList = List.of(1, 2, 3, 4, 5);

    Chooser_Array chooser = new Chooser_Array(intList);

    for(int i = 0; i < intList.size(); i++){
        Number choice = (Number) chooser.choose();
        System.out.println(choice);
    }
}

  'choiceList = (T[]) choices.toArray();'μ—μ„œ νƒ€μž… μ•ˆμ „μ„±μ„ μ»΄νŒŒμΌλŸ¬κ°€ 보μž₯ν•˜μ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ— κ²½κ³ κ°€ λœ¬λ‹€. 믈둠 μ½”λ“œμ— μžˆλŠ” κ²ƒμ²˜λŸΌ @SuppressWarningsλ₯Ό μ΄μš©ν•΄μ„œ κ²½κ³ λ₯Ό μ—†μ•¨ μˆ˜ μžˆλ‹€.

 

  ν•˜μ§€λ§Œ, μ•„μ˜ˆ κ²½κ³ κ°€ λœ¨μ§€ μ•Šλ„λ‘ ν•˜λŠ” 더 쒋은 방법은 배열이 μ•„λ‹Œ 리슀트λ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.

public class Chooser_Array<T> {
    private final List<T> choiceList;

    public Chooser_Array(Collection<T> choices) {
        choiceList = new ArrayList<>(choices);
    }

    public T choose() {
        Random rnd = ThreadLocalRandom.current();
        return choiceList.get(rnd.nextInt(choiceList.size()));
    }
}

public static void main(String[] args) {
    List<Integer> intList = List.of(1, 2, 3, 4, 5);

    Chooser_Array<Integer> chooser = new Chooser_Array<>(intList);

    for(int i = 0; i < intList.size(); i++){
        Number choice = chooser.choose(); // ν˜•λ³€ν™˜μ„ ν•  ν•„μš”κ°€ μ—†λ‹€.
        System.out.println(choice);
    }
}

  μ΄λ ‡κ²Œ ν•˜λ©΄ κ²½κ³  없이 μ»΄νŒŒμΌλœλ‹€. λ˜ν•œ, choose λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ ν˜•λ³€ν™˜μ„ ν•  ν•„μš”λ„ μ—†μ–΄μ§„λ‹€.

  κ·Έλž˜μ„œ λ§Œμ•½ λ°°μ—΄κ³Ό μ œλ„€λ¦­μ„ μ„žμ–΄ μ“°λ‹€κ°€ 컴파일 였λ₯˜λ‚˜ κ²½κ³ λ₯Ό λ§Œλ‚˜λ©΄, κ°€μž₯ λ¨Όμ € 배열을 리슀트둜 λŒ€μ²΄ν•˜λŠ” 방법을 μ μš©ν•΄ 보도둝 ν•˜μž.

 

ν•΄λ‹Ή 글은 λ°±κΈ°μ„  λ‹˜μ˜ 'μ΄νŽ™ν‹°λΈŒ μžλ°” μ™„λ²½ 곡랡'을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

'πŸ“‚ JAVA > μ΄νŽ™ν‹°λΈŒ μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

이왕이면 μ œλ„€λ¦­ λ©”μ„œλ“œλ‘œ λ§Œλ“€λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ30)]  (0) 2023.05.31
이왕이면 μ œλ„€λ¦­ νƒ€μž…μœΌλ‘œ λ§Œλ“€λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ29)]  (1) 2023.05.30
비검사 κ²½κ³ λ₯Ό μ œκ±°ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ27)]  (0) 2023.05.23
둜 νƒ€μž…μ€ μ‚¬μš©ν•˜μ§€ 말라 - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ26)]  (0) 2023.05.23
ν†±λ ˆλ²¨ ν΄λž˜μŠ€λŠ” ν•œ νŒŒμΌμ— ν•˜λ‚˜λ§Œ λ‹΄μœΌλΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ25)]  (0) 2023.05.08
    'πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • 이왕이면 μ œλ„€λ¦­ λ©”μ„œλ“œλ‘œ λ§Œλ“€λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ30)]
    • 이왕이면 μ œλ„€λ¦­ νƒ€μž…μœΌλ‘œ λ§Œλ“€λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ29)]
    • 비검사 κ²½κ³ λ₯Ό μ œκ±°ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ27)]
    • 둜 νƒ€μž…μ€ μ‚¬μš©ν•˜μ§€ 말라 - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ26)]
    Amenable
    Amenable
    CS, μžλ°”, 자료ꡬ쑰, μ•Œκ³ λ¦¬μ¦˜, μŠ€ν”„λ§, μŠ€ν”„λ§ λΆ€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” κ°œλ°œμ— κ΄€ν•œ λ‚΄μš©μ„ κ³΅μœ ν•©λ‹ˆλ‹€.

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”