새발블로그

변수 유효범위 본문

Problem Solving/개념

변수 유효범위

EUG 2025. 7. 4. 17:28

변수의 유효 범위 (Variable Scope)

Java에서 변수는 선언된 위치에 따라 유효 범위(Scope)가 달라진다.

변수의 범위는 크게 지역 변수(Local Variable), 전역 변수(Global Variable)로 나눌 수 있습니다.

1. 지역 변수 (Local Variable)

  • 메서드 내부에서 선언된 변수
  • 메서드가 실행될 때 생성되고, 종료되면 사라짐
  • 해당 메서드 내에서만 사용할 수 있음
public void greet() {
    String name = "홍길동"; // 지역 변수
    System.out.println(name);
}

 

2. 전역 변수 (Global Variable)

  • 전역 변수는 클래스 전체에서 사용할 수 있는 변수
  • Java에서는 전역 변수를 인스턴스 변수와 클래스 변수(static)로 구분

2-1. 인스턴스 변수

  • 클래스 내부에서 선언되며, 객체가 생성될 때 초기화됨
  • 객체마다 다른 값을 가짐
public class Person {
    private String name = "홍길동"; // 인스턴스 변수

    public void printName() {
        System.out.println(name);
    }
}

 

2-2. 클래스 변수 (Static 변수)

  • static 키워드를 사용해 선언
  • 클래스 전체에서 공유, 모든 객체가 동일한 값을 가짐
  • 프로그램 실행 시 메모리에 올라가며, 종료 시까지 유지됨
public class AppInfo {
    private static String version = "1.0.0"; // 클래스 변수

    public static void printVersion() {
        System.out.println(version);
    }
}

 

3. 변수 전달 방식

  • Java에서 변수는 값에 의한 전달 (Call by Value) 방식으로 전달된다.
  • 하지만 객체 타입을 전달할 경우에는 참조값이 복사되기 때문에, 그 참조값을 이용해 원본 데이터를 수정할 수 있다.

예: 기본 자료형

public class Example {
    public static void main(String[] args) {
        String visited = "True";
        func(visited);
        System.out.println(visited); // 여전히 "True"
    }

    public static void func(String visited) {
        visited = "False"; // 지역에서만 변경됨
    }
}

 

예: 참조형 자료 (List)

public class Example {
    public static void main(String[] args) {
        List<String> visited = new ArrayList<>(List.of("True", "True"));
        func(visited);
        System.out.println(visited); // [False, False]
    }

    public static void func(List<String> visited) {
        visited.set(0, "False");
        visited.set(1, "False");
    }
}

 

리스트 같은 객체는 참조값이 전달되므로, 내부 요소 변경은 호출한 쪽에도 반영된다.
단, visited = new ArrayList<>() 처럼 새로운 객체를 할당하면 원본에는 영향을 주지 않는다.

 

4. 전역 변수 vs 매개변수 전달

방법 1. 전역 변수 사용

public class ScopeExample {
    static String visited = "True"; // 클래스 변수

    public static void func1() {
        System.out.println(visited);
        func2();
    }

    public static void func2() {
        System.out.println(visited); // 접근 가능
    }
}

방법 2. 매개변수로 전달

public class ScopeExample {
    public static void func1() {
        String visited = "True";
        func2(visited);
    }

    public static void func2(String visited) {
        System.out.println(visited); // 매개변수로 전달받음
    }
}

 

'Problem Solving > 개념' 카테고리의 다른 글

재귀  (0) 2025.07.04
레퍼런스 타입 매개변수  (0) 2025.07.04
HashSet  (0) 2025.07.04
해시테이블  (0) 2025.07.04
스택  (0) 2025.07.04