hades

[๋ชจ๋˜ ์ž๋ฐ” ์ธ ์•ก์…˜] ์ปฌ๋ ‰์…˜ API ๊ฐœ์„  ๋ณธ๋ฌธ

๐Ÿƒ๐Ÿป‍โ™‚๏ธ ๊ธฐ๋ณธํ›ˆ๋ จ/Java

[๋ชจ๋˜ ์ž๋ฐ” ์ธ ์•ก์…˜] ์ปฌ๋ ‰์…˜ API ๊ฐœ์„ 

hades1 2024. 9. 20. 00:10

์ปฌ๋ ‰์…˜ ํŒฉํ† ๋ฆฌ

์ž๋ฐ”์—์„œ ์ ์€ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊นŒ?

List<String> friends = new ArrayList<>();
friends.add("์งฑ๊ตฌ");
friends.add("๋งน๊ตฌ");
friends.add("์ฒ ์ˆ˜");

์„ธ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ๋„ ๊ท€์ฐฎ๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

List<String> friends = Arrays.asList("์งฑ๊ตฌ", "๋งน๊ตฌ", "์ฒ ์ˆ˜");
friends.add("ํ›ˆ์ด");	// ์—๋Ÿฌ ๋ฐœ์ƒ

๊ณ ์ • ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฏ€๋กœ, ์š”์†Œ๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜๋Š” ์—†๋‹ค. 

 

UnsupportedOperationException ์˜ˆ์™ธ ๋ฐœ์ƒ

๋‚ด๋ถ€์ ์œผ๋กœ ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ๊ตฌํ˜„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚œ๋‹ค.

 

์ง‘ํ•ฉ์˜ ๊ฒฝ์šฐ๋ฅผ ์•Œ์•„๋ณด์ž. ์ง‘ํ•ฉ์—์„œ๋Š” Arrays.asSet()์ด ์—†์œผ๋ฏ€๋กœ, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•œ๋‹ค. 

Set<String> friends = new HashSet<>(Arrays.asList("์งฑ๊ตฌ", "๋งน๊ตฌ", "์ฒ ์ˆ˜"));

Set<String> friends = Stream.of("์งฑ๊ตฌ", "๋งน๊ตฌ", "์ฒ ์ˆ˜").collect(Collectors.toSet());

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ์ž์—ฐ์Šค๋Ÿฝ์ง€ ๋ชปํ•˜๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ํ• ๋‹น์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

 

๋ฆฌ์ŠคํŠธ ํŒฉํ† ๋ฆฌ

List.of ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

List<String> friends = List.of("์งฑ๊ตฌ", "๋งน๊ตฌ", "์ฒ ์ˆ˜");
System.out.println(friends);	// [์งฑ๊ตฌ, ๋งน๊ตฌ, ์ฒ ์ˆ˜]

 

ํ•˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ์—๋„ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. set() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์•„์ดํ…œ์„ ๋ฐ”๊พธ๋ ค๊ณ  ํ•ด๋„ ๊ฐ™์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋‚˜์œ ๊ฒƒ๋งŒ์€ ์•„๋‹ˆ๋‹ค. ์˜๋„์น˜ ์•Š๊ฒŒ ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ, ์š”์†Œ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ๋ง‰์„ ๋ฐฉ๋ฒ•์€ ์—†๋‹ค.

Person person = new Person();
person.setName("์งฑ๊ตฌ");

List<Person> people = List.of(person);
for (Person person1 : people) {
    System.out.println(person1.getName());
}

person.setName("์ฒ ์ˆ˜");
for (Person person1 : people) {
    System.out.println(person1.getName());
}

 

๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์ง์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

 

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ˜•์‹์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ ๊ฐ„ํŽธํ•œ ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

 

์ง‘ํ•ฉ ํŒฉํ† ๋ฆฌ

List.of์™€ ๋น„์Šทํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ถ”๊ฐ€ ์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Set<String> friends = Set.of("์งฑ๊ตฌ", "๋งน๊ตฌ", "์ฒ ์ˆ˜");
System.out.println(friends);

 

๋งต ํŒฉํ† ๋ฆฌ

๋งต์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ‚ค์™€ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ Map.of ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ์— ํ‚ค์™€ ๊ฐ’์„ ๋ฒˆ๊ฐˆ์•„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋งต์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Map<String, Integer> ageOfFamily = Map.of("์งฑ๊ตฌ", 5, "ํ˜•๋งŒ", 30, "๋ฏธ์„ ", 27);
System.out.println(ageOfFamily);

 

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์—”ํŠธ๋ฆฌ๊ฐ€ ๋งŽ์•„์ง€๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค. Map.ofEntries๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Map<String, Integer> ageOfFaimily = Map.ofEntries(Map.entry("์งฑ๊ตฌ", 5),
        Map.entry("ํ˜•๋งŒ", 30),
        Map.entry("๋ฏธ์„ ", 27));

 

