๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋‚˜์˜ ๋ชจ์–‘

018 | Java - Enum, Annotation, Lambda, Stream ๋ณธ๋ฌธ

SEB/TIL

018 | Java - Enum, Annotation, Lambda, Stream

kexon 2022. 7. 18. 22:31

๐Ÿ’™ Enum

๐Ÿค History of Enum

๋”๋ณด๊ธฐ
  • ์„œ๋กœ ๊ด€๋ จ๋œ ์ƒ์ˆ˜(๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’, final)๋“ค์˜ ์ง‘ํ•ฉ
  • ํ•œ์ •๋˜์–ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ์‚ฌ์šฉ
// ๊ณ„์ ˆ
public static final int SPRING = 1;
public static final int SUMMER = 2;
public static final int AUTUMN = 3;
public static final int WINTER = 4;

// ํ”„๋ ˆ์ž„์›Œํฌ
public static final int DJANGO  = 1;
public static final int SPRING  = 2;
// => ์ปดํŒŒ์ผ์—๋Ÿฌ. ๊ณ„์ ˆ์˜ SPRING๊ณผ ์ค‘๋ณต ๋ฐœ์ƒ!
interface Seasons {
	int SPRING = 1, SUMMER = 2, AUTUMN = 3, WINTER = 4;
}

interface Frameworks {
	int DJANGO = 1, SPRING = 2, NEST = 3, EXPRESS = 4;
}

โ‡’ ์ค‘๋ณต ์ƒ์ˆ˜๋ช… ๋ฌธ์ œ๋Š” ํ”ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํƒ€์ž… ์•ˆ์ •์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€

if(Seasons.SPRING == Frameworks.SPRING) { }

โ‡’ ์˜๋ฏธ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋…์ด์ง€๋งŒ, ์œ„ ๋‘˜์„ ๋น„๊ตํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.

์ด๊ฑธ ํ•ด๊ฒฐํ•ด์ฃผ๋ ค๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผ๋จ

class Seasons {
    public static final Seasons SPRING = new Seasons();
    public static final Seasons SUMMER = new Seasons();
    public static final Seasons FALL   = new Seasons();
    public static final Seasons WINTER = new Seasons();
}

class Frameworks {
    public static final Frameworks DJANGO  = new Frameworks();
    public static final Frameworks SPRING  = new Frameworks();
    public static final Frameworks NEST    = new Frameworks();
    public static final Frameworks EXPRESS = new Frameworks();
}

โ‡’ ์ƒ์ˆ˜๋ช… ์ค‘๋ณต, ํƒ€์ž… ์•ˆ์ •์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ. But, ์ฝ”๋“œ ๊ธธ์–ด์ง. ์‚ฌ์šฉ์ž ์ •์˜ํƒ€์ž…์ด๋ผ switch๋ฌธ์— ์‚ฌ์šฉ ๋ถˆ๊ฐ€

์ด๋ž˜์„œ ๋‚˜์˜จ๊ฒŒ enum

enum Seasons { SPRING, SUMMER, FALL, WINTER }
enum Frameworks { DJANGO, SPRING, NEST, EXPRESS }

๐Ÿค Use Enum

๋”๋ณด๊ธฐ

์—ด๊ฑฐํ˜•์˜ ์‚ฌ์šฉ

enum ์—ด๊ฑฐํ˜•์ด๋ฆ„ {์ƒ์ˆ˜๋ช…1, ์ƒ์ˆ˜๋ช…2, ์ƒ์ˆ˜๋ช…3, ...}

์˜ˆ์‹œ

eums Seasons {
	SPRING,  //์ •์ˆ˜๊ฐ’ 0 ํ• ๋‹น
	SUMMER,  //์ •์ˆ˜๊ฐ’ 1 ํ• ๋‹น
	AUTUMN,  //์ •์ˆ˜๊ฐ’ 2 ํ• ๋‹น
	WINTER   //์ •์ˆ˜๊ฐ’ 3 ํ• ๋‹น
}
  • ์—ด๊ฑฐํ˜•์— ์„ ์–ธ๋œ ์ƒ์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•: ์—ด๊ฑฐํ˜•์ด๋ฆ„.์ƒ์ˆ˜๋ช…
enum Seasons { SPRING, SUMMER, AUTUMN, WINTER }

public class EnumExample {
    public static void main(String[] args) {
        System.out.println(Seasons.SPRING); // SPRING
    }
}
  • ์ฐธ์กฐ๋ณ€์ˆ˜ favouriteSeason์— Seasons.SPRING ๋‹ด๊ธฐ
enum Seasons { SPRING, SUMMER, AUTUMN, WINTER }

public class EnumExample {
    public static void main(String[] args) {
        Seasons favoriteSeason = Seasons.SPRING;
        System.out.println(favoriteSeason); // SPRING
    }
}

โœ… Ref. 

๐Ÿ’™ Annotation

๐Ÿค About Annotation

๋”๋ณด๊ธฐ
  • โ€œ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด์ค„ ๋Œ€์ƒโ€์— ๋ชฉ์ ์„ ๋‘ 
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐœ๋ฐœ์ž/ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ์ •๋ณด ์ œ๊ณต

