1. 상수

다른 많은 프로그래밍 언어에는 상수 , 즉 값을 변경할 수 없는 변수가 있습니다 . Pi일반적으로, 그것들은 한 해의 달의 숫자나 일수와 같은 일종의 기본적인 것에 사용됩니다 . 즉, 원칙적으로 프로그래머는 필요하다고 판단하는 경우 모든 변수를 상수로 만들 수 있습니다.

그렇다면 Java에서 불변 변수(상수)를 어떻게 선언합니까? 이를 위한 특별한 키워드가 있습니다: final. 불변 변수를 생성하는 것은 일반 변수를 생성하는 것과 같습니다. 유일한 차이점은 변수 유형 앞에 final다음과 같이 단어를 작성해야 한다는 것입니다.

final Type name = value;

변수 에 다른 값을 할당하려고 하면 final프로그램이 컴파일되지 않습니다.

변수 final는 선언될 때 초기화되어야 합니다(값이 할당되어야 함). 이 규칙에는 한 가지 예외가 있습니다. 정적 클래스 변수의 초기화를 생성자로 이동할 수 있습니다. 그러나 이것에 대해서는 레벨 10에서 배우게 될 것입니다 .

키워드 수를 줄이기 위해 Java 개발자는 final단순히 상수를 선언하는 것 이상의 의미로 이 단어를 사용합니다. final메서드와 클래스에도 적용할 수 있습니다. 로 선언된 메서드는 final재정의할 수 없으며 로 선언된 클래스는 final상속할 수 없습니다.

수정 final자는 모든 변수(지역 변수, 메소드 매개변수, 클래스 필드 및 정적 클래스 변수) 앞에 추가될 수 있습니다.

final변수 이름 앞에는 해당 변수에 대한 모든 변경 사항에 대한 보호 기능이 있습니다 . 변수가 개체에 대한 참조를 저장하는 경우 개체를 계속 변경할 수 있습니다.

예:

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
배열을 만듭니다.

이것은 허용되지 않습니다. 변수 data가 로 선언됩니다 final.

그러나 당신은 이것을 할 수 있습니다.
그리고 이것도.

전역 상수

프로그램에서 전역 상수를 선언하기로 결정했다면 정적 클래스 변수public 를 만들고 final. 이러한 변수의 이름에는 특별한 스타일이 있습니다. 단어를 구분하는 데 사용되는 밑줄 문자와 함께 모두 대문자로 작성됩니다.

예:

class Solution
{
   public static final String SOURCE_ROOT = "c:\\projects\\my\\";
   public static final int DISPLAY_WIDTH = 1024;
   public static final int DISPLAY_HEIGHT = 768;
}


2. 변수 섀도잉

앞에서 말했듯이 같은 메서드에서 같은 이름을 가진 여러 지역 변수를 만들 수 없습니다. 다른 방법으로 할 수 있습니다.

그러나 여기에 당신이 아마 모르는 것이 있습니다. 인스턴스 변수와 로컬 메서드 변수는 같은 이름을 가질 수 있습니다.

예:

암호 변수 가시성
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

메서드 에서 add이라는 지역 변수를 선언했습니다 sum. 메서드가 끝날 때까지 인스턴스 변수를 가리거나 립니다 sum.

좋아, 당신은 그것이 어떤 의미에서 예상되는 것이라고 말합니다. 그러나 그것이 이야기의 끝이 아닙니다. 인스턴스 변수가 로컬 변수에 의해 가려지는 경우 메서드 내에서 인스턴스 변수를 참조하는 방법이 여전히 있음이 밝혀졌습니다. this이름 앞에 키워드를 작성하여 이를 수행합니다 .

this.name

다음은 이름 충돌이 성공적으로 해결된 예입니다.

암호 변수 가시성
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}


this.count
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

count 및 변수 는 키워드 sum 가 있거나 없는 모든 곳에서 사용할 수 있습니다 this. 로컬 변수가 인스턴스 변수를 sum 가리는 줄에서  인스턴스 변수는 키워드를 통해서만 액세스할 수 있습니다 .sumsumthis

인스턴스 변수가 아닌 정적 클래스 변수가 가려지면 키워드가 아닌 클래스 이름을 통해 액세스해야 합니다 this.

ClassName.name

예:

암호 변수 가시성
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

클래스 이름을 접두사로  사용하거나 사용하지 않고 어디에서나 count 및 정적 변수에 액세스할 수 있습니다 . 로컬 변수가 인스턴스 변수를 가리는 줄에서 인스턴스 변수 에 대한 액세스는 접두사로  사용할 때만 가능합니다 .sumSolutionsumsumsumSolution



3. for루프 내부의 변수

그리고 작지만 흥미로운 사실이 하나 더 있습니다.

변수가 특별한 방식으로 선언되는 곳도 있습니다. 바로 for루프 내부입니다 .

for루프에는 일반적으로 괄호 안에 카운터 변수가 있다는 것을 기억할 것입니다 . 그리고 이 변수의 가시성은 어떻게 될까요? 결국, 그것은 루프 본문에 있지 않습니다. 전체 방법입니까? 아님?

for정답은 루프 의 헤더에 선언된 변수는 루프의 본문루프 의 헤더for 에서만 볼 수 있다는 것 입니다 .

예:

암호 변수 가시성
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

따라서 코드에서 항상 루프를 차례로 작성하고 동일한 이름의 카운터 변수를 사용할 수 있습니다. 그러면 문제가 발생하지 않습니다.

예:

암호 변수 가시성
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a