λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’Ž/Java

[Java] λ³€μˆ˜μ˜ scope와 static

by dar0m! 2021. 8. 11.

scope

ν”„λ‘œκ·Έλž¨μƒμ—μ„œ μ‚¬μš©λ˜λŠ” λ³€μˆ˜λ“€μ€ μ‚¬μš© κ°€λŠ₯ν•œ λ²”μœ„λ₯Ό 가진닀. κ·Έ λ²”μœ„λ₯Ό λ³€μˆ˜μ˜ μŠ€μ½”ν”„λΌκ³  ν•œλ‹€.

λ³€μˆ˜κ°€ μ„ μ–Έλœ λΈ”λŸ­μ΄ κ·Έ λ³€μˆ˜μ˜ μ‚¬μš©λ²”μœ„μ΄λ‹€.

 public class ValableScopeExam{

        int globalScope = 10;   // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 

        public void scopeTest(int value){   
            int localScope = 10;
            System.out.println(globalScope);
            System.out.println(localScope);
            System.out.println(value);
        }
    }
  • 클래슀의 μ†μ„±μœΌλ‘œ μ„ μ–Έλœ λ³€μˆ˜ globalScope 의 μ‚¬μš© λ²”μœ„λŠ” 클래슀 전체 이닀.
  • λ§€κ°œλ³€μˆ˜λ‘œ μ„ μ–Έλœ int value λŠ” λΈ”λŸ­ λ°”κΉ₯에 μ‘΄μž¬ν•˜κΈ°λŠ” ν•˜μ§€λ§Œ, λ©”μ„œλ“œ 선언뢀에 μ‘΄μž¬ν•˜λ―€λ‘œ μ‚¬μš©λ²”μœ„λŠ” ν•΄λ‹Ή λ©”μ†Œλ“œ λΈ”λŸ­λ‚΄μ΄λ‹€.
  • λ©”μ†Œλ“œ λΈ”λŸ­λ‚΄μ—μ„œ μ„ μ–Έλœ localScope λ³€μˆ˜μ˜ μ‚¬μš©λ²”μœ„λŠ” λ©”μ†Œλ“œ λΈ”λŸ­λ‚΄μ΄λ‹€.

mainλ©”μ†Œλ“œμ—μ„œ μ‚¬μš©ν•˜κΈ°

  • 같은 클래슀 μ•ˆμ— μžˆλŠ”λ° globalScope λ³€μˆ˜λ₯Ό μ‚¬μš© ν•  수 μ—†λ‹€. μ™œ 일까?
  • main이 staticν•œ λ©”μ†Œλ“œμ΄κΈ° λ•Œλ¬Έμ΄λ‹€.
  • staticν•œ λ©”μ„œλ“œμ—μ„œλŠ” static ν•˜μ§€ μ•Šμ€ ν•„λ“œλ₯Ό μ‚¬μš© ν•  수 μ—†λ‹€.
public class VariableScopeExam {
        int globalScope = 10; 

        public void scopeTest(int value){
            int localScope = 20;            
            System.out.println(globalScope);
            System.out.println(localScope);
            System.out.println(value);
        }   
        public static void main(String[] args) {
            System.out.println(globalScope);  //였λ₯˜
            System.out.println(localScope);   //였λ₯˜
            System.out.println(value);        //였λ₯˜  
        }   
    }

 

