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

[Java] static ๊ณผ instance์˜ ์ฐจ์ด

by ์•ˆ์ฃผํ˜• 2022. 3. 21.

์„œ๋ก 

static๊ณผ instance์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•˜์—ฌ ์งš๊ณ  ๋„˜์–ด ๊ฐˆ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ชฉ์ฐจ

1. ํด๋ž˜์Šค(static) ๋ณ€์ˆ˜์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ์ฐจ์ด
2. ํด๋ž˜์Šค(static) ๋ฉ”์„œ๋“œ์™€ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์ฐจ์ด
3. ํด๋ž˜์Šค(static) ๋ฉค๋ฒ„์™€ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„ ๊ฐ„์˜ ์ฐธ์กฐ์™€ ํ˜ธ์ถœ

 

1. ํด๋ž˜์Šค(static) ๋ณ€์ˆ˜์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ์ฐจ์ด

๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ค‘ static์ด ๋ถ™์€ ๊ฒƒ์€ ํด๋ž˜์Šค ๋ณ€์ˆ˜, ๋ถ™์ง€ ์•Š์€ ๊ฒƒ์€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public class Test {

    int instanceValue;   // ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜  
    static int classValue;   // ํด๋ž˜์Šค ๋ณ€์ˆ˜

    void method() {
        int stackValue = 0; // ์ง€์—ญ ๋ณ€์ˆ˜
    }
    
}

์œ„ ์ฝ”๋“œ์—๋Š” 3๊ฐœ์˜ intํ˜• ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๋Š”๋ฐ, instanceValue์™€ classValue๋Š” ํด๋ž˜์Šค ์˜์—ญ ์•ˆ์— ์„ ์–ธ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ์ค‘ classValue๋Š” ์•ž์— static ๋ถ™์–ด์„œ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํด๋ž˜์Šค ๋ณ€์ˆ˜์ด๋ฉฐ, instanceValue๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  stackValue๋Š” ๋ฉ”์„œ๋“œ์ธ method()์˜ ๋‚ด๋ถ€, ์ฆ‰ '๋ฉ”์„œ๋“œ ์˜์—ญ'์— ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ง€์—ญ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

๋ณ€์ˆ˜์˜ ์ข…๋ฅ˜ ์„ ์–ธ ์œ„์น˜ ์ƒ์„ฑ ์‹œ๊ธฐ
ํด๋ž˜์Šค ๋ณ€์ˆ˜(class variable) ํด๋ž˜์Šค ์˜์—ญ ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ๋•Œ
์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜(instance variable) ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ
์ง€์—ญ ๋ณ€์ˆ˜(local variable) ํด๋ž˜์Šค ์˜์—ญ ์ด์™ธ์˜ ์˜์—ญ(๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž, ์ดˆ๊ธฐํ™” ๋ธ”๋Ÿญ ๋‚ด๋ถ€) ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์ˆ˜ํ–‰๋˜์—ˆ์„ ๋•Œ

์„ธ ๊ฐ€์ง€ ๋ณ€์ˆ˜์˜ ์ข…๋ฅ˜๋ฅผ ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1) ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜(instance variable)

ํด๋ž˜์Šค ์˜์—ญ์— ์„ ์–ธ๋˜๋ฉฐ, ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฝ์–ด ์˜ค๊ฑฐ๋‚˜ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋Š” ๋จผ์ € ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ): Test test = new Test();

์ธ์Šคํ„ด์Šค๋Š” ๋…๋ฆฝ์ ์ธ ์ €์žฅ๊ณต๊ฐ„์„ ๊ฐ€์ง€๋ฏ€๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๊ณ ์œ ํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์†์„ฑ์˜ ๊ฒฝ์šฐ, ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

2) ํด๋ž˜์Šค ๋ณ€์ˆ˜(calss variable)

ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์•ž์— static์„ ๋ถ™์ด๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ์ €์žฅ๊ณต๊ฐ„์„ ๊ฐ–๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์™€๋Š” ๋‹ฌ๋ฆฌ, ํด๋ž˜์Šค ๋ณ€์ˆ˜๋Š” ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณตํ†ต๋œ ์ €์žฅ ๊ณต๊ฐ„(๋ณ€์ˆ˜)์„ ๊ณต์œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•œ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋“ค์ด ๊ณตํ†ต์ ์ธ ๊ฐ’์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์†์„ฑ์˜ ๊ฒฝ์šฐ, ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 ํด๋ž˜์Šค ๋ณ€์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์™€ ๋‹ฌ๋ฆฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์–ธ์ œ๋ผ๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ:) Test.๋ณ€์ˆ˜๋ช…

ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ(loading)๋  ๋•Œ ์ƒ์„ฑ๋˜์–ด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋˜๋ฉฐ, public์„ ์•ž์— ๋ถ™์ด๋ฉด ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์–ด๋””์„œ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” '์ „์—ญ ๋ณ€์ˆ˜(global variable)'์˜ ์„ฑ๊ฒฉ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

