[Day 4 | Java] Scope

y♡ding·2024년 10월 17일
0

데브코스 TIL

목록 보기
12/163

📌 Scope(유효범위)란?

Scope는 변수나 메서드가 유효한 범위, 즉 어느 부분에서 접근하고 사용할 수 있는지를 정의한다. Scope를 이해하는 것은 변수의 생명주기를 관리하고, 코드의 안정성과 가독성을 높이는 데 중요하다.


1️⃣ 클래스 필드 (Static Scope)

클래스 필드static 키워드를 사용하여 정의되며, 클래스가 메모리에 로드될 때 한 번만 생성된다. 모든 인스턴스가 동일한 값을 공유하며, 클래스 이름으로 직접 접근이 가능하다.

  • 클래스 전체에서 공유된다.
  • 클래스가 메모리에 로드된 순간부터 프로그램 종료 시까지 메모리에 남는다.
  • 객체를 생성하지 않고도 클래스명.변수명으로 접근 가능하다.
class Variable {
    static String classVariable = "클래스 필드";
}

public class Main {
    public static void main(String[] args) {
        System.out.println(Variable.classVariable);  // "클래스 필드" 출력
    }
}

2️⃣ 인스턴스 필드 (Instance Scope)

인스턴스 필드는 각 객체(인스턴스)가 독립적으로 가지는 변수이다. 객체가 생성될 때 메모리에 할당되며, 해당 객체의 수명 동안 유지된다. 각 인스턴스마다 독립적인 값을 가진다.

  • 객체마다 별도의 값을 가진다.
  • 객체가 소멸하면 해당 변수도 소멸한다.
  • 인스턴스를 통해서만 접근 가능하다 (인스턴스명.변수명).
class Variable {
    String instanceVariable = "인스턴스 필드";
}

public class Main {
    public static void main(String[] args) {
        Variable v1 = new Variable();
        Variable v2 = new Variable();

        v1.instanceVariable = "v1 필드 값";
        v2.instanceVariable = "v2 필드 값";

        System.out.println(v1.instanceVariable);  // "v1 필드 값" 출력
        System.out.println(v2.instanceVariable);  // "v2 필드 값" 출력
    }
}

3️⃣ 지역 변수 (Local Scope)

지역 변수는 메서드나 블록 내에서 선언된 변수로, 해당 블록 내에서만 사용 가능하다. 블록을 벗어나면 더 이상 접근할 수 없으며, 메모리에서 사라진다.

  • 메서드나 블록 내에서만 유효하다.
  • 메서드가 호출되고 실행되는 동안에만 메모리에 존재하며, 메서드가 종료되면 사라진다.
  • 동일한 이름의 변수를 다른 메서드나 블록에서 선언할 수 있다.
class Variable {
    void doFunc() {
        String localVariable = "지역 변수";
        System.out.println(localVariable);  // "지역 변수" 출력
    }
}

public class Main {
    public static void main(String[] args) {
        Variable v = new Variable();
        v.doFunc();
        // v.localVariable 접근 불가능 (지역 변수는 메서드 내에서만 유효)
    }
}

4️⃣ 블록 내부의 지역 변수

지역 변수는 메서드뿐만 아니라 제어문(if, for, while 등) 안에서도 사용할 수 있다. 이런 경우, 블록({}) 내부에서 선언된 변수는 그 블록을 벗어나면 사용할 수 없다.

public class Main {
    public static void main(String[] args) {
        int num1 = 10;  // 메서드의 지역 변수

        {
            // 블록 내부에서 새로운 지역 변수 선언
            int num2 = 20;
            System.out.println("num1 = " + num1);  // 10 출력
            System.out.println("num2 = " + num2);  // 20 출력
        }

        // System.out.println(num2);  // 오류 발생: num2는 블록 바깥에서 접근 불가능
    }
}
  • 블록 밖에서 선언한 변수는 블록 내부에서도 사용 가능
  • 블록 내부에서 선언한 변수는 블록 바깥에서 사용할 수 없음

📌 변수의 생명주기(Life Time)

변수는 선언된 위치에 따라 다른 생명주기를 갖는다. 각 변수는 특정 시점에 생성되고, 그 시점이 지나면 메모리에서 사라진다.

  1. 지역 변수
    메서드나 블록이 실행될 때 생성되고, 종료되면 사라진다.

  2. 인스턴스 변수
    객체가 생성될 때 메모리에 할당되고, 객체가 소멸할 때 사라진다.

  3. 클래스 변수
    클래스가 로드될 때 메모리에 생성되며, 프로그램이 종료될 때까지 유지된다.

🤙🏻 Scope의 규칙

  1. 상위 Scope에서 선언된 변수는 하위 Scope에서 접근 가능하다.
    • 클래스 필드와 인스턴스 필드는 메서드나 블록 내에서 사용할 수 있다.

  2. 하위 Scope에서 선언된 변수는 상위 Scope에서 접근할 수 없다.
    • 메서드나 블록 내에서 선언된 지역 변수는 그 블록을 벗어나면 사용할 수 없다.
public class Example {
    static int number = 5;  // 클래스 변수

    void method() {
        int number = 10;  // 지역 변수
        System.out.println(number);  // 출력: 10 (지역 변수 우선)
    }

    void anotherMethod() {
        System.out.println(number);  // 출력: 5 (클래스 변수에 접근)
    }

    public static void main(String[] args) {
        Example example = new Example();
        example.method();
        example.anotherMethod();
    }
}
  • 지역 변수는 클래스 변수보다 우선순위를 갖는다. 메서드 내에서 같은 이름의 변수가 선언되면 지역 변수가 우선된다.

📌 Scope 관리의 중요성

Scope를 올바르게 이해하고 사용하는 것은 코드의 안정성가독성을 크게 향상시킨다. 변수와 메서드를 적절한 범위에 선언하여, 오류 가능성을 줄이고 코드 유지 보수성을 높일 수 있다.

베스트 프랙티스

  • 지역 변수는 가능한 작은 범위 내에서 선언하여 변수의 유효 범위를 제한하고, 변수 충돌을 방지할 것
  • 클래스 필드(static)는 필요한 경우에만 사용하고, 불필요한 공유를 최소화할 것
  • 인스턴스 변수는 각 객체별로 다르게 사용될 값에 대해서만 선언하고 사용할 것

0개의 댓글

관련 채용 정보