๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒพBackEnd/๐Ÿ› Java

๋žŒ๋‹ค์‹ ๋กœ์ปฌ ๋ณ€์ˆ˜ - Effectively Final

by MuGeon Kim 2023. 1. 28.
๋ฐ˜์‘ํ˜•

Effectively Final

Java8์—์„œ final์ด ๋ถ™์ง€ ์•Š์€ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๊ทธ ๋ณ€์ˆ˜๋ฅผ Effectively final์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋žŒ๋‹ค์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ์ปฌ ๋ณ€์ˆ˜๋Š” Effectively Final๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

public class EffectivelyFinal {
    public static void main(String[] args) {
        new Pint().go();
    }
}
class Pint {
    void go() {
        int baseAnInt = 111;
        Function<Integer, Integer> function = (num) -> num + baseAnInt;
        System.out.println(baseAnInt+"baseAnInt");
        System.out.println(function.apply(10)+"function");
    }
}

 

 

์œ„์— ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด baseAnInt๋Š” Effectively Final์ด๋‹ค.

์ž๋ฐ”์—์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ’์ด ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ์ˆ˜๋ฅผ final๋กœ ์ถ”์ธก์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋žŒ๋‹ค์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๋žŒ๋‹ค์‹์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋กœ์ปฌ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์—†๋‹ค.

์ด ๋ถ€๋ถ„์€ ์Šค์ฝ”ํ”„์˜ ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๋ฉด ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ==> ์ด ๋ถ€๋ถ„์€ ๋’ค์—์„œ ๋” ์„ค๋ช…

ํ˜„์žฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…์„ ํ•˜๋ฉด GO()๋ฉ”์†Œ๋“œ์˜ ์Šค์ฝ”ํ”„์™€ ๋žŒ๋‹ค์˜ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฐ™๋‹ค. ๊ฐ™์€ ์Šค์ฝ”ํ”„์—์„œ ๋™์ผํ•œ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ณ  ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์„ ๋ฐ‘์— ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์Šค์ฝ”ํ”„๋ž€
๋จผ์ € ์Šค์ฝ”ํ”„๋ž€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„

baseAnInt๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋žŒ๋‹ค์‹์—์„œ ์‚ฌ์šฉํ•˜๋‹ˆ ์ด๋ฏธ ์Šค์ฝ”ํ”„์—์„œ ์ •์˜๊ฐ€ ๋˜์–ด์ ธ ์žˆ๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค.

์ด๊ฒƒ์„ ํ†ตํ•ด์„œ ๋žŒ๋‹ค๋Š” go๋ฉ”์†Œ๋“œ๋ž‘ ๋™์ผํ•œ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋žŒ๋‹ค? Effectively Final?

๋žŒ๋‹ค์‹์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ณต์‚ฌ๋ณธ์ด๋‹ค.

๊ทผ๋ณธ์ ์ธ ์ด์œ ๋Š” ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

1. ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ƒ๊ฐ์„ ํ•ด๋ณด๋ฉด ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰์ด ๋˜๊ณ  ๋๋‚˜๋ฉด ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ๋์ด ๋‚œ๋‹ค.

ํ•˜์ง€๋งŒ ๋žŒ๋‹ค๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์—ฌ์„œ ๋žŒ๋‹ค ์ž์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ  ๋ฆฌํ„ด์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋žŒ๋‹ค์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ์—ฌ์ „ํžˆ ์‹คํ–‰์„ ํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰. ๋กœ์ปฌ ๋ณ€์ˆ˜์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ๋๋‚˜๋„ ๋žŒ๋‹ค๋Š” ๋กœ์ปฌ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

https://incheol-jung.gitbook.io/docs/study/kotlin-in-action/8

 

8์žฅ ๊ณ ์ฐจ ํ•จ์ˆ˜: ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ๋žŒ๋‹ค ์‚ฌ์šฉ - Incheol's TECH BLOG

์ฝ”ํ‹€๋ฆฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ปฌ๋ ‰์…˜ ํ•จ์ˆ˜๋Š” ๋Œ€๋ถ€๋ถ„ ๋žŒ๋‹ค๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. filter์™€ map์€ ์ธ๋ผ์ธ ํ•จ์ˆ˜๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ ๋‘ ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์€ ์ธ๋ผ์ด๋‹๋˜๋ฉฐ, ์ถ”๊ฐ€ ๊ฐ์ฒด๋‚˜ ํด๋ž˜์Šค ์ƒ์„ฑ์€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ฝ”

incheol-jung.gitbook.io

 

 

