John Squirrels
레벨 41
San Francisco

자바 범위

무작위의 그룹에 게시되었습니다
회원
우리 모두는 국가에 국경과 자체 법률이 있다는 것을 알고 있습니다. 국가의 법률은 국경 내에서 운영됩니다. 예를 들어 국가에는 자체 지역 규칙이 있는 학교나 박물관과 같은 조직이 있습니다. 그들은 국가의 법률에 위배되지 않지만 지정된 조직의 틀 내에서만 작동합니다. 프로그래밍에서도 마찬가지입니다. 따라서 프로그래밍, 특히 Java 언어에는 "범위"라는 용어가 있습니다. 변수 또는 메소드와 같은 특정 데이터가 작동하는 프로그램 영역을 나타냅니다. 이 기사에서는 Java에서 변수에 대한 범위가 무엇이며 이를 정의하는 방법을 알아봅니다.

일반적으로 Java 범위

변수와 메서드의 범위를 분리해야 하는 이유는 무엇입니까? 사실 때때로 프로그램은 매우 크고 하나 또는 다른 변수를 추적하기 어려울 수 있습니다. 또한 대규모 프로젝트에서는 변수의 용도가 명확하도록 변수 이름을 명확하게 지정하는 것이 바람직합니다. 범위는 특히 프로그램의 다른 부분에서 동일한 이름을 가진 다른 변수를 가질 수 있도록 합니다. 이러한 코드는 유지 관리 및 읽기가 더 쉽습니다. Java 범위는 프로그램에서 특정 변수 또는 메서드에 액세스할 수 있는 위치를 정의합니다. 간단히:
  • 메서드에서 선언된 변수는 선언 시작부터 메서드 끝까지(메서드 범위) 표시됩니다.
  • 코드 블록에서 선언된 변수는 해당 코드 블록이 끝날 때까지 존재합니다.
  • 메서드 인수인 변수는 메서드가 끝날 때까지 존재합니다.
  • 클래스/개체 변수는 포함 개체의 수명 동안 존재합니다. 가시성은 특수 액세스 수정자에 의해 규제됩니다.
  • 정적 클래스 변수는 프로그램이 실행되는 동안 항상 존재합니다. 가시성도 액세스 한정자에 의해 결정됩니다.

방법 수준 범위

인수를 포함하여 메서드에서 선언된 모든 변수는 해당 메서드 외부에서 액세스할 수 없습니다. 메서드 내에서 선언된 모든 변수는 선언 시작부터 메서드 끝까지 볼 수 있습니다. 다음은 메서드 변수 범위의 예입니다.
public class JScopeTest1 {


   public static void main(String[] args) {

       System.out.println(myMethod(5));
       System.out.println(myMethod(17));

   }
   public static int  myMethod(int arg) {
       int secondArg = 100; //local method variable
       return secondArg + arg;
   }
}
여기에 지역 변수 또는 메서드 인수인 secondArg 가 있습니다 . myMethod 메서드 외부에서 또는 선언되기 전에는 이 변수를 사용할 수 없습니다 . 변수가 함수 인수인 경우 이 메서드의 전체 본문에서 볼 수 있습니다. 위의 예에는 myMethod의 arg와 기본 메서드의 args라는 두 가지 인수가 있습니다.

클래스 수준 범위

클래스 수준 범위(인스턴스 변수) — 클래스에서 선언된 모든 변수는 해당 클래스의 모든 메서드에 사용할 수 있습니다. 액세스 한정자(예: public 또는 private)에 따라 클래스 외부에서 액세스할 수 있는 경우가 있습니다. 따라서 변수가 클래스 변수라면 특정 개체에 바인딩되어 이 클래스의 개체가 있는 한 존재합니다. 개체가 없으면 변수의 복사본이 없습니다. 변수는 변수가 선언되기 전이나 후에 선언되었는지 여부에 관계없이 클래스의 모든 메서드에서 볼 수 있습니다. 각 개체에는 다른 개체와 독립적인 자체 변수가 있습니다. 정적 메서드에서 변수에 액세스할 수 없습니다.

코드 예

public class Student {

//class level variables
   public String surname;
   String name;
   String secondName;
   private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
Surname , name , secondNamebirthday 는 인스턴스 변수입니다.

블록 범위

변수가 일부 코드 블록에서 정의/선언되면 해당 코드 블록이 끝날 때까지 존재합니다. 일반적으로 이러한 변수는 정의된 중괄호 사이에 존재합니다. 매우 자주 블록 범위는 루프 변수가 될 수 있습니다. for 루프 조건 에서 선언된 변수는 미리 정의하지 않는 한 루프 외부에서 액세스할 수 없습니다.
public class JScopeTest2 {
   public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           int sum = 0;
           sum = sum + i;
       }

       int sum = 1;
       System.out.println(sum);
   }
}
첫 번째 합계와 i 변수는 모두 루프 내부에서 선언되며 이 루프 외부에는 존재하지 않습니다. 그러나 두 번째 합계는 루프 외부에서 선언되었으므로 이 특정 변수가 인쇄될 것입니다.

정적 변수

변수가 정적(static 키워드로 표시됨)으로 선언되면 해당 클래스가 존재하는 한 존재합니다. 일반적으로 JVM은 정적 변수가 초기화될 때 처음 사용할 때 클래스를 메모리에 로드합니다.
import java.util.Date;

public class Student {
   public static int today = 2022;
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }


   public static void main(String[] args) {
       System.out.println(today);
   }

}
정적 today 변수를 사용하기 위해 Student 클래스 의 새 인스턴스를 생성하면 안 됩니다 . 여기에 "2022"가 인쇄됩니다.

액세스 한정자

Java에는 메서드 또는 변수에 대한 액세스를 제한하는 4개의 액세스 한정자가 있습니다. 메소드 내부가 아닌 클래스 내부에서 사용할 수 있습니다.
  • private은 가장 제한적인 한정자입니다. 메서드 및 변수에 대한 액세스를 선언된 클래스로 제한합니다. 클래스 외부에서 특정 메소드나 변수를 사용할 필요가 없다면 private을 사용하십시오. 클래스 변수는 일반적으로 Java에서 비공개입니다.

  • 액세스 한정자가 지정되지 않은 경우 메서드 또는 변수는 기본 한정자를 허용합니다. 기본값은 현재 패키지에서만 액세스를 허용합니다.

  • protected 수정자는 패키지 외부의 자식 클래스를 통해 액세스하지 않는 한 현재 패키지 내에서만 메서드 또는 변수에 대한 액세스를 허용합니다.

  • public 은 제한이 가장 적은 한정자입니다. 선언된 클래스뿐만 아니라 외부에서도 클래스, 메서드 또는 변수에 액세스할 수 있습니다. 이 수정자는 정말 자주 사용됩니다.

코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다