์• ๋„ˆํ…Œ์ด์…˜์˜ ์—ญํ• 

  • ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ •๋ณด ์ œ๊ณต โ‡’ ๋ฌธ๋ฒ• ์—๋Ÿฌ ์ฒดํฌ
  • ํ”„๋กœ๊ทธ๋žจ ๋นŒ๋“œ ์‹œ ์ •๋ณด ์ œ๊ณต โ‡’ ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ
  • ๋Ÿฐํƒ€์ž„์—๊ฒŒ ์ •๋ณด ์ œ๊ณต โ‡’ ํŠน์ • ๊ธฐ๋Šฅ ์‹คํ–‰

์• ๋„ˆํ…Œ์ด์…˜์˜ ์ข…๋ฅ˜

  • ํ‘œ์ค€ ์• ๋„ˆํ…Œ์ด์…˜: ์ž๋ฐ”์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต
  • ๋ฉ”ํƒ€ ์• ๋„ˆํ…Œ์ด์…˜: ์• ๋„ˆํ…Œ์ด์…˜์— ๋ถ™์ด๋Š” ์• ๋„ˆํ…Œ์ด์…˜
  • ์‚ฌ์šฉ์ž ์ •์˜ ์• ๋„ˆํ…Œ์ด์…˜

๐Ÿค ํ‘œ์ค€ ์• ๋„ˆํ…Œ์ด์…˜ (*)

๋”๋ณด๊ธฐ

@Override

  • ๋ฉ”์„œ๋“œ ์•ž์—๋งŒ ๋ถ™์ผ ์ˆ˜ ์žˆ์Œ
  • ์„ ์–ธํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ผ๋Š” ๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ ค์คŒ
class Super {
	void run() {}
}
class Sub extends Super {
	@Override
	void rnu() {} // ์ปดํŒŒ์ผ ์—๋Ÿฌ - ์˜คํƒ€
}

@Deprecated

  • ์•ž์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ๊ถˆ์žฅํ•˜๋Š” ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ์— ๋ถ™์ž„
class OldClass {
	@Deprecataed
	int oldField;

	@Deprecated
	int getOldField() { return oldField; }
}

โ“์™œ ๋ฉ”์„œ๋“œ๋ฅผ ์—†์• ๋Š” ๊ฒƒ ๋Œ€์‹  @deprecated๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

โ—์ž๋ฐ”๋Š” ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์ค‘์š”์‹œ ์—ฌ๊น€. ํ•˜์œ„ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์— @deprecated๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์•ž์œผ๋กœ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ!

@SuppressWarnings

  • ์ปดํŒŒ์ผ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ œ์™ธ์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉ
  • @SuppressWarnings("all") // ๋ชจ๋“  ๊ฒฝ๊ณ  ์ œ์™ธ
  • ๋‘˜ ์ด์ƒ์˜ ๊ฒฝ๊ณ ๋ฅผ ํ•œ๋ฒˆ์— ์ œ์™ธ
  • @SuppressWarnings({"deprecation", "unused", "null"})

@FunctionalInterface

  • ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•  ๋•Œ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์˜ ์„ ์–ธ์ด ๋ฐ”๋ฅด๊ฒŒ ์„ ์–ธ๋˜์—ˆ๋Š” ์ง€ ํ™•์ธ
    • ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค: ๋‹จ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋งŒ ๊ฐ€์ ธ์•ผ ํ•จ
    @FunctionalInterface
    public interface Runnable {
    	public abstract void run (); // ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ
    }
    
  • ๋ชฉ์ : ๋žŒ๋‹ค์‹ ์‚ฌ์šฉ (1:1 ๋งค์นญ)

๐Ÿค ๋ฉ”ํƒ€ ์• ๋„ˆํ…Œ์ด์…˜

๋”๋ณด๊ธฐ
  • ์• ๋„ˆํ…Œ์ด์…˜์„ ์œ„ํ•œ ์• ๋„ˆํ…Œ์ด์…˜ 
  • ์• ๋„ˆํ…Œ์ด์…˜์˜ ์ ์šฉ๋Œ€์ƒ ๋˜๋Š” ์œ ์ง€ ๊ธฐ๊ฐ„์„ ์ •ํ•˜๋Š” ๋“ฑ ์• ๋„ˆํ…Œ์ด์…˜์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

@Target

  • ์• ๋„ˆํ…Œ์ด์…˜ ์ •์˜ ์‹œ ์ ์šฉ ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • java.lang.annotation.ElementType
  • ์˜ˆ์‹œ
import static java.lang.annotation.ElementType.*; 
//import๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ElementType.TYPE ๋Œ€์‹  TYPE๊ณผ ๊ฐ™์ด ์ž‘์„ฑ ๊ฐ€๋Šฅ

@Target({FIELD, TYPE, TYPE_USE})	// ์ ์šฉ๋Œ€์ƒ: FIELD, TYPE
public @interface CustomAnnotation { }	// ์ •์˜: CustomAnnotation

@CustomAnnotation	// ์ ์šฉ๋Œ€์ƒ์ด TYPE์ธ ๊ฒฝ์šฐ
class Main {
	@CustomAnnotation	// ์ ์šฉ๋Œ€์ƒ์ด FIELD์ธ ๊ฒฝ์šฐ
	int i;
}

@Documented

  • ์• ๋„ˆํ…Œ์ด์…˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ javadoc์œผ๋กœ ์ž‘์„ฑํ•œ ๋ฌธ์„œ์— ํฌํ•จ๋˜๋„๋ก ํ•˜๋Š” ์• ๋„ˆํ…Œ์ด์…˜ ์„ค์ •
  • ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ ์• ๋„ˆํ…Œ์ด์…˜๊ณผ ๋ฉ”ํƒ€ ์• ๋„ˆํ…Œ์ด์…˜ ๋ชจ๋‘ @Documented๊ฐ€ ์ ์šฉ
    (@Override @SuppressWarnings๋ฅผ ์ œ์™ธ)
@Documented
@Target(ElementType.Type)
public @interface CustomAnnotation { }

@Inherited

  • ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์• ๋„ˆํ…Œ์ด์…˜์„ ์ƒ์† โ‡’ ์ƒ์œ„ ํด๋ž˜์Šค์— ๋ถ™์€ ์• ๋„ˆํ…Œ์ด์…˜๋“ค์ด ๋™์ผํ•˜๊ฒŒ ์ ์šฉ
@Inherited // @SuperAnnotation์ด ํ•˜์œ„ ํด๋ž˜์Šค๊นŒ์ง€ ์ ์šฉ
@interface SuperAnnotation{ }

@SuperAnnotation
class Super { }

class Sub extends Super{ } // Sub์— ์• ๋„ˆํ…Œ์ด์…˜์ด ๋ถ™์€ ๊ฒƒ์œผ๋กœ ์ธ์‹

@Retention

  • ์• ๋„ˆํ…Œ์ด์…˜์˜ ์ง€์† ์‹œ๊ฐ„ ๊ฒฐ์ •
  • ์• ๋„ˆํ…Œ์ด์…˜ ์œ ์ง€์ •์ฑ…(์œ ์ง€๋˜๋Š” ๊ธฐ๊ฐ„ ์ง€์ • ์†์„ฑ)
    • SOURCE: ์†Œ์Šค ํŒŒ์ผ์— ์กด์žฌ. ํด๋ž˜์Šค ํŒŒ์ผ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Œ
    • CLASS: ํด๋ž˜์Šค ํŒŒ์ผ์— ์กด์žฌ. ์‹คํ–‰ ์‹œ ์‚ฌ์šฉ๋ถˆ๊ฐ€, ๊ธฐ๋ณธ๊ฐ’
    • RUNTIME: ํด๋ž˜์Šค ํŒŒ์ผ์— ์กด์žฌ. ์‹คํ–‰ ์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE) 
//์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ์ œ๋Œ€๋กœ ๋˜์—ˆ๋Š”์ง€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ™•์ธํ•˜๋Š” ์šฉ๋„ 
//ํด๋ž˜์Šค ํŒŒ์ผ์— ๋‚จ๊ธธ ํ•„์š” ์—†์ด ์ปดํŒŒ์ผ์‹œ์—๋งŒ ํ™•์ธํ•˜๊ณ  ์‚ฌ๋ผ์ง
public @interface Override(){ }

โ‡’ ์œ„ ์˜ˆ์ œ์—์„œ @Override๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ ํ›„ ๋ โ‡’ ์‹คํ–‰ ์‹œ ์‚ฌ์šฉ x

@Repeatable

  • ์• ๋„ˆํ…Œ์ด์…˜ ๋ฐ˜๋ณต ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์‚ฌ์šฉ์ž ํƒ€์ž… ์• ๋„ˆํ…Œ์ด์…˜ ์ •์˜
@Repeatable(Works.class) // ToDo ์• ๋„ˆํ…Œ์ด์…˜์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.  
@interface Work{  
    String value();  
}
  • ๋ฐ˜๋ณต ์‚ฌ์šฉ
@Work("์ฝ”๋“œ ์—…๋ฐ์ดํŠธ")  
@Work("๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ")  
class Main{ }
  • ์—ฌ๋Ÿฌ๋ฒˆ ์ ์šฉ ๊ฐ€๋Šฅ โ‡’ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์ฃผ๋Š” ๋ณ„๋„ ์• ๋„ˆํ…Œ์ด์…˜ ์ž‘์„ฑ ํ•„์š”
@interface Works {  // ์—ฌ๋Ÿฌ๊ฐœ์˜ ToDo์• ๋„ˆํ…Œ์ด์…˜์„ ๋‹ด์„ ์ปจํ…Œ์ด๋„ˆ ์• ๋„ˆํ…Œ์ด์…˜ ToDos
    Work[] value(); 
}

@Repeatable(Works.class) // ์ปจํ…Œ์ด๋„ˆ ์• ๋„ˆํ…Œ์ด์…˜ ์ง€์ • 
@interface Work {
	String value();
}

๐Ÿค ์‚ฌ์šฉ์ž ์ •์˜ ์• ๋„ˆํ…Œ์ด์…˜

๋”๋ณด๊ธฐ
  • ์‚ฌ์šฉ์ž ์ง์ ‘ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉ
@interface ์• ๋„ˆํ…Œ์ด์…˜๋ช… { // ์ธํ„ฐํŽ˜์ด์Šค ์•ž์— @๊ธฐํ˜ธ๋ฅผ ๋ถ™์—ฌ ์ •์˜ 
	ํƒ€์ž… ์š”์†Œ๋ช…(); // ์• ๋„ˆํ…Œ์ด์…˜ ์š”์†Œ ์„ ์–ธ
}
  • java.lang.annotation ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์—†์Œ

โœ… Ref. 

๐Ÿ’™ Lambda

๐Ÿค ๋žŒ๋‹ค์‹

๋”๋ณด๊ธฐ
  • ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ์‹์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ โ‡’ ์ฝ”๋“œ ๊ฐ„๊ฒฐ, ๋ช…ํ™•
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ• ์ง€์›
//๊ธฐ์กด ๋ฉ”์„œ๋“œ ํ‘œํ˜„ ๋ฐฉ์‹
void sayhello() {
	System.out.println("HELLO!")
}

//์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋žŒ๋‹ค์‹์œผ๋กœ ํ‘œํ˜„ํ•œ ์‹
() -> System.out.println("HELLO!")
  • ํŠน์ง•
    • ๋ฐ˜ํ™˜ํƒ€์ž…๊ณผ ์ด๋ฆ„ ์ƒ๋žต ๊ฐ€๋Šฅ โ‡’ ์ต๋ช…ํ•จ์ˆ˜(anonymous function)
    • ๋ฉ”์„œ๋“œ ๋ฐ”๋””์— ์‹คํ–‰๋ฌธ์ด ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ๊ฒฝ์šฐ ์ค‘๊ด„ํ˜ธ ์ƒ๋žต ๊ฐ€๋Šฅ
    • ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ์œ ์ถ” ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ์ƒ๋žต ๊ฐ€๋Šฅ
    • ์ต๋ช…๊ฐ์ฒด โ†’ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ƒ์„ฑ

๐Ÿค ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค

๋”๋ณด๊ธฐ
  • ์ž๋ฐ”์—์„œ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ํด๋ž˜์Šค ์•ˆ์—์„œ ์ •์˜ โ‡’ ๋ฉ”์„œ๋“œ ๋…๋ฆฝ์  x
  • ๋žŒ๋‹ค์‹ โ†’ ๊ฐ์ฒด โ‡’ ์ด๋ฆ„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ต๋ช… ํด๋ž˜์Šค
    • ์ต๋ช…ํด๋ž˜์Šค: ๊ฐ์ฒด์˜ ์„ ์–ธ๊ณผ ์ƒ์„ฑ์„ ๋™์‹œ์— ํ•จ
      โ‡’ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์ƒ์„ฑํ•˜๊ณ  ๋‹จ ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ผํšŒ์šฉ ํด๋ž˜์Šค
public class LamdaEx {
    public static void main(String[] args) {
		   /* Object obj = new Object() {
            int sum(int num1, int num2) {
                return num1 + num1;
            }
        };
			*/ 
		FunctionEx exFunction = (num1, num2) -> num1 + num2
		System.out.println(exFunction.sum(10,15))
}

@FunctionalInterface // ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฐ”๋ฅด๊ฒŒ ์ •์˜๋˜์—ˆ๋Š”์ง€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ..
interface FunctionEx {
		public abstract int sum(int num1, int num2);
}
  • ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ๋žŒ๋‹ค์‹์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ
    • ๊ฐ€๋Šฅํ•œ ์ด์œ ? ๋žŒ๋‹ค์‹๋„ ๊ฒฐ๊ตญ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ โ†’ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ์ถ”์ƒ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • ๋žŒ๋‹ค์‹ : ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ = 1 : 1
@FunctionalInterface
public interface FunctionalInterface {
    public int accept(int x, int y);
}
import static java.lang.Integer.sum;

public class FunctionalInterfaceEx {
    public static void main(String[] args) throws Exception {
        FunctionalInterface ex;

        ex = (x, y) -> {
            int result = x + y;
            return result;
        };
        ex = (x, y) -> { return x + y; };
        ex = (x, y) -> x + y;
        ex = (x, y) -> sum(x, y);
    }

    public static int sum(int x, int y){
        return x + y;
    }
}

/* ์ถœ๋ ฅ: ๋‹ค 7*/

๐Ÿค ๋ฉ”์„œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค

๋”๋ณด๊ธฐ
  • ๋žŒ๋‹ค์‹์—์„œ ๋ถˆํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
    โ‡’ ๋žŒ๋‹ค์‹์œผ๋กœ ๊ฐ„๋‹จํ•ด์ง„ ์ต๋ช… ๊ฐ์ฒด๋ฅผ ๋”! ๊ฐ„๋‹จํ•˜๊ฒŒ! ์‚ฌ์šฉ
(left, right) -> Math.max(left, right);

// ์œ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐ ๋ฉ”์„œ๋“œ๋กœ ๋ณ€๊ฒฝ
// ํด๋ž˜์Šค์ด๋ฆ„ :: ๋ฉ”์„œ๋“œ์ด๋ฆ„
Math :: max

์ •์  ๋ฉ”์„œ๋“œ์™€ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์ฐธ์กฐ

