๐Ÿ‘€[JAVA] For๊ณผ Stream์€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๊ฑธ๊นŒ?

๋žธ๋‚˜ยท2023๋…„ 7์›” 31์ผ
3

๋žธ๋‚˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
2/2

์ฝ”ํ…Œ๋ฅผ ํ’€๋•Œ ๋‚˜๋Š” ๋ณดํ†ต ์›์‹œ For๋ฌธ์„ ํ™œ์šฉํ•ด์„œ ๋ฐ˜๋ณต๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค! ์ด์œ ๋Š”... ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชฐ๋ž๊ธฐ ๋•Œ๋ฌธ!
๊ทธ๋Ÿฐ๋ฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ์‚ดํŽด๋ณด๋‹ค๋ณด๋ฉด stream์ด๋ผ๋Š” api๋ฅผ ํ†ตํ•ด ์•„์ฃผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•œ ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์•˜๋‹ค. (ํ•œ์ค„์ขŒ..)

๊ทธ๋ž˜์„œ for๋ฌธ๊ณผ stream์˜ ์ฐจ์ด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ด์ ธ์„œ ์—ฌ๋Ÿฌ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ณด๊ณ  ์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

(๋ชจ๋“  ์ž๋ฃŒ๋“ค์€ ์•„๋ž˜ ์ถœ์ฒ˜๋“ค์—์„œ ๋ฐœ์ทŒํ–ˆ์Œ์„ ์‚ฌ์ „์— ๋ฐํž™๋‹ˆ๋‹ค!)

๐Ÿ•ต๏ธโ€โ™‚๏ธ for๊ณผ stream์˜ ์ฐจ์ด์ 

์›์‹œ for๋ฌธํ–ฅ์ƒ๋œ for๋ฌธstream
ํ˜•์‹for(์ดˆ๊ธฐํ™” ; ์กฐ๊ฑด ; ํ›„์ฒ˜๋ฆฌ)for( Integer i : list)stream ์ƒ์„ฑ -> ์ค‘๊ฐ„ ์—ฐ์‚ฐ -> ์ตœ์ข… ์—ฐ์‚ฐ
๋“ฑ์žฅ ์‹œ๊ธฐjava1๋ถ€ํ„ฐjava5 ๋ถ€ํ„ฐ ๋“ฑ์žฅjava8๋ถ€ํ„ฐ ๋“ฑ์žฅ
ํŠน์ง•๋Œ€์ฒด๋กœ ๊ฐ€์žฅ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ž„๊ฐ€๋…์„ฑ & ์•ˆ์ •์„ฑ ์ฆ๊ฐ€๊ฐ€๋…์„ฑ ์ฆ๊ฐ€

1. ์›์‹œ for๋ฌธ

// ์ „ํ†ต์ ์ธ for๋ฌธ
public static void mian(String[] args){
	List<Integer> list = List.of(1,2,3,4,5);
    	for(int i = 0 ; i <list.size(); i ++){
    		System.out.println(list.get(i));
          		  }
     }

์ „ํ˜•์ ์ธ for ๋ฌธ์ด๋‹ค!

2. ํ–ฅ์ƒ๋œ for ๋ฌธ

//for each
public static void main(String[] args){
	List<Integer> list = List.of(1,2,3,4,5);
	for(Integer i : list){
    	System.out.println(i);
		}
 }

์ „ํ†ต ๋ฐฉ์‹์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋‹ค๋ณด๋ฉด java.lang.IndexOutOfBoundsException: Index: 6, Size: 5 ์™€ ๊ฐ™์€ ๋‚ด๋ถ€ ์ธ๋ฑ์Šค๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๋ฐ˜๋ณต๋ฌธ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด์„œ ์ด๋Ÿฐ ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผ์นœ ์ ์ด ๊ผญ ์žˆ์„ํ…๋ฐ, ํ–ฅ์ƒ๋œ for each๋ฌธ์€ ์ด๋Ÿฌํ•œ ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผ์น  ์ผ์ด ์—†๋‹ค.

๋ฐฐ์—ด ํ˜น์€ ๋ฆฌ์ŠคํŠธ์˜ ์ธ๋ฑ์Šค๋กœ ๋ฐ˜๋ณต์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‚ด๋ถ€ ์›์†Œ๋“ค์„ ๋ชจ๋‘ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ.

๊ทธ๋ž˜์„œ ์•ˆ์ •์„ฑ์ด ์ฆ๊ฐ€๋œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

3. stream

//stream
public void introduceStream(List<Integer> numbers){
	return numbers.stream()
    			.filter(number -> number > 5)
                .map(Distance::new)
                .collect(Collectors.toList());
}