static

  • main λ©”μ†Œλ“œλŠ” static ν‚€μ›Œλ“œκ°€ λΆ™μ–΄μžˆλŠ”λ°, 이런 λ©”μ„œλ“œλ₯Ό static ν•œ λ©”μ†Œλ“œ 라고 ν•œλ‹€.
  • μ§€κΈˆκΉŒμ§€ 클래슀λ₯Ό μ •μ˜ν•˜κ³  newν•˜μ§€ μ•Šμ•„λ„ 메인 λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜μ—ˆλ˜ μ΄μœ κ°€ static ν‚€μ›Œλ“œ λ•Œλ¬Έμ΄λ‹€.
  • ν‚€μ›Œλ“œ static을 μ‚¬μš©ν•˜λ©΄ μΈμŠ€ν„΄μŠ€ν™” ν•˜μ§€ μ•Šμ•„λ„ μ‚¬μš©ν•  수 μžˆλ‹€.
    • static ν‚€μ›Œλ“œλ₯Ό 뢙이면 main λ©”μ„œλ“œκ°€ μΈμŠ€ν„΄μŠ€ν™”λ˜μ§€ μ•Šμ•„λ„ staticν•œ λ©”μ„œλ“œλ‚˜ staticν•œ ν•„λ“œλŠ” μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ΄λ ‡κ²Œ staticν•œ λ©”μ„œλ“œλŠ” 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— staticν•œ λ©”μ„œλ“œ λ‚΄μ—μ„œ staticν•˜μ§€ μ•Šμ€ ν•„λ“œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€.
  • μ™œλƒν•˜λ©΄, staticν•œ λ©”μ„œλ“œκ°€ μ‚¬μš©ν•˜λŠ” μ‹œμ μ— ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ μΈμŠ€ν„΄μŠ€ν™” λ˜μ§€ μ•Šμ•˜μ„ μˆ˜λ„ 있기 λ•Œλ¬Έμ΄λ‹€.
    • ν΄λž˜μŠ€λŠ” λΆ•μ–΄λΉ΅μ˜ ν‹€ 같은 쑴재둜 λͺ¨λ“  ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ν™” ν•˜μ§€ μ•Šμ€ μ±„λ‘œ μ‚¬μš©ν•  수 μ—†λ‹€. λΆ•μ–΄λΉ΅μ˜ 틀이 λΆ•μ–΄λΉ΅κ³Ό 같지 μ•Šμ€ 것과 같은 μ΄μΉ˜μ΄λ‹€.
  • λ°˜λŒ€λ‘œ staticν•œ λ³€μˆ˜λ“€μ€ staticν•˜μ§€ μ•Šμ€ λ©”μ„œλ“œ λ‚΄μ—μ„œ μ‚¬μš©ν•˜λŠ” 것은 λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ”λ‹€.
 public class VariableScopeExam {
        int globalScope = 10; 
        static int staticVal = 7;

        public void scopeTest(int value){
            int localScope = 20;        
        }

        public static void main(String[] args) {
            System.out.println(staticVal);      //μ‚¬μš©κ°€λŠ₯ 
        }

    }

 

  • κ·Έλ ‡λ‹€λ©΄, main λ©”μ„œλ“œκ°™μ€ staticν•œ λ©”μ„œλ“œ λ‚΄μ—μ„œ staticν•˜μ§€ μ•Šμ€ λ³€μˆ˜λ“€μ„ μ‚¬μš©ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?
  • μ•„λž˜μ²˜λŸΌ 객체λ₯Ό μƒμ„±ν•˜κ³  μ‚¬μš©ν•˜λ©΄ λœλ‹€.
    ValableScopeExam v1 = new ValableScopeExam();
    ValableScopeExam v2 = new ValableScopeExam();
    v1.golbalScope = 20;
    v2.golbalScope = 30; 

    System.out.println(v1.golbalScope);  //20 이 좜λ ₯λœλ‹€. 
    System.out.println(v2.golbalScope);  //30이 좜λ ₯λœλ‹€. 

    v1.staticVal = 10;
    v2.staticVal = 20; 

    System.out.println(v1.statVal);  //20 이 좜λ ₯λœλ‹€. 
    System.out.println(v2.statVal);  //20 이 좜λ ₯λœλ‹€.
  • staticν•œ λ³€μˆ˜λ“€μ€ κΈ°μ–΅ν•΄μ•Όν•  점이 μžˆλ‹€.
    • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ“€μ€ ν΄λž˜μŠ€μ— λŒ€ν•œ μΈμŠ€ν„΄μŠ€λ³€μˆ˜κ°€ μƒμ„±λ λ•Œ globalScopeλΌλŠ” 곡간이 λ³„κ°œλ‘œ μƒμ„±λ˜κ³ , λ˜‘κ°™μ΄ ν•˜λ‚˜ 더 생성을 해보면 객체 μ•ˆμ— λ³„κ°œμ˜ globalScope μ €μž₯ 곡간이 μƒμ„±λœλ‹€.
    • 반면 static λ³€μˆ˜μ— 값을 넣어보면 값이 κ³΅μœ λ˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.
      • staticν•œ ν•„λ“œλŠ” μΈμŠ€ν„΄μŠ€ μƒμ„±μ‹œμ— λ§Œλ“€μ–΄μ§€λŠ” 것이 μ•„λ‹ˆκ³ , 값을 μ €μž₯ν•  수 μžˆλŠ” 곡간이 ν•˜λ‚˜λ°–μ— μ—†λ‹€.
      • 값을 κ³΅μœ ν•œλ‹€. λ”°λΌμ„œ 이런 λ³€μˆ˜λ₯Ό 클래슀 λ³€μˆ˜λΌκ³  ν•œλ‹€.
  • 클래슀 λ³€μˆ˜ : static ν•œ λ³€μˆ˜, staticVal같은 staticν•œ ν•„λ“œλ₯Ό 클래슀 λ³€μˆ˜λΌκ³  ν•œλ‹€.
    • staticν•˜κ²Œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 값을 μ €μž₯ν•  수 μžˆλŠ” 곡간이 ν•˜λ‚˜λ§Œ μƒμ„±λœλ‹€. κ·ΈλŸ¬λ―€λ‘œ, μΈμŠ€ν„΄μŠ€κ°€ μ—¬λŸ¬κ°œ μƒμ„±λ˜λ„ staticν•œ λ³€μˆ˜λŠ” ν•˜λ‚˜λ‹€.
    • 값을 μ €μž₯ν•  수 μžˆλŠ” 곡간이 ν•˜λ‚˜λ°–μ— μ—†μ–΄μ„œ 값을 κ³΅μœ ν•œλ‹€.
    • 'μΈμŠ€ν„΄μŠ€_이름(레퍼런슀).λ³€μˆ˜λͺ…'이 μ•„λ‹ˆλΌ 클래슀 이름을 직접 μ‚¬μš©ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.
    • 'ν΄λž˜μŠ€μ΄λ¦„.ν΄λž˜μŠ€λ³€μˆ˜λͺ…' 이 방법이 쑰금 더 λ°”λžŒμ§ν•˜λ‹€κ³  ν•  수 μžˆλ‹€.
    • VariableScopeExam.staticVal
  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ : globalScope κ°™μ€ λ³€μˆ˜. μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λΌκ³  ν•œλ‹€.

 

 

μ°Έκ³ 

λŒ“κΈ€