  • ์ •์  ๋ฉ”์„œ๋“œ ์ฐธ์กฐ
ํด๋ž˜์Šค :: ์ •์ ๋ฉ”์„œ๋“œ๋ช…
  • ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์ฐธ์กฐ
์ฐธ์กฐ๋ณ€์ˆ˜ :: ์ธ์Šคํ„ด์Šค๋ฉ”์„œ๋“œ๋ช…

 ์˜ˆ์‹œ

// Calculator.java

public class Calculator {
    public static int staticMethod(int x, int y) {
        return x + y;
    }

    public int instanceMethod(int x, int y) {
        return x * y;
    }
}
import java.util.function.IntBinaryOperator;

public class MethodReferences {
    public static void main(String[] args) {
        IntBinaryOperator operator;

        /*  ์ •์ ๋ฉ”์„œ๋“œ
         * ํด๋ž˜์Šค์ด๋ฆ„ :: ๋ฉ”์„œ๋“œ์ด๋ฆ„
         */
        operator = Calculator::staticMethod;
        System.out.println("์ •์ ๋ฉ”์„œ๋“œ: " + operator.applyAsInt(3, 5));

        /*  ์ธ์Šคํ„ด์Šค๋ฉ”์„œ๋“œ
         * ์ธ์Šคํ„ด์Šค์ด๋ฆ„ :: ๋ฉ”์„œ๋“œ์ด๋ฆ„
         */
        Calculator calculator = new Calculator();
        operator = calculator::instanceMethod;
        System.out.println("์ธ์Šคํ„ด์Šค๋ฉ”์„œ๋“œ: " + operator.applyAsInt(3, 5));
    }
}

์ƒ์„ฑ์ž ์ฐธ์กฐ

  • ์ƒ์„ฑ์ž ์ฐธ์กฐ == ๊ฐ์ฒด์ƒ์„ฑ
  • ๊ฐ์ฒด ์ƒ์„ฑ & ๋ฆฌํ„ด ๋žŒ๋‹ค์‹ โ‡’ ์ƒ์„ฑ์ž ์ฐธ์กฐ๋กœ ๋Œ€์น˜ ๊ฐ€๋Šฅ
(a, b) -> { return new ํด๋ž˜์Šค(a, b); };
  • ์ƒ์„ฑ์ž ์ฐธ์กฐ๋กœ ํ‘œํ˜„
ํด๋ž˜์Šค :: new

โœ… Ref. 

๋”๋ณด๊ธฐ

๐Ÿ’™ Stream

๐Ÿค Stream ํŠน์ง•

๋”๋ณด๊ธฐ
  • ์ŠคํŠธ๋ฆผ: ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ํ†ต๋กœ
  • ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜์˜ ์ €์žฅ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฐธ์กฐํ•ด์„œ ๋žŒ๋‹ค์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฐ˜๋ณต์ž
  • ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค(List, Set, Map, ๋ฐฐ์—ด ๋“ฑ)๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค๊ณ , ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์ž‡์Œ

์„ ์–ธํ˜•์œผ๋กœ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ฒ˜๋ฆฌ

  • โ€œ๋ฌด์—‡"์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€๊ฐ€ ์ค‘์š”
  • ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋ชฐ๋ผ๋„ ์ฝ”๋“œ๊ฐ€ ๋ฌด์Šจ ์ผ์„ ํ•˜๋Š”์ง€ ์ดํ•ด ๊ฐ€๋Šฅ

์˜ˆ์‹œ

  • List์— ์žˆ๋Š” ์ˆซ์ž๋“ค ์ค‘ 4๋ณด๋‹ค ํฐ ์ง์ˆ˜ ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ
import java.util.List;

public class ImperativeProgrammingEx{
    public static void main(String[] args){
        List<Integer> numbers = List.of(1, 3, 6, 7, 8, 11);

	// ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
        int sum = 0;
        for(int number : numbers) {
            if(number > 4 && (number % 2 == 0)) {
                sum += number;
            }
        }

        // ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ์ŠคํŠธ๋ฆผ
        int sum = numbers.stream()
                         .filter(number -> number > 4 && (number % 2 == 0))
                         .mapToInt(number -> number)
                         .sum();
    }
}

๋žŒ๋‹ค์‹์œผ๋กœ ์š”์†Œ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์ œ๊ณต

  • ์ŠคํŠธ๋ฆผ์ด ์ œ๊ณตํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์š”์†Œ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ โ‡’ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค ๋งค๊ฐœํƒ€์ž…์„ ๊ฐ€์ง
  • โ‡’ ๋žŒ๋‹ค์‹ ๋˜๋Š” ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ์š”์†Œ ์ฒ˜๋ฆฌ ๋‚ด์šฉ์„ ๋งค๊ฐœ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ
stream.forEach(s -> {
    String name = s.getName();
    int score = s.getScore();
    System.out.println(name + ": " + score);
});

๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž์˜ ์‚ฌ์šฉ์œผ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์— ์šฉ์ด

  • ์™ธ๋ถ€๋ฐ˜๋ณต์ž(external iterator)
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ ํŒจํ„ด
    • index๋ฅผ ์‚ฌ์šฉํ•˜๋Š” for๋ฌธ, iterator๋ฅผ ์ด์šฉํ•˜๋Š” while๋ฌธ
  • ๋‚ด๋ถ€๋ฐ˜๋ณต์ž(internal iterator)
    • ์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€: ์š”์†Œ ๋ฐ˜๋ณต / ๊ฐœ๋ฐœ์ž: ์š”์†Œ ๋‹น ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ฝ”๋“œ๋งŒ ์ œ๊ณตํ•˜๋Š” ์ฝ”๋“œ ํŒจํ„ด
    • ์ด์ 
      • ์š”์†Œ ๋ฐ˜๋ณต์€ ์ปฌ๋ ‰์…˜์—๊ฒŒ, ๊ฐœ๋ฐœ์ž๋Š” ์š”์†Œ ์ฒ˜๋ฆฌ ์ฝ”๋“œ์— ์ง‘์ค‘
      • ์š”์†Œ ๋ฐ˜๋ณต ์ˆœ์„œ ๋ณ€๊ฒฝ, ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU ์ตœ๋Œ€ํ•œ ํ™œ์šฉ
        โ‡’ ์š”์†Œ๋“ค์„ ๋ถ„๋ฐฐ์‹œ์ผœ ๋ณ‘๋ ฌ ์ž‘์—…์„ ๋„์™€์ฃผ๋ฏ€๋กœ ํšจ์œจ์ ์ธ ์š”์†Œ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ
        • ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ: ์ŠคํŠธ๋ฆผ parallel() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ

  • ์ŠคํŠธ๋ฆผ์€ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ์— ๋Œ€ํ•ด ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
    • ์ค‘๊ฐ„ ์—ฐ์‚ฐ: ๋งคํ•‘, ํ•„ํ„ฐ๋ง, ์ •๋ ฌ ๋“ฑ์„ ์ˆ˜ํ–‰
    • ์ตœ์ข… ์—ฐ์‚ฐ: ๋ฐ˜๋ณต, ์นด์šดํŒ…, ํ‰๊ท , ์ดํ•ฉ ๋“ฑ์˜ ์ง‘๊ณ„ ์ˆ˜ํ–‰
  • ์˜ˆ๋ฅผ ๋“ค์–ด ํ•™์ƒ ๊ฐ์ฒด๋ฅผ ์š”์†Œ๋กœ ๊ฐ€์ง€๋Š” ์ปฌ๋ ‰์…˜์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ,
    • ์ค‘๊ฐ„ ์—ฐ์‚ฐ: ํ•™์ƒ์˜ ์ ์ˆ˜๋ฅผ ์ถœ๋ ฅ
    • ์ตœ์ข… ์—ฐ์‚ฐ: ์ ์ˆ˜์˜ ํ‰๊ท ๊ฐ’์„ ์‚ฐ์ถœ

๐Ÿค ํŒŒ์ดํ”„๋ผ์ธ

๋”๋ณด๊ธฐ
  • ๋ฆฌ๋•์…˜(Reduction): ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด ์ถ•์†Œํ•˜๋Š” ๊ฒƒ
    • ๊ฒฐ๊ณผ๋ฌผ: ๋ฐ์ดํ„ฐ์˜ ํ•ฉ๊ณ„, ํ‰๊ท ๊ฐ’, ์นด์šดํŒ…, ์ตœ๋Œ€๊ฐ’, ์ตœ์†Œ๊ฐ’ ๋“ฑ

ํŒŒ์ดํ”„๋ผ์ธ

  • ๊ตฌ์กฐ: ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์ด ์—ฐ๊ฒฐ
  • ๋ชจ๋‘ ์ค‘๊ฐ„ ์—ฐ์‚ฐ ์ŠคํŠธ๋ฆผ(์ตœ์ข… ์—ฐ์‚ฐ ์ œ์™ธ)
์ค‘๊ฐ„ ์ŠคํŠธ๋ฆผ์ด ์ƒ์„ฑ๋  ๋•Œ ์š”์†Œ๋“ค์ด ๋ฐ”๋กœ ์ค‘๊ฐ„ ์—ฐ์‚ฐ(ํ•„ํ„ฐ๋ง, ๋งคํ•‘, ์ •๋ ฌ)๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ตœ์ข… ์—ฐ์‚ฐ์ด ์‹œ์ž‘๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ง€์—ฐ๋˜๊ณ , ์ตœ์ข… ์—ฐ์‚ฐ์ด ์‹œ์ž‘๋  ๋•Œ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜์”ฉ ์ค‘๊ฐ„ ์ŠคํŠธ๋ฆผ์—์„œ ์—ฐ์‚ฐ๋˜๊ณ  ์ตœ์ข… ์—ฐ์‚ฐ๊นŒ์ง€ ์˜ค๊ฒŒ ๋จ

๐Ÿค ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ, ์ค‘๊ฐ„ ์—ฐ์‚ฐ, ์ตœ์ข… ์—ฐ์‚ฐ

๋”๋ณด๊ธฐ

์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

