JiwonDev

7. ๋žŒ๋‹ค์™€ ์ŠคํŠธ๋ฆผ, ๋ฉ”์„œ๋“œ

by JiwonDev

# ๋žŒ๋‹ค๋ณด๋‹ค๋Š” ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

(์˜ˆ์‹œ) (๋ฉ”์„œ๋“œ ์ฐธ์กฐ ์ด์šฉ) (๋žŒ๋‹ค์‹ ์ด์šฉ)
์ •์  Integer:parseInt str -> Integer.parseInt(str)
ํ•œ์ •์  Instant.now()::isAfter Instant then = Instant.now(); t-> then.isAfter(t);
๋น„ํ•œ์ •์  String::toLowerCase str -> str.toLowerCase()
ํด๋ž˜์Šค TreeMap<K,V>::new () -> new TreeMap<K,V>
๋ฐฐ์—ด int[]::new len -> new int[len]

 

# ์ง์ ‘ ๋งŒ๋“ค์ง€ ๋ง๊ณ  ํ‘œ์ค€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

2021.07.12 - [๐ŸŒฑBackend/Java] - #10 Modern Java (Java8~)

 

#10 Modern Java (Java8~)

# ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค(๋žŒ๋‹ค) ํด๋ž˜์Šค๋ฅผ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๋”ฑ ํ•˜๋‚˜๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค SAM (Single Abstract Method, ๋‹จ ํ•˜๋‚˜์˜ ์ถ”์ƒ๋ฉ”์„œ

jiwondev.tistory.com

 

 

# ์ŠคํŠธ๋ฆผ์€ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ผ

์ŠคํŠธ๋ฆผ์€ ๋งŒ๋Šฅ์ด ์•„๋‹ˆ๋‹ค. ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค. ๋˜ํ•œ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด ์„ฑ๋Šฅ์ด ์ข‹์•„์ง€๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค.

 

๋”ฐ๋กœ ์Šค๋ ˆ๋“œํ’€์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”์˜ ํฌํฌ-์กฐ์ธํ’€์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค.

๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ๋•Œ๋ฌธ์— ์ƒ๊ธด ๋งŽ์€ ์Šค๋ ˆ๋“œ๋“ค์ด ๋‹ค๋ฅธ ์„œ๋น„์Šค ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ์„ ์œ ์˜ํ•˜์ž. 

์ŠคํŠธ๋ฆผ์œผ๋กœ ํ•  ์ˆ˜ ์—†๋Š” ์ผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ํ•˜๊ธฐ ์ข‹์€ ์ผ
- ์ฝ”๋“œ ๋ธ”๋ก { ~ } ์•ˆ์—์„œ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ.
- break, continue, skip ๋“ฑ์˜ ๋ถ„๊ธฐ ์ž‘์—…
- ๋‚ด๋ถ€ ๋กœ์ง์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ
- ํ•„ํ„ฐ๋ง
- ํŠน์ • ์กฐ๊ฑด์—์„œ ์›ํ•˜๋Š” ์›์†Œ ์ฐพ๊ธฐ
- ๋ชจ๋“  ์›์†Œ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ๋ณ€ํ™˜

์ฐธ๊ณ ๋กœ ํ•œ๋ฒˆ ์‚ฌ์šฉํ•œ ์ŠคํŠธ๋ฆผ์€ ์žฌ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์™„๋ฃŒ๋œ ๊ฐ’์ด ์•„๋‹Œ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฑด ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ถ€์ž‘์šฉ(Side-effect)๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์‚ฌ์šฉ๋ฒ• ์ง„์งœ ๋”๋Ÿฝ๊ฒŒ ๊ตฌ๋ฆฌ๋„ค.

 

 

# ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌํ•˜๋ผ.

์„œ๋น„์Šค ๋ฉ”์„œ๋“œ์—์„œ ๋งค๋ฒˆ ์ธ์ž์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜์ง€๋งˆ๋ผ. ์ƒ์„ฑ์ž์—์„œ ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌํ•˜๊ณ , ๋„๋ฉ”์ธ์˜ ๋ถˆ๋ณ€ ์†์„ฑ์„ ์ง€์ผœ๋ผ.

if ๋ฌธ์œผ๋กœ ๊ฒ€์‚ฌํ•ด๋„ ๋˜์ง€๋งŒ, Assert ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ assert ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์ข‹๋‹ค.

// ์ž๋ฐ” ํ‘œ์ค€์—๋„ Assert ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.
// java.util.Objects.requireNonNull 
public int append(String a, String b){
    Obejcts.requireNonNull(a, "a ๊ฐ’์€ null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    Obejcts.requireNonNull(b, "b ๊ฐ’์€ null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    
    ...
}
public int sum(int a, int b, String operator){
    assert a > 0;
    assert b > 0; // AssertionError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ‚ค์›Œ๋“œ.
    assert operator != 0;
    
}

 


# ๋ฐฉ์–ด์ ์ธ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด๋ผ.

๋ถˆ๋ณ€(final)์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฑด ์œ„ํ—˜ํ•œ ํ–‰์œ„์ด๋‹ค. 

ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ชฐ๋ž˜ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค๊ฐ€, ์™ธ๋ถ€์—์„œ ์›ํ•˜๋Š” ์‹œ์ ์— ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€๋ง๊ณ  ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜์ž.

public class Dog {
    private Date createDate;
    private Date endDate;
    
    public Dog(Date createDate, Date endDate){
        this.createDate = createDate;
        this.endDate = new Date(endDate.getTime());//๋ฐฉ์–ด์  ๋ณต์‚ฌ
    }
    
    public Date getCreateDate(){
        return createDate; // ๊ทธ๋ƒฅ ๋ฐ˜ํ™˜ํ•˜๊ธฐ
    }
    
    public Date getEndDate(){
        return new Date(endDate.getTime()); // ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ
    }
}
public void main(){
    Dog dog = new Dog(new Date(), new Date());
    dog.getCreateDate().setYear(2002); // ๊ฐ์ฒด ๋‚ด๋ถ€์˜ Date๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค.
    dog.getEndDate().setYear(2002);    // ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ฅผ ํ–ˆ๊ธฐ์— ๋‚ด๋ถ€์˜ Date๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ.
}

๋‹ค๋งŒ ๋ฐฉ์–ด์ ์ธ ๋ณต์‚ฌ๋Š” ๊ฐ์ฒด๋ฅผ ๋งค๋ฒˆ ์ƒˆ๋กœ๋งŒ๋“ค์–ด์„œ ์„ฑ๋Šฅ์— ์•ˆ์ข‹์€ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.

๋งŒ์•ฝ ๋ฐฉ์–ด์ ์ธ ๋ณต์‚ฌ๋ฅผ ํ•˜์ง€์•Š๋Š”๋‹ค๋ฉด, ํ•ด๋‹น ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ์ฑ…์ž„์ด ์‚ฌ์šฉ์ž(ํด๋ผ์ด์–ธํŠธ)์— ์žˆ์Œ์„ ๋ฐ˜๋“œ์‹œ ๋ฌธ์„œ๋‚˜ Docs์— ๋ช…์‹œํ•˜์ž.

 

 

# ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์‹ ์ค‘ํžˆ ์„ค๊ณ„ํ•˜๋ผ.

1. ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๋Œ€์ถฉ ์ง“๊ฑฐ๋‚˜, ํŽธ์˜์šฉ ๋ฉ”์„œ๋“œ๋ฅผ ๋ง‰ ๋งŒ๋“ค์ง€ ๋ง์ž.

์ด๋Š” ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ํ•˜๋Š” ์‚ฌ๋žŒ ๋ชจ๋‘๋ฅผ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ ๋‹ค. ๊ผญ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž.

 

2. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์งง๊ฒŒ ์œ ์ง€ํ•˜์ž.

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”ํŒจํ„ด, ๋‹จ์ผ์ฑ…์ž„์›์น™์„ ๊ณ ๋ คํ•ด๋ณด์ž. ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ์—์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ผ์„ ํ•˜๊ณ ์žˆ์ง€๋Š” ์•Š์€๊ฐ€?

 

3. ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ๋Š” ๊ตฌํ˜„์ฒด๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚ซ๋‹ค.

 

4. ์ƒ์ˆ˜๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” boolean ๋ณด๋‹ค๋Š” ์›์†Œ 2๊ฐœ์งœ๋ฆฌ enum์ด ๋‚ซ๋‹ค.

 

 

# ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜๊ฐ€ ๊ฐ™์„ ๋•Œ๋Š” ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ”ผํ•ด๋ผ.

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€. ํ•„์š”ํ•˜๋ฉด ๋‹ค๋ฅธ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž. (์ƒ์„ฑ์ž๋ผ๋ฉด ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž)

public String name(Set<?> s){
    return "Set";
}

public String name(List<?> s){
    return "List";
}

public String name(Collection<?> s){
    return "Collection";
}

public void main(){
    // ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์–ด๋–ค name ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๊นŒ..? ์ถฉ๋ถ„ํžˆ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
    String name = name(Collection collection = new ArrayList<>());
}

 

 

 

# ๊ฐ€๋ณ€์ธ์ˆ˜(int...)๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ผ

์ธ์ˆ˜ ๊ฐœ์ˆ˜๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์•˜์„ ๋•Œ, ์•„์ฃผ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ๊ฐ€๋ณ€์ธ์ˆ˜์ด๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ€๋ณ€์ธ์ˆ˜ ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœ ๋  ๋•Œ ๋งˆ๋‹ค ๋ฐฐ์—ด์„ ์ƒˆ๋กœ ํ• ๋‹นํ•˜๊ณ , ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค. ์„ฑ๋Šฅ์— ์ข‹์ง€์•Š๋‹ค.

์ด ๊ฒฝ์šฐ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

public void foo(int a){}
public void foo(int a, int b){}
public void foo(int a, int b, int c){}
public void foo(int a, int b ,int c, int d){}
public void foo(){int... a} // 5๊ฐœ ์ด์ƒ๋งŒ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉ.

 

 

# null ์ด ์•„๋‹Œ ๋นˆ ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋ผ.

null์€ ๊ณต๋ฐฑ, 0๊ฐœ๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋˜ํ•œ null์€ NullPointException์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋นˆ ์ปฌ๋ ‰์…˜์€ ๋ฐ˜ํ™˜ํ•  ๊ฐ’์ด ์—†์Œ์„ ์˜๋ฏธํ•˜๊ณ  ์ •์ƒ์ ์ธ ๋™์ž‘์ด ์ง„ํ–‰๋œ๋‹ค.

 

 

# Optiona ์„ ๋ฐ˜ํ™˜๊ฐ’ ์ด์™ธ์— ์‚ฌ์šฉํ•˜์ง€๋งˆ๋ผ.

Optional์€ ๋ž˜ํผ ํด๋ž˜์Šค์ด๋‹ค. ๋ฌด์กฐ๊ฑด์ ์ธ ์‚ฌ์šฉ์€ ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ๋ผ์นจ์„ ์œ ์˜ํ•˜์ž.

์˜ˆ๋ฅผ ๋“ค์–ด ์ปฌ๋ ‰์…˜์˜ ๊ฐ’๋“ค์„ ์ „๋ถ€ Optional๋กœ ๋„ฃ๋Š”๋‹ค๋ฉด? ๋งค์šฐ ๋”์ฐํ•œ ์„ฑ๋Šฅ์„ ๋ง›๋ณผ ์ˆ˜ ์žˆ๋‹ค. (์™œ ์ŠคํŠธ๋ฆผ API๊ฐ€ ๊ธฐ๋ณธํƒ€์ž… IntStream๋“ฑ์„ ๋”ฐ๋กœ ์ œ๊ณตํ•˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.) ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•˜๋‹ค๋ฉด ์ฐจ๋ผ๋ฆฌ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š”๊ฒŒ ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

# ๊ณต๊ฐœ๋œ API ์š”์†Œ์—๋Š” ํ•ญ์ƒ ๋ฌธ์„œํ™”(Docs)๋ฅผ ์ž‘์„ฑํ•˜๋ผ. ์•„๋‹ˆ๋ฉด ๋น„๊ณต๊ฐœ๋กœ ์ „ํ™˜ํ•ด๋ผ.

javadocs์˜ ์‚ฌ์šฉ์„ ์ƒํ™œํ™”ํ•˜์ž. public์œผ๋กœ ๊ณต๊ฐœ๋œ ๋ฉ”์„œ๋“œ๋ผ๋ฉด ๋ฐ˜๋“œ์‹œ ์ฒ˜์Œ๋ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฃผ์„์ด ์žˆ์–ด์•ผํ•œ๋‹ค.

/**
* ๋‘๊ฐœ์˜ ์ˆ˜๋ฅผ ๋”ํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
* 
* @param a ์ •์ˆ˜๊ฐ’         //๋งˆ์นจํ‘œ๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค
* @param b ์ •์ˆ˜๊ฐ’         //๋งˆ์นจํ‘œ๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค
* @return a์™€ b๋ฅผ ๋”ํ•œ ๊ฐ’ //๋งˆ์นจํ‘œ๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค
*/
public int sum(int a, int b) {
    return a + b;
}

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