3) ์ง€์—ญ ๋ณ€์ˆ˜(local variable)

๋ฉ”์„œ๋“œ ๋‚ด์— ์„ ์–ธ๋˜์–ด ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์†Œ๋ฉธ๋˜์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. for๋ฌธ ๋˜๋Š” while๋ฌธ๊ณผ ๊ฐ™์ด ๋ธ”๋Ÿญ ๋‚ด์— ์„ ์–ธ๋œ ์ง€์—ญ๋ณ€์ˆ˜๋Š”, ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ธ”๋Ÿญ{} ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ธ”๋Ÿญ{}์„ ๋ฒ—์–ด๋‚˜๋ฉด ์†Œ๋ฉธ๋˜์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

2. ํด๋ž˜์Šค(static) ๋ฉ”์„œ๋“œ์™€ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์ฐจ์ด

๋ณ€์ˆ˜์—์„œ ๊ทธ๋žฌ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด, ๋ฉ”์„œ๋“œ ์•ž์— static์ด ๋ถ™์–ด ์žˆ์œผ๋ฉด ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์ด๊ณ , ๋ถ™์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋„ ํด๋ž˜์Šค ๋ณ€์ˆ˜์ฒ˜๋Ÿผ, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ฐ˜๋ฉด์— ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1) ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ค‘ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— static์„ ๋ถ™์ธ๋‹ค.

  • ์ƒ์„ฑ๋œ ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” ์„œ๋กœ ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์—์„œ ๊ฐ™์€ ๊ฐ’์ด ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š” ๋ณ€์ˆ˜๋Š” static์„ ๋ถ™์—ฌ์„œ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2) ํด๋ž˜์Šค ๋ณ€์ˆ˜(static๋ณ€์ˆ˜)๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • static์ด ๋ถ™์€ ๋ณ€์ˆ˜(ํด๋ž˜์Šค ๋ณ€์ˆ˜)๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ๋•Œ ์ด๋ฏธ ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

3) ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ(static๋ฉ”์„œ๋“œ)๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

  • ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ(static)๋Š” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์—†์ด ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์—์„œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ฉด์— ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋‚˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ๋Š” static์ด ๋ถ™์€ ๋ฉค๋ฒ„๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ธ์ œ๋‚˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ static๋ณ€์ˆ˜๊ฐ€ ์ด๋ฏธ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

4) ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, static์„ ๋ถ™์ด๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•œ๋‹ค.

  • ๋ฉ”์„œ๋“œ์˜ ์ž‘์—…๋‚ด์šฉ ์ค‘์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด, static์„ ๋ถ™์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 
  • ๋ฐ˜๋Œ€๋กœ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด static์„ ๋ถ™์ด๋Š” ๊ฒŒ  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ๊ฐ„์ด ์งง์•„์ง€๋ฏ€๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์ด์œ ๋Š” static์„ ์•ˆ ๋ถ™์ธ ๋ฉ”์„œ๋“œ(์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ)๋Š” ์‹คํ–‰ ์‹œ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•  ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ๋” ์ž˜ ๋˜์‹ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class MyMath2 {
    long a, b;

    // ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜ a, b๋งŒ์„ ์ด์šฉํ•ด์„œ ์ž‘์—…ํ•˜๋ฏ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”์—†๋‹ค.
    long add() 	    { return a + b; }  // a, b๋Š” ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜
    long subtract() { return a - b; }
    long multiply() { return a * b; }
    double divide() { return a / b; }

    // ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜์™€ ๊ด€๊ณ„์—†์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ์œผ๋กœ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    static long   add(long a, long b) 	   	 { return a + b; } // a, b๋Š” ์ง€์—ญ๋ณ€์ˆ˜
    static long   subtract(long a, long b)   { return a - b; }
    static long   multiply(long a, long b)	 { return a * b; }
    static double divide(double a, double b) { return a / b; }
}

class MyMathTest2 {
    public static void main(String args[]) {
        // ํด๋ž˜์Šค๋ฉ”์„œ๋“œ ํ˜ธ์ถœ. ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์—†์ด ํ˜ธ์ถœ๊ฐ€๋Šฅ
        System.out.println(MyMath2.add(200L, 100L));
        System.out.println(MyMath2.subtract(200L, 100L));
        System.out.println(MyMath2.multiply(200L, 100L));
        System.out.println(MyMath2.divide(200.0, 100.0));

        MyMath2 mm = new MyMath2(); // ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
        mm.a = 200L;
        mm.b = 100L;
        // ์ธ์Šคํ„ด์Šค๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์ƒ์„ฑ ํ›„์—๋งŒ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•จ.
        System.out.println(mm.add());
        System.out.println(mm.subtract());
        System.out.println(mm.multiply());
        System.out.println(mm.divide());
    }
}

 

3. ํด๋ž˜์Šค(static) ๋ฉค๋ฒ„์™€ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„ ๊ฐ„์˜ ์ฐธ์กฐ์™€ ํ˜ธ์ถœ