  • stream(): Collection ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜
    โ‡’ Collection ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๊ฐ์ฒด(List, Set ๋“ฑ)๋“ค์€ ๋ชจ๋‘ ์ด ๋ฉ”์„œ๋“œ๋กœ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • stream() ์‚ฌ์šฉ โ‡’ ํ•ด๋‹น Collection์˜ ๊ฐ์ฒด ์†Œ์Šค๋กœ ํ•˜๋Š” Stream ๋ฐ˜ํ™˜
  • ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์ 
    • Read-only
    • Disposable

์ค‘๊ฐ„ ์—ฐ์‚ฐ

  • ์ค‘๊ฐ„ ์—ฐ์‚ฐ์€ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์†ํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

ํ•„ํ„ฐ๋ง - filter(), distinct()

  • filter(): ์ŠคํŠธ๋ฆผ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋งŒ ํ•„ํ„ฐ๋ง
  • distinct(): ์ŠคํŠธ๋ฆผ ์š”์†Œ ์ค‘๋ณต ์ œ๊ฑฐ

๋งคํ•‘ - map()

  • map(): ๊ธฐ์กด Stream ์š”์†Œ โ†’ ์ƒˆ๋กœ์šด Stream ๋Œ€์ฒด
    โ‡’ ์ŠคํŠธ๋ฆผ์˜ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜
  • flatMap(): ์š”์†Œ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋ณต์ˆ˜ ๊ฐœ์˜ ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ ๋ฆฌํ„ด
    โ‡’ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜

์ •๋ ฌ - sorted()

  • Stream ์š”์†Œ ์ •๋ ฌ
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ Comparator ๋„˜๊ธฐ๊ธฐ ๊ฐ€๋Šฅ
    • ์˜ค๋ฆ„์ฐจ์ˆœ: Comparator ์ธ์ž ์—†์ด ํ˜ธ์ถœ
    • ๋‚ด๋ฆผ์ฐจ์ˆœ: reverseOrder ์‚ฌ์šฉ
list.stream()
    .sorted()	// ์˜ค๋ฆ„์ฐจ์ˆœ
    .forEach(n -> System.out.println(n));
System.out.println();

list.stream()
    .sorted(Comparator.reverseOrder())	// ๋‚ด๋ฆผ์ฐจ์ˆœ
    .forEach(n -> System.out.println(n));

์—ฐ์‚ฐ ๊ฒฐ๊ณผ ํ™•์ธ - peek()

  • ์—ฐ์‚ฐ ์ค‘๊ฐ„์— ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋””๋ฒ„๊น…ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์šฉ
intStream
	.filter(a -> a%2 ==0)
	.peek(n-> System.out.println(n))
	.sum();

์ตœ์ข… ์—ฐ์‚ฐ

์—ฐ์‚ฐ ๊ฒฐ๊ณผ ํ™•์ธ - forEach()

  • ํŒŒ์ดํ”„๋ผ์ธ ๋งˆ์ง€๋ง‰์—์„œ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์—ฐ์‚ฐ
intStream
	.filter(a -> a%2 ==0)
	.forEach(n -> System.out.println(n));

๋งค์นญ - match()

  • Stream ์š”์†Œ๋“ค์ด ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ
  • ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค Predicate๋กœ ํ•ด๋‹น ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ โ†’ boolean ๋ฐ˜ํ™˜
  • ์ข…๋ฅ˜
    • allMatch(): ๋ชจ๋“  ์š”์†Œ๋“ค์ด ๋งค๊ฐœ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„ Predicate ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ
    • anyMatch(): ์ตœ์†Œํ•œ ํ•œ ๊ฐœ์˜ ์š”์†Œ๊ฐ€ ๋งค๊ฐœ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„ Predicate ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ
    • noneMatch(): ๋ชจ๋“  ์š”์†Œ๋“ค์ด ๋งค๊ฐœ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„ Predicate์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์‚ฌ
int[] intArr = {2,4,6};
boolean result = Arrays.stream(intArr).allMatch(a -> a % 2 == 0);
System.out.println("๋ชจ๋‘ 2์˜ ๋ฐฐ์ˆ˜์ธ๊ฐ€? " + result);			// true

result = Arrays.stream(intArr).anyMatch(a -> a % 3 == 0);
System.out.println("ํ•˜๋‚˜๋ผ๋„ 3์˜ ๋ฐฐ์ˆ˜๊ฐ€ ์žˆ๋Š”๊ฐ€? " + result);		// true

result = Arrays.stream(intArr).noneMatch(a -> a % 3 == 0);
System.out.println("3์˜ ๋ฐฐ์ˆ˜๊ฐ€ ์—†๋Š”๊ฐ€? " + result);			// false

๊ธฐ๋ณธ ์ง‘๊ณ„ - sum(), count(), average(), max(), min()

  • ์š”์†Œ๋“ค์„ ์—ฐ์‚ฐํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์‚ฐ์ถœํ•˜๋Š” ๊ฒƒ
int[] intArr = {1,2,3,4,5};

long count = Arrays.stream(intArr).count();
System.out.println("intArr์˜ ์ „์ฒด ์š”์†Œ ๊ฐœ์ˆ˜: " + count);

long sum = Arrays.stream(intArr).sum();
System.out.println("intArr์˜ ์ „์ฒด ์š”์†Œ ํ•ฉ: " + sum);

double avg = Arrays.stream(intArr).average().getAsDouble();
System.out.println("์ „์ฒด ์š”์†Œ์˜ ํ‰๊ท ๊ฐ’: " + avg);

int max = Arrays.stream(intArr).max().getAsInt();
System.out.println("์ตœ๋Œ€๊ฐ’: " + max);

int min = Arrays.stream(intArr).min().getAsInt();
System.out.println("์ตœ์†Œ๊ฐ’: " + min);

int first = Arrays.stream(intArr).findFirst().getAsInt();
System.out.println("๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ: " + first);

๋‹ค์–‘ํ•œ ์ง‘๊ณ„ ๊ฒฐ๊ณผ๋ฌผ - reduce()