2. ๋กœ์ปฌ ๋ณ€์ˆ˜์™€ ๋žŒ๋‹ค์˜ Thread๋ฅผ ์ดํ•ดํ•˜์ž

  • ๋กœ์ปฌ ๋ณ€์ˆ˜
    • JVM์—์„œ Stack์— ์ €์žฅ์ด ๋œ๋‹ค.
    • Stack์— ๋”ฐ๋ฅธ Thread๊ฐ€ ๋ฐฐ์ •์ด ๋˜๊ณ  Thread ์ข…๋ฃŒ๋Š” ๋กœ์ปฌ ๋ณ€์ˆ˜์˜ ๋์„ ์˜๋ฏธํ•œ๋‹ค

 

 

  • ๋žŒ๋‹ค์˜ ์“ฐ๋ ˆ๋“œ
    • ๋žŒ๋‹ค๋Š” ๋ณ„๋„์˜ Thread๋ฅผ ๊ฐ€์ง„๋‹ค.
    • ๋งŒ์•ฝ์— Stack์— ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์— ์œ„ํ—˜
    • ๋žŒ๋‹ค๊ฐ€ ์ฐธ์กฐํ•œ ๋ณ€์ˆ˜์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋Š” ๋žŒ๋‹ค๊ฐ€ ์žˆ์œผ๋ฉด ๋ณด์žฅ์ด ๋œ๋‹ค.

 

์Šค์ฝ”ํ”„

https://wakestand.tistory.com/179

 

์ž๋ฐ” ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๊ฐ€ ๋ญ”๋ง?

๋ฉด์ ‘ ์‹œ ๋งŽ์ด ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ์ด ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„์ธ๋ฐ ์Šค์ฝ”ํ”„๊ฐ€ ๋ญ” ๋ง์ธ์ง€ ๊ฐ์ด ์•ˆ์™€์„œ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ง‰์ƒ ๋ณด๋ฉด ๋‹จ์ˆœํ•˜๋‹ค ๋จผ์ € ์Šค์ฝ”ํ”„๋ž€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ์–˜๊ธฐํ•˜๋Š”๋ฐ {} ์•ˆ์—์„œ ๋ณ€์ˆ˜

wakestand.tistory.com

๊ธฐ๋ณธ์ ์ธ ์Šค์ฝ”ํ”„์˜ ๋‚ด์šฉ์€ ๋งํฌ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ด ํŽ˜์ด์ง€์—์„œ ์„ค๋ช…ํ•˜๋Š” ์Šค์ฝ”ํ”„๋Š” ๋žŒ๋‹ค์—์„œ ๋žŒ๋‹ค , ๋กœ์ปฌ ํด๋ž˜์Šค , ์ต๋ช… ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์Šค์ฝ”ํ”„๋ฅผ ๋น„๊ตํ•˜๊ณ 

๋žŒ๋‹ค์— ๋Œ€ํ•œ ํŠน์ง•์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ž‘์„ฑ์„ ํ•˜๊ณ  ์žˆ๋‹ค.

 

class Pint {
    private int baseAnInt = 111;

    class LocalClass{
        int baseAnInt = 1;
        void localClass(){
            System.out.println(baseAnInt);//1
        }
    }

    Consumer<Integer>consumer = new Consumer<Integer>() {
        int baseAnInt=2;
        @Override
        public void accept(Integer integer) {
            System.out.println(baseAnInt);//2
        }
    };

    void go() {
        Function<Integer, Integer> function = (baseAnInt) -> baseAnInt + baseAnInt;//111
    }
}

 

๋กœ์ปฌ ํด๋ž˜์Šค์™€ , ์ต๋ช… ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ baseAnInt์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋žŒ๋‹ค์‹์€ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค.

์ด๊ฒƒ์„ ํ†ตํ•ด ์œ„์— 2๊ฐœ์™€ ๋žŒ๋‹ค์‹์€ ์„œ๋กœ ๋‹ค๋ฅธ ์Šค์ฝ”ํ”„๋ฅผ ํ†ตํ•ด ๋™์ž‘์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๊ฒƒ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฐ‘์— ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ 

https://tjdtls690.github.io/studycontents/java/2022-10-24-lambda_anonymous_local_class_difference/

 

[์ž๋ฐ”, Java] ๋žŒ๋‹ค (Lambda) - ์‰๋„์ž‰ (Shadowing)

.

tjdtls690.github.io

 

๋ฐ˜์‘ํ˜•

'๐ŸŒพBackEnd > ๐Ÿ› Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ & ๋žŒ๋‹ค  (0) 2023.01.28