๊ฐ™์€ ํด๋ž˜์Šค์— ์†ํ•œ ๋ฉค๋ฒ„๋“ค ๊ฐ„์—๋Š” ๋ณ„๋„์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์„œ๋กœ ์ฐธ์กฐ ๋˜๋Š” ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ํด๋ž˜์Šค ๋ฉค๋ฒ„๊ฐ€ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๋ฅผ ์ฐธ์กฐ ๋˜๋Š” ํ˜ธ์ถœํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 ๊ทธ ์ด์œ ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๊ฐ€ ์กด์žฌํ•˜๋Š” ์‹œ์ ์— ํด๋ž˜์Šค ๋ฉค๋ฒ„๋Š” ํ•ญ์ƒ ์กด์žฌํ•˜์ง€๋งŒ, ํด๋ž˜์Šค ๋ฉค๋ฒ„๊ฐ€ ์กด์žฌํ•˜๋Š” ์‹œ์ ์—๋Š” ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

class Test{
    
    void instanceMethod(){}         // ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ 
    static void staticMethod(){}    // static ๋ฉ”์„œ๋“œ
    
    void instanceMethod2(){         // ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ
        instanceMethod();           // ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
        staticMethod();             // static ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    }
    
    static void staticMethod2(){    // static ๋ฉ”์„œ๋“œ
        instanceMethod();           // ์—๋Ÿฌ!(๋ถˆ๊ฐ€๋Šฅ) ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ถˆ๊ฐ€๋Šฅ
        staticMethod();             // static ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    }
    
}

์œ„์˜ ์ฝ”๋“œ๋Š” ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์™€ static๋ฉ”์„œ๋“œ ๊ฐ„์˜ ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์˜ ๋ฉ”์„œ๋“œ๋Š” ์„œ๋กœ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ด๋‚˜ ์ฐธ์กฐ ๋ณ€์ˆ˜ ์—†์ด ์ง์ ‘ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ static๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์—” ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ ๊ฐ„์˜ ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๊ฐ„์˜ ํ˜ธ์ถœ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, static ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

class MemberCall {
	int iv = 10;
	static int cv = 20;

	int iv2 = cv;
//	static int cv2 = iv;		// ์—๋Ÿฌ. ํด๋ž˜์Šค๋ณ€์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ.
	static int cv2 = new MemberCall().iv;	 // ์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ์‚ฌ์šฉ๊ฐ€๋Šฅ.

	static void staticMethod1() {
		System.out.println(cv);
//		System.out.println(iv); // ์—๋Ÿฌ. ํด๋ž˜์Šค๋ฉ”์„œ๋“œ์—์„œ ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ๋ถˆ๊ฐ€.
		MemberCall c = new MemberCall();	
		System.out.println(c.iv);   // ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„์—์•ผ ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜์˜ ์ฐธ์กฐ๊ฐ€๋Šฅ.
}

	void instanceMethod1() {
		System.out.println(cv);		
		System.out.println(iv); // ์ธ์Šคํ„ด์Šค๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅ.
}

	static void staticMethod2() {
		staticMethod1();
//		instanceMethod1(); // ์—๋Ÿฌ. ํด๋ž˜์Šค๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ธ์Šคํ„ด์Šค๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Œ.
		MemberCall c = new MemberCall();
		c.instanceMethod1(); // ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„์—์•ผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ.
 	}
	
	void instanceMethod2() {	// ์ธ์Šคํ„ด์Šค๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ธ์Šคํ„ด์Šค๋ฉ”์„œ๋“œ์™€ ํด๋ž˜์Šค๋ฉ”์„œ๋“œ
		staticMethod1();		//  ๋ชจ๋‘ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์—†์ด ๋ฐ”๋กœ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
		instanceMethod1();
	}
}

ํด๋ž˜์Šค ๋ฉค๋ฒ„(ํด๋ž˜์Šค ๋ณ€์ˆ˜์™€ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ)๋Š” ์–ธ์ œ๋‚˜ ์ฐธ์กฐ ๋˜๋Š” ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๊ฐ€ ํด๋ž˜์Šค ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ฉค๋ฒ„ ๊ฐ„์˜ ์ฐธ์กฐ ๋˜๋Š” ํ˜ธ์ถœ ์—ญ์‹œ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

 ๊ทธ๋Ÿฌ๋‚˜, ์ธ์Šคํ„ด์Šค  ๋ฉค๋ฒ„(์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์™€ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ)๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„์—๋งŒ ์ฐธ์กฐ ๋˜๋Š” ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ๋ฉค๋ฒ„๊ฐ€ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๋ฅผ ์ฐธ์กฐ, ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 ํ•˜์ง€๋งŒ, ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„ ๊ฐ„์˜ ํ˜ธ์ถœ์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ฆ‰ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๋“ค๋„ ๋ชจ๋‘ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋Œ“๊ธ€