JAVA & OOP

JAVA :: Optional ํด๋ž˜์Šค ๊ฐœ๋…์ •๋ฆฌ

DAHLIA CHOI 2022. 7. 31. 22:10

Optional<T>์ด๋ž€?

Optional<T>์€ ์ง€๋„ค๋ฆญ ํด๋ž˜์Šค๋กœ 'Tํƒ€์ž… ๊ฐ์ฒด'๋ฅผ ๊ฐ์‹ธ๋Š” wrapper ํด๋ž˜์Šค์ด๋‹ค.

๋”ฐ๋ผ์„œ Optionalํƒ€์ž…์˜ ๊ฐ์ฒด์—๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.

 

์ตœ์ข… ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ƒฅ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Optional๊ฐ์ฒด์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

๊ทธ๋Ÿฌ๋ฉด ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ๊ฐ€ null์ธ์ง€ if๋ฌธ์œผ๋กœ ์ฒดํฌํ•˜์ง€ ์•Š์•„๋„ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐ŸŸช Optional ๊ฐ์ฒด ์ƒ์„ฑ

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” of() ๋˜๋Š” ofNullable()์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ null์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด of()๋ง๊ณ  ofNullable()์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. of()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ด null์ด๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

String str = "hi"
Optional<String> opt = Optional.of(str);
Optional<String> opt = Optional.of("hi");
Optional<String> opt = Optional.of(new String("hi"));

Optional<String> opt = Optional.ofNullable(null);

 

๐Ÿ–ค ์ฐธ์กฐ๋ณ€์ˆ˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”

Optional<T>ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ๋Š” empty()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

null๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ์ถ”์ฒœํ•˜์ง„ ์•Š๋Š”๋‹ค.

Optional<String> opt = null; //null๋กœ ์ดˆ๊ธฐํ™”
Optional<String> opt = Optional.<String>empty(); //๋นˆ ๊ฐ์ฒด๋กœ ์ดˆ๊ธฐํ™”
empty()์•ž์˜ <T>๋Š” ์ถ”์ • ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

๐ŸŸช Optional ๊ฐ์ฒด ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

๊ฐ์ฒด์— ์ €์žฅ๋œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” get()์„ ์‚ฌ์šฉํ•œ๋‹ค. 

๊ฐ’์ด null์ผ ๋•Œ๋Š” NoSuchElementException์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋Œ€๋น„ํ•ด์„œ orElse()๋กœ ๋Œ€์ฒดํ•  ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Optional<String> opt = Optional.of("abc");
String str1 = opt.get();
String str2 = opt.orElse(""); // opt์— ์ €์žฅ๋œ ๊ฐ’์ด null์ผ ๋•Œ๋งŒ ""๊ฐ’ ๋ฐ˜ํ™˜

 

๐Ÿ–ค orElse()์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ๋“ค

 

โ—พ orElseGet()

null์„ ๋Œ€์ฒดํ•  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋žŒ๋‹ค์‹์„ ์ง€์ •

String str3 = opt.orElseGet(String::New);
() -> new String ๊ณผ ๋™์ผ

 

โ—พ orElseThrow()

null์ผ ๋•Œ ์ง€์ •๋œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ด

String str4 = opt.orElseThrow(NullPointerException::new);
null์ผ ๋•Œ NullPointerException ๋ฐœ์ƒ ์‹œํ‚ด

 

 

๐Ÿ–ค filter(), map(), flatMap()์‚ฌ์šฉ ๊ฐ€๋Šฅ

Stream์ฒ˜๋Ÿผ Optional๋„ ์œ„ ์„ธ๊ฐœ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

int result = Optional.of("123").filter(x -> x.length() > 0)
                    .map(Integer::parseInt).orElse(-1);
๊ฐ’์˜ ๊ธธ์ด๊ฐ€ 0๋ณด๋‹ค ํด ๋•Œ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , 0๋ณด๋‹ค ์ž‘์„ ๋•Œ๋Š” -1์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๐Ÿ–ค isPresent()

isPresent()๋Š” Optional๊ฐ์ฒด์˜ ๊ฐ’์ด null์ด๋ฉด false๋ฅผ, ์•„๋‹ˆ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ฐ’์ด ์žˆ์œผ๋ฉด ์ฃผ์–ด์ง„ ๋žŒ๋‹ค์‹์„ ์‹คํ–‰ํ•˜๊ณ , ์—†์œผ๋ฉด ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

if(str != null){
	System.out.println(str);
}

์ด๋Ÿฐ ์กฐ๊ฑด๋ฌธ์„ isPresent()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

if(Optional.ofNullable(str).isPresent()){
	System.out.println(str);
}

 

โž• ifPresent()๋ฅผ ์ด์šฉํ•ด๋„ ๋œ๋‹ค.

ifPresent()๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ null์ด ์•„๋‹ ๋•Œ๋งŒ ์ถœ๋ ฅํ•˜๊ณ , null์ด๋ฉด ์•„๋ฌด ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

Optional.ofNullable(str).ifPresent(System.out::println);

 

๐ŸŸช Optional ํด๋ž˜์Šค

Optional<T> T          get()
OptionalInt int         getAsInt()
OptionalLong long      get AsLong()
OptionalDouble double  getAsDouble()

 

โž• ๋งŒ์•ฝ OptionalInt๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์น˜๋ฉด, 0์„ ์ €์žฅํ•œ Optional ๊ฐ์ฒด์™€ empty๋กœ ์ดˆ๊ธฐํ™”ํ•œ Optional๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ๋‘ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅด๋‹ค๊ณ  ์ธ์‹ํ•œ๋‹ค. !!! ํ•˜์ง€๋งŒ ๊ทธ๋ƒฅ Optional๋กœ ์ €์žฅํ•œ ๊ฐ์ฒด๋Š” ๋‘˜์ด ๊ฐ™๋‹ค๊ณ  ์ธ์‹ํ•œ๋‹ค.