๋ฆฌ์ŠคํŠธ์™€ ์ง‘ํ•ฉ ์ฒ˜๋ฆฌ

  • removeIf : ํ”„๋ ˆ๋””์ผ€์ดํŠธ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. List๋‚˜ Set์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • replaceAll : ๋ฆฌ์ŠคํŠธ์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, UnaryOperator ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ๋ฐ”๊พผ๋‹ค.
  • sort : List ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•œ๋‹ค.

์œ„ ๋ฉ”์†Œ๋“œ๋“ค์€ ํ˜ธ์ถœํ•œ ์ปฌ๋ ‰์…˜ ์ž์ฒด๋ฅผ ๋ฐ”๊พผ๋‹ค. ์ŠคํŠธ๋ฆผ์€ ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์ง€๋งŒ, ์œ„ ๋ฉ”์†Œ๋“œ๋“ค์€ ๊ธฐ์กด ์ปฌ๋ ‰์…˜์„ ๋ฐ”๊พผ๋‹ค. ์ปฌ๋ ‰์…˜์„ ๋ฐ”๊พธ๋Š” ๋™์ž‘์€ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•˜๋Š”๋ฐ, ์™œ ์ถ”๊ฐ€๋œ ๊ฒƒ์ผ๊นŒ?

 

removeIf ๋ฉ”์†Œ๋“œ

์•ž์—์„œ ๋ณด์•˜๋˜ List.of๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ–ˆ์„ ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ConcurrentModificationException ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

List<Person> people = new ArrayList<>();
people.add(new Person("์‹ ์งฑ๊ตฌ"));
people.add(new Person("๊น€์ฒ ์ˆ˜"));
people.add(new Person("๋งน๊ตฌ"));

for (Person person : people) {
    if ("์‹ ".equals(person.getName().substring(0, 1))){
        people.remove(person);
    }
}

 

for-each ๋ฃจํ”„๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ๋“ค์—ฌ๋‹ค๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

for (Iterator<Person> iterator = people.iterator(); iterator.hasNext();){
    Person person = iterator.next();
    if ("์‹ ".equals(person.getName().substring(0, 1))){
        people.remove(person);
    }
}

๋ฐ˜๋ณต์ž ๊ฐ์ฒด์™€ ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ์ปฌ๋ ‰์…˜์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๋‘˜์˜ ์ƒํƒœ๊ฐ€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์•„์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ removeIf๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

people.removeIf(person -> "์‹ ".equals(person.getName().substring(0, 1)));
for (Person person : people) {
    System.out.println(person.getName());
}

// ๊น€์ฒ ์ˆ˜
// ๋งน๊ตฌ

 

replaceAll ๋ฉ”์†Œ๋“œ

์ด์™€ ๊ฐ™์€ ์›๋ฆฌ๋กœ replaceAll์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

people.replaceAll(person -> new Person(person.getName().substring(1)));
for (Person person : people) {
    System.out.println(person.getName());
}

์ค‘์š”ํ•œ ๊ฒƒ์€ ์š”์†Œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค. ์š”์†Œ์˜ ์†์„ฑ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋งต ์ฒ˜๋ฆฌ

forEach ๋ฉ”์†Œ๋“œ