  • ๋ˆ„์ ํ•˜์—ฌ ํ•˜๋‚˜๋กœ ์‘์ถ•(reduce)ํ•˜๋Š” ๋ฐฉ์‹
  • ์•ž์˜ ๋‘ ์š”์†Œ์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์Œ ์š”์†Œ์™€ ์—ฐ์‚ฐ
    • Accumulator: ๊ฐ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•œ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
    • Identity: ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐ๊ฐ’
    • Combiner: ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ(Parlallel Stream)์—์„œ ๋‚˜๋ˆ„์–ด ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์นจ
int[] intArr = {1,2,3,4,5};

long sum = Arrays.stream(intArr).sum();
System.out.println("intArr์˜ ์ „์ฒด ์š”์†Œ ํ•ฉ: " + sum);

int sum1 = Arrays.stream(intArr)
                .map(el -> el*2)
                .reduce((a,b) -> a+b)
                .getAsInt();
System.out.println("์ดˆ๊ธฐ๊ฐ’ ์—†๋Š” reduce: " + sum1);

int sum2= Arrays.stream(intArr)
                .map(el -> el*2)
                .reduce(0, (a,b) -> a+b);
System.out.println("์ดˆ๊ธฐ๊ฐ’ ์กด์žฌํ•˜๋Š” reduce: " + sum2)

Stream์š”์†Œ ๋‹ค๋ฅธ ์ข…๋ฅ˜๋กœ ์ˆ˜์ง‘ - collect()

  • Stream์˜ ์š”์†Œ๋“ค์„ ๋‹ค๋ฅธ ์ข…๋ฅ˜(List, Set, Map ๋“ฑ)์˜ ๊ฒฐ๊ณผ๋กœ ์ˆ˜์ง‘
  • ์ผ๋ฐ˜์ ์œผ๋กœ List๋กœ Stream์˜ ์š”์†Œ๋“ค์„ ๋งŽ์ด ์ˆ˜์ง‘
    โ‡’ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์€ Collectors ๊ฐ์ฒด์—์„œ static ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณต
    โ‡’ ์›ํ•˜๋Š” ๊ฒƒ์ด ์—†์œผ๋ฉด Collector ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉ

๐Ÿค Optional<T>

๋”๋ณด๊ธฐ
  • NullPointerException(NPE)์—์„œ null ๊ฐ’์œผ๋กœ ์ธํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์„ ๊ฐ์ฒด ์ฐจ์›์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ๋„์ž…
  • ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ Optional์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ๋”ฐ๋กœ ์กฐ๊ฑด๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ NPE๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ฝ”๋“œ์ž‘์„ฑ ๊ฐ€๋Šฅ

Optional ๊ฐ์ฒด ์ƒ์„ฑ

  • of() ์‚ฌ์šฉ
  • ์ฐธ์กฐ๋ณ€์ˆ˜์˜ ๊ฐ’์ด null์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ofNullable() ์‚ฌ์šฉ
Optional<String> opt1 = Optional.ofNullable(null);
Optional<String> opt2 = Optional.ofNullable("123");
Optional<String> opt3 = Optional.<String>empty();  // ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”

๋ฉ”์„œ๋“œ ์ฒด์ด๋‹

  • ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์ž‘์„ฑ

โœ… Ref. 

๐Ÿ’œ ์˜ค๋Š˜์˜ ์ƒ๊ฐ ์กฐ๊ฐ๋ชจ์Œ

  • ๋ฉ”์„œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค๋Š” ๋žŒ๋‹ค์‹์œผ๋กœ ๊ฐ„๋‹จํ•ด์ง„ ์ต๋ช…๊ฐ์ฒด๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ„๋‹จํ•ด์ง„ ์ต๋ช… ๊ฐ์ฒด๋ฅผ ๋”! ๊ฐ„๋‹จ!ํ•˜๊ฒŒ!! ์ธ๊ฐ„์˜ ์š•์‹ฌ์€ ๋์ด ์—†๊ณ  โ€ฆ ๋‚˜๋Š” ๋ฌด์Šจ๋ง์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๊ณ  โ€ฆ ๐Ÿ˜ตโ€๐Ÿ’ซ
  • I/O๋Š” ๋‚ด์ผ ... ใ… .ใ… 

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

023 | Data Structure - Stack & Queue  (0) 2022.07.25
019 | Java - I/O, Thread, JVM  (0) 2022.07.19
017 | Java - ๐Ÿฅ Practical | Collection Framework  (0) 2022.07.16
016 | Java - Generics, Collection Framework  (2) 2022.07.15
015 | Java  (0) 2022.07.13
Comments