java8 ๋ถ€ํ„ฐ ๋“ฑ์žฅํ•œ stream์˜ ํ˜•ํƒœ.
stream ์ƒ์„ฑ -> ์ค‘๊ฐ„ ์—ฐ์‚ฐ -> ์ตœ์ข… ์—ฐ์‚ฐ์˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•จ.

๐Ÿ•ต๏ธโ€โ™‚๏ธ for๊ณผ stream์˜ ๊ณตํ†ต์ , ๊ทธ๋ ‡๋‹ค๋ฉด ๋ญ˜ ์‚ฌ์šฉํ•ด์•ผํ•˜๋‚˜์š”?

for ๊ณผ stream์€ ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…์— ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

์ฝ”๋“œ ๋ธ”๋ก vs ํ•จ์ˆ˜ ๊ฐ์ฒด

for ๋ฌธ - ์ฝ”๋“œ๋ธ”๋ก

  • ์ฝ”๋“œ๋ธ”๋Ÿญ์œผ๋กœ ํ‘œํ˜„ ๋จ.

stream ํŒŒ์ดํ”„๋ผ์ธ - ํ•จ์ˆ˜ ๊ฐ์ฒด (๋žŒ๋‹ค์‹, ๋ฉ”์„œ๋“œ ์ฐธ์กฐ ์‚ฌ์šฉ)

  • ์ŠคํŠธ๋ฆผ์€ ํ•จ์ˆ˜๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ๋žŒ๋‹ค์‹์ด๋‚˜ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•จ.

  • ์ด๋Š” ํ‘œํ˜„์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•ด์คŒ

  • ๊ทธ๋Ÿฌ๋‚˜, ๋žŒ๋‹ค์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€๋ณ€์ˆ˜(์ง€์—ญ ๋ณ€์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌ. ์ด์™€ ๊ด€๋ จํ•ด์„œ๋Š” ์—ฌ๊ธฐ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์„ค๋ช…์ด ์ž˜ ๋‚˜์™€์žˆ๋‹ค!

  • ์˜ˆ์‹œ
public int subtractByFor(int baseNumber , List<Integer> numbers){
	for(int number: numbers){
    	if(number % 2 ==0){
        	baseNumber -= number;
        }
    }
    
    return baseNumber;
}
public int subtractByStream(int baseNumber, List<Integer> numbers){
	numbers.stream()
    		.filter(number -> number % 2 ==0)
            .forEach(number -> baseNumber -= number); // ์ปดํŒŒ์ผ ์—๋Ÿฌ 
            
    return baseNumber;
}

์ด ์™ธ์—๋„.. stream์€ continue, break๋ฅผ ์ด์šฉํ•œ ๋กœ์ง์€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€!

์™ธ๋ถ€ ๋ฐ˜๋ณต (how) vs ๋‚ด๋ถ€ ๋ฐ˜๋ณต(what)

์ด๋ ‡๊ฒŒ ๋ณด๋ฉด ์กฐ๊ธˆ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์‹ค์€ ๊ฐ„๋‹จํ•œ ๊ฐœ๋…์ด๋‹ค!

public int byFor(List<Integer> numbers) {
	Set<Integer> duplicationRemoved = new HashSet<>();
    for(int number : numbers){
    	duplicationRemoved.add(number);
    }
    return duplicationRemoved.size();
}
  • for๋ฌธ์„ ์‚ฌ์šฉํ•œ ์ค‘๋ณต ์ œ๊ฑฐํ•œ ๋’ค, ๊ทธ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ํ•จ์ˆ˜
  • How(์–ด๋–ป๊ฒŒ) ์ค‘์‹ฌ์œผ๋กœ ์™ธ๋ถ€์— ๋กœ์ง์ด ๋…ธ์ถœ๋˜๋Š” ๊ตฌ์กฐ => ์™ธ๋ถ€๋ฐ˜๋ณต!
public int byStream(List<Integer> numbers) {
	return (int) numbers.stream()
    		.distinct()
            .count();
}
  • stream์„ ์‚ฌ์šฉํ•œ ์ค‘๋ณต ์ œ๊ฑฐํ•œ ๋’ค, ๊ทธ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ํ•จ์ˆ˜
  • what(๋ฌด์—‡์„) ์ค‘์‹ฌ์œผ๋กœ ์ถ”์ƒํ™”๋œ ๋ฉ”์„œ๋“œ๋“ค, ๋กœ์ง์ด ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ => ๋‚ด๋ถ€๋ฐ˜๋ณต!

๊ทธ๋Ÿผ ์–ด๋–ค ๊ฒƒ์ด ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์š”?

์Œ... ๋•Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

์šฐํ…Œ์ฝ” ํ…Œ์ฝ”ํ†ก ๋ฐœํ‘œ ์ž๋ฃŒ๋ฅผ ์บก์ณ๋ณธ์ธ๋ฐ, ํ™•์‹คํžˆ for๋ฌธ๊ณผ if๋ฌธ์ด ์ค‘์ฒฉ๋œ for๋ฌธ๋ณด๋‹ค stream์˜ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„๋ณด์ธ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  stream์ด ํ•ญ์ƒ ๊ฐ€๋…์„ฑ์ด ์ข‹์€๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ์˜คํžˆ๋ ค stream์„ ์ด์šฉํ•œ ์ฒด์ด๋‹ ๋ฐฉ์‹๋ณด๋‹ค ๊ณ ์ „ ์ด์ค‘for๋ฌธ ๋ฐฉ์‹์ด ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค.

๋””๋ฒ„๊น… ์ธก๋ฉด์—์„œ๋Š” ์–ด๋–ค ๊ฒƒ์ด ์ข‹์„๊นŒ?

  1. stream์„ ์‚ฌ์šฉํ–ˆ์„๋•Œ์˜ ์—๋Ÿฌ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค
  • stream์€ ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ๋“ค์„ ์ฐธ์กฐํ•˜๋Š” ํ˜•์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ ์Šคํƒ ํŠธ๋ ˆ์ด์‹ฑ์ด ๋‹ค์†Œ ์–ด๋ ต๋‹ค.
  • ๊ฒŒ์œผ๋ฅธ(์ง€์—ฐ) ์—ฐ์‚ฐ์˜ ํŠน์„ฑ ๋•Œ๋ฌธ์— ๋ผ์ธ์— ๋”ฐ๋ฅธ ์ˆœ์ฐจ์ ์ธ ์—๋Ÿฌ ํŠธ๋ ˆ์ด์‹ฑ์ด ์–ด๋ ค์›€
  • ์ง€์—ฐ ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ (https://bugoverdose.github.io/development/stream-lazy-evaluation/) ์ด ๋งํฌ์—์„œ ์ž์„ธํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค!
  1. for๋ฌธ์„ ์‚ฌ์šฉํ–ˆ์„๋•Œ์˜ ์—๋Ÿฌ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค

    ํ•œ๋ˆˆ์— ๋ด๋„ ์—๋Ÿฌ๊ฐ€ ๊ฐ„๋‹จํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ๋Š” ์–ด๋–ค ๊ฒƒ์ด ์ข‹์„๊นŒ?

์›์‹œ ๋ฐ์ดํ„ฐ

์„ฑ๋Šฅ์€ ๋ณดํ†ต stream๋ณด๋‹ค๋Š” for-loop๊ฐ€ ์ข‹์€ํŽธ์ด๋‹ค. ํŠนํžˆ ์›์‹œํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ• ๋•Œ๋Š” ์œ„ ์ž๋ฃŒ์— ๋‚˜์™€์žˆ๋Š” ์ •๋„๋กœ ์••๋„์ ์œผ๋กœ ์›”๋“ฑํ•˜๋‹ค.

๊ทธ ์ด์œ ๋Š” for-loop์˜ ๊ฐœ๋… ์ž์ฒด๋Š” ๋‚˜์˜จ์ง€ ์ด๋ฏธ ์˜ค๋ž˜๋˜์—ˆ๊ณ , ์‹ญ์ˆ˜๋…„๊ฐ„ JVM์—์„œ ๋‚ด๋ถ€ ์ตœ์ ํ™”๊ฐ€ ์ž˜ ๋˜์–ด์™”๋‹ค. ํ•œํŽธ stream์€ java8์ด ์ถœ์‹œ๋œ 2015๋…„๋„๋ถ€ํ„ฐ ๋‚˜์˜จ ๊ฐœ๋…์ด๊ธฐ๋•Œ๋ฌธ์—, ์ตœ์ ํ™”๊ฐ€ for-loop์— ๋น„ํ•ด์„œ ์ž˜ ๋˜์–ด์žˆ์ง€ ์•Š์€๊ฒƒ์ด๋‹ค.

์ฐธ์กฐ ๋ฐ์ดํ„ฐ

ArrayList์™€ ๊ฐ™์€ ์ฐธ์กฐ ๋ฐ์ดํ„ฐ ํ˜•์‹์—์„œ for๋ฌธ๊ณผ stream์˜ ์‹œ๊ฐ„ ์ฐจ์ด๋Š” ํฌ๊ฒŒ ๋‚˜์ง€ ์•Š๋Š”๋‹ค. (๋ฌผ๋ก  for๋ฌธ์ด ๋ฏธ์„ธํ•˜๊ฒŒ ๋” ์ข‹๊ธฐ๋Š” ํ•˜๋‹ค.)

  • ๊ทธ ์ด์œ ๋Š” ArrayList๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋น„์šฉ ์ž์ฒด๊ฐ€ ๋ฌด์ฒ™์ด๋‚˜ ์ปค์„œ for๋ฌธ์œผ๋กœ ํ•˜๋“ , stream์œผ๋กœ ์กฐํšŒํ•˜๋“  ์†๋„์˜ ์ฐจ์ด๊ฐ€ ๋ฌปํ˜€๋ฒ„๋ฆฌ๋Š” ๊ฒƒ! (์ด๊ฒƒ์€ ์ฐธ์กฐ ๋ฐ์ดํ„ฐ๊ฐ€ heap ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์—ญ์— ์ €์žฅ๋˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š”๋ฐ, ์ด ๋˜ํ•œ ๋ฒ”์œ„๋ฅผ ์กฐ๊ธˆ ๋„˜์–ด๊ฐ€์„œ ๋‚ด๊ฐ€ ์ฐธ๊ณ ํ•œ ์ด ์ž๋ฃŒ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹๊ฒ ๋‹ค!

์‹œ๊ฐ„ ๋ณต์žก๋„์— ๋”ฐ๋ฅธ ์ฐจ์ด

ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์ถฉ๋ถ„ํžˆ ํด๋•Œ(๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋ฐฉ๋Œ€ํ• ๋•Œ)๋Š” for๋ฌธ๊ณผ stream์˜ ์†๋„ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ๋ฏธ๋ฏธํ•˜๋‹ค.

๐Ÿค“ ๊ทธ๋ž˜์„œ.. ๋ญ˜ ์“ฐ๋ผ๊ณ ?

์ •๋ฆฌํ•˜์ž๋ฉด, ์›์‹œํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋งŒ์„ ๋ฐ˜๋ณตํ•˜๊ณ ์‹ถ์„ ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด for๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์ƒ ์ข‹๋‹ค.

๋˜ํ•œ ์ฃผ์‹๊ฑฐ๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” ์„ฑ๋Šฅ์ด ์ตœ์šฐ์„  ๊ฐ€์น˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๊ฐ€์žฅ ๋น ๋ฅธ๊ฒƒ์ด ๋ณด์žฅ๋˜๋Š” for๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋งŽ๊ฑฐ๋‚˜(์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์ปค์ง€๊ฑฐ๋‚˜) ์ฐธ์กฐ ํƒ€์ž…์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์‹ถ์„๋•Œ๋Š” stream์„ ์‚ฌ์šฉํ•ด๋„ ์„ฑ๋Šฅ์ƒ์˜ ์ด์Šˆ๊ฐ€ ํฌ๊ฒŒ ์ฐจ์ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿผ.. ์ด๋Ÿฌ๋‚˜ ์ €๋Ÿฌ๋‚˜ for๋ฌธ์ด ์ข‹์€๊ฒƒ ๊ฐ™์€๋ฐ stream ์“ฐ์ง€ ๋ง๊ณ  for๋งŒ ์จ์•ผํ•˜๋Š”๊ฑฐ ์•„๋‹ˆ์—์š”? ๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค์ˆ˜๋„ ์žˆ๋‹ค.

์‹ค๋ฌด์ ์ธ ๋ถ€๋ถ„์—์„œ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ๋Š” stream์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ฐ–๋Š” ์ด์ ๋„ ํด ๊ฒƒ์ด๋‹ค.

์‹ค์ œ๋กœ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ ์œ ์ง€๋ณด์ˆ˜์— ๋“ค์–ด๊ฐ€๋Š” ๋น„์šฉ์ด ๊ฐ€์žฅ ํฌ๋‹ค๊ณค ํ•˜๋‹ˆ๊นŒ ๋ง์ด๋‹ค.

์ฆ‰, ํ˜„์žฌ ์–ด๋–ค ํ™˜๊ฒฝ์— ์ฒ˜ํ•ด์žˆ๋Š”์ง€์™€ ๋ชฉ์ ์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.


์ฐธ๊ณ ์ž๋ฃŒ

profile
๋ฐฑ์—”๋“œ๊ฐœ๋ฐœ์ž

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 7์›” 31์ผ

์ข‹์€ ๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ž์ฃผ ์˜ฌ๊ฒŒ์š” :)

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