Welcome to Wesley & Harry's Traveling & Programming

IT Program/Java Basic

java 로컬변수 지역변수 블록으로 간단하게 이해하기 & local variable error

Wesley & Harry 2022. 2. 25. 18:00
반응형

java에서 변수의 선언과 초기화는 필수적이다.

초기화를 해주지 않으면 해당 변수는 사용을 할 수가 없다.

예제를 적어본다.

int wesley;
System.out.print(wesley);

해당 예제는 초기화를 해주지 않고 변수 타입만 선언해 준 경우다.

이럴 경우 컴파일 에러가 나타난다 

The local variable wesley(변수명) may not have been initialized


로컬 변수 : 메소드 블록 내에서 선언된 변수

로컬 변수는 메소드 실행이 끝나면 메모리에서 자동으로 없어지게 됩니다.

예제를 보겠습니다.

해당 예제 속 a와 sum 은 로컬 변수입니다.

int a = 15;

int sum = a+20;

System.out.println(sum);

이 들어가 있는 곳은 메소드 블록입니다.

메소드 블록을 감싸고 있는 큰 박스

public static void main(String[] args) {
int a = 15; //변수 선언 초기화
int sum = a+20;//변수 선언 초기화
System.out.println(sum);
}

는 클래스 블록입니다.

여기서 주의해야 할 점은 변수는 선언된 블록 내에서만 사용이 가능하다는 것입니다.

메소드 블록 안에서도 여러 중괄호로 묶여있는 변수들이 있을 겁니다.

예시를 들어보겠습니다.

public class Localvariable {
		public static void main(String[] args) {
			int example = 1;
			if(example == 1) {
				int firstExampleValue = 2;
				//example, firstExampleValue 사용가능
			}
			if(example == 2) {
				int secondExampleValue = 3;
				//example, secondExampleValue 사용가능
			}
			//example 사용가능
			
		}
}

여기서 example은 메서드 블록에서 사용이 되었고, 메서드 블록 안에 if문이 위치하게 됩니다.

첫 번째 if 문에서는 큰 메서드 블록에 있는 example과 자신의 if문 블록 안에 있는 firstExampleValue를 사용할 수 있습니다.

두 번째 또한 큰 메서드 안에 if문이 위치하고 있습니다. 그렇기 때문에 example 변수와 secondExampleValue를 사용할 수 있습니다. 하지만 if문들은 각각 다른 if문 블록에 들어있는 변수명은 사용할 수 없습니다.

메서드 블록에서도 마찬가지입니다. if문 안에 있는 firstExampleValue와 secondExapleValue는 사용이 불가능합니다.

빨간색이 메서드 블록

하늘색이 첫 번째 if문 블록

진한 빨간색이 두 번째 if문 블록이 되겠습니다.

이러한 특성 때문에 변수를 선언할 때에는 어떤 위치에서 사용될 것인지를 잘 파악한 후 선언을 해주는 것이 좋습니다.

만약 모든 곳에서 사용을 해야 한다고 한다면 메서드 첫 번째 줄에 선언을 하는 것이 좋습니다.

낭비를 막기 위해 if문 for문 switch case 문 등에서만 쓰는 변수는 제어문 내에서 사용하는 것이 좋습니다.

 

로컬 변수로 인해 오류가 생기는 경우를 확인해보겠습니다.

해당 코드는 example을 20으로 선언한 후 example이 10보다 크다면 firstExampleValue를 2로 선언하고

example + firstExampleValue를 sumExample로 선언한 뒤 출력을 하려는 코드입니다. 

하지만 위 사진과 같이 오류가 뜨는 것을 알 수 있습니다.

sumExample을 해석할 수 없다는 뜻입니다.

왜 안 되는 것일까?

우리는 sumExample을 if문 블록에서 선언을 했습니다.

하지만 System.out.println();은 메소드 블록에 있습니다.

앞서 말했듯이 현재 이 코드상 메소드 블록에서 불러올 수 있는 값은 example값뿐입니다.

 

우리는 이러한 오류의 힌트는 해당 오류 라인의 마우스를 가져다 대는 것뿐 아니라

콘솔에서도 확인을 할 수 있습니다.

우리는 그럼에도 불구하고 sumExample을 출력을 하고 싶습니다.

출력을 하기 위해선 어떤 조치를 취해줘야 할까

우리는 System.out.println();의 위치를 우리가 알고 싶어 하는 변수의 위치 아래로 옮기면 됩니다.

값이 정상적으로 출력이 된다.

파란 네모 부분이 원래 System.out.prinln(sumExample);이 있던 자리이다

빨간 네모 부분은 sumExample을 출력하기 위해 해당 변수 부분의 블록을 표시한 것이다.

 

반응형