๋งต์—์„œ ํ‚ค์™€ ๊ฐ’์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Map<String, Integer> ageOfPeople = new HashMap<>();
ageOfPeople.put("์งฑ๊ตฌ", 5);
ageOfPeople.put("์ฒ ์ˆ˜", 5);
for (Map.Entry<String, Integer> entry : ageOfPeople.entrySet()) {
    String person = entry.getKey();
    Integer age = entry.getValue();
    System.out.println(person + "is " + age + "years old."
}

 

์ž๋ฐ” 8์—์„œ๋ถ€ํ„ฐ ํ‚ค์™€ ๊ฐ’์„ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š” BiConsumer๋ฅผ ์ด์šฉํ•œ forEach ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ageOfPeople.forEach((person, age) -> System.out.println(person + "is " + age + "years old."));

 

์ •๋ ฌ ๋ฉ”์†Œ๋“œ

  • Entry.comparingByValue
  • Entry.comparingByKey
Map<String, String> favouriteMovies = Map.ofEntries(Map.entry("Raphael", "Start Wars")
        , Map.entry("Cristina", "Matrix")
        , Map.entry("Olivia", "James Bond"));

favouriteMovies.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEachOrdered(System.out::println);

 

getOrDefault ๋ฉ”์†Œ๋“œ

System.out.println(favouriteMovies.getOrDefault("Olivia", "Home Along"));	// James Bond
System.out.println(favouriteMovies.getOrDefault("Mattew", "Home Along")); 	// Home Along

 

์‚ญ์ œ ํŒจํ„ด

remove๋Š” ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•œ๋‹ค. ์ž๋ฐ” 8์—์„œ๋Š” ์ง€์ •ํ•œ ํ‚ค์™€ ๊ฐ’์ด ์ผ์น˜ํ•ด์•ผ ์‚ญ์ œํ•˜๋Š” ์˜ค๋ฒ„๋กœ๋“œ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

favouriteMovies.remove(key, value);

 

๊ต์ฒด ํŒจํ„ด

replaceAll์€ ๊ฐ ํ•ญ๋ชฉ์˜ ๊ฐ’์„ ๊ต์ฒดํ•œ๋‹ค.

favouriteMovies.replaceAll((person, movie) -> movie.toUpperCase());
System.out.println(favouriteMovies);

 

ConcurrentHashMap

ConcurrentHashMap ํด๋ž˜์Šค๋Š” ๋™์‹œ์„ฑ ์นœํ™”์ ์ด๋ฉด์„œ, ์ตœ์‹  ๊ธฐ์ˆ ์„ ๋ฐ˜์˜ํ•œ HashMap ๋ฒ„์ „์ด๋‹ค. ๋‚ด๋ถ€ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์ • ๋ถ€๋ถ„๋งŒ ์ž ๊ถˆ ๋™์‹œ ์ถ”๊ฐ€, ๊ฐฑ์‹  ์ž‘์—…์„ ํ—ˆ์šฉํ•œ๋‹ค.

 

์—ฐ์‚ฐ

  • forEach : ๊ฐ๊ฐ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ์•ก์…˜์„ ์‹คํ–‰
  • reduce : ๋ฆฌ๋“€์Šค ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฒฐ๊ณผ๋กœ ํ•ฉ์นจ
  • search : ๋„์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ๊ฐ๊ฐ์— ํ•จ์ˆ˜ ์ ์šฉ

์œ„ 3๊ฐ€์ง€ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์„ ๋ฐ”ํƒ•์œผ๋กœ, ์•„๋ฌด๊ฒƒ๋„ ์•ˆ๋ถ™์œผ๋ฉด (ํ‚ค, ๊ฐ’)์— ๋Œ€ํ•ด์„œ, Key๊ฐ€ ๋ถ™์œผ๋ฉด ํ‚ค์— ๋Œ€ํ•ด์„œ๋งŒ, Value๊ฐ€ ๋ถ™์œผ๋ฉด ๊ฐ’์— ๋Œ€ํ•ด์„œ๋งŒ, Entry๊ฐ€ ๋ถ™์œผ๋ฉด Map.entry ๊ฐ์ฒด๋กœ ์—ฐ์‚ฐํ•œ๋‹ค.

 

์ด๋“ค ์—ฐ์‚ฐ์€ ConcurrentHashMap์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋“ค ์—ฐ์‚ฐ์— ์ œ๊ณต๋˜๋Š” ํ•จ์ˆ˜๋Š” ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

 

์ด๋“ค ์—ฐ์‚ฐ์— ๋ณ‘๋ ฌ์„ฑ ๊ธฐ์ค€๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋งต์˜ ํฌ๊ธฐ๊ฐ€ ์ฃผ์–ด์ง„ ๊ธฐ์ค€๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•œ๋‹ค. ๊ธฐ์ค€๊ฐ’์„ 1๋กœ ์‹คํ–‰ํ•˜๋ฉด, ๊ณตํ†ต ์Šค๋ ˆ๋“œ ํ’€์„ ์ด์šฉํ•ด ๋ณ‘๋ ฌ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. Long.MAX_VALUE๋ฅผ ๊ธฐ์ค€๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด, ํ•œ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋กœ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•œ๋‹ค.

ConcurrentHashMap<String, Long> map = new ConcurrentHashMap<>();
long parallelismThreshold = 1;
Optional<Long> maxValue = Optional.ofNullable(map.reduceValues(1, Long::max));

 

๊ณ„์ˆ˜

ConcurrentMap ํด๋ž˜์Šค๋Š” ๋งต์˜ ๋งคํ•‘ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” mappingCount ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. size์™€ ๋น„์Šทํ•˜์ง€๋งŒ long ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฒ”์œ„๊ฐ€ ๋” ๋„“๋‹ค.

 

์ง‘ํ•ฉ ๋ทฐ

HashMap์—์„œ keySet์€ ์ง‘ํ•ฉ ๋ทฐ์ด๋‹ค. map.keySet()์„ ํ•˜๊ฒŒ ๋˜๋ฉด, map์— ์žˆ๋Š” ํ‚ค๋“ค๋กœ ์ง‘ํ•ฉ ๋ทฐ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. ์ง‘ํ•ฉ์„ ๋ฐ”๊พธ๋ฉด, map๋„ ๋ณ€ํ™”ํ•˜๊ณ , map์„ ๋ฐ”๊พธ๋ฉด ์ง‘ํ•ฉ๋„ ๋ณ€ํ™”ํ•œ๋‹ค.

 

ConcurrentHashMap์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” newKeySet ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.