스코프,형변환

윤주영·2024년 10월 17일

지역변수와 스코프

로컬변수 한글로 지역변수라 한다.
지역변수는 이름 그대로 특정 지역에서만 사용 할 수 있는 변수라는 뜻.
그 특정 지역을 벗어나면 사용할 수 없다.
여기서 말하는 지역이 바로 변수가 선언된 코드 블록({})이다.
자신이 선언된 코드블록 안에서만 생존하고, 자신이 선언된 코드 블록을 벗어나면 제거된다.
따라서 이후에는 접근 할 수 없다.

package scope;
public class Scope1 {
             public static void main(String[] args) {
                    int m = 10; //m 생존 시작
                    if (true) {
                                 int x = 20;     //x 생존 시작
                           System.out.println("if m = " + m); //블록 내부에서 블록 외부는 접근 가능
                           System.out.println("if x = " + x);
                    }     //x 생존 종료
              //System.out.println("main x = " + x); //오류, 변수 x에 접근 불가
              System.out.println("main m = " + m);
         }     //m 생존 종료
}

  • int m
1. int m 은 main{} 의 코드 블록안에서 선언되었다.
변수를 선언한 시점부터 main{} 의 코드 블록이 종료될 때 까지 생존한다.

2. if{} 블록 내부에서도 외부 블록에서 선언된 m 에 접근할 수 있다.
쉽게 이야기해서 생존 범위만 맞으면 다 접근할 수 있다.
  • int x
1. int x 는 if{} 블록안에서 선언되었다. 
변수를 선언한 시점부터 if{} 의 코드 블록이 종료될 때까지 생존한다.
2. if{} 내부에서는 자신의 범위에서 선언한 x 에 당연히 접근할 수 있다.
3. if{} 코드 블록이 끝나버리면 x 는 제거된다. 따라서 더는 x 에 접근할 수 없다. 
따라서 이후에 접근하면 cannot find symbol 이라는 변수 이름을 찾을 수 없다는 컴파일 오류가 발생한다. 

변수의 접근 가능한 범위를 스코프(Scope) 라 한다. 참고로 Scope를 번역하면 범위라는 뜻이다.

형변환 - 자동 형변환

형변환

  • 작은 범위에서 큰 범위로는 당연히 값을 넣을 수 있다.
    예) int ▶ long ▶ double
  • 큰 범위에서 작은 범위는 다음과 같은 문제가 발생할 수 있다.
1. 소수점 버림
2. 오버플로우

작은 범위에서 큰 범위로 대입은 허용한다
자바에서 숫자를 표현할 수 있는 범위는 다음과 같다.
int < long < double
int 보다는 long 이, long 보다는 double 이 더 큰 범위를 표현할 수 있다.

자동 형변환
결국 대입하는 형(타입)을 맞추어야 하기 때문에 개념적으로는 다음과 같이 동작한다.

//intValue = 10
doubleValue = intValue
doubleValue = (double) intValue    //형 맞추기
doubleValue = (double) 10      //변수 값 읽기
doubleValue = 10.0       //형변환

이렇게 앞에 (double) 과 같이 적어주면 int 형이 double 형으로 형이 변한다.
이렇게 형이 변경되는 것을 형변환이라 한다.
작은 범위 숫자 타입에서 큰 범위 숫자 타입으로의 대입은 개발자가 이렇게 직접 형변환을 하지 않아도 된다. 이런 과정이 자동으로 일어나기 때문에 자동 형변환, 또는 묵시적 형변환이라 한다.

형변환 - 명시적 형변환

반대로 큰 범위에서 작은 범위로 대입하기
큰 범위에서 작은 범위 대입은 명시적 형변환이 필요하다.

intValue = (int) doubleValue;          //형변환

명시적 형변환 과정

//doubleValue = 1.5
intValue = (int) doubleValue;
intValue = (int) 1.5;     //doubleValue에 있는 값을 읽는다.
intValue = 1;        //(int)로 형변환 한다. intValue에 int형인 숫자 1을 대입한다.

정리

int ▶ long ▶ double

  • 작은 범위에서 큰 범위로는 대입할 수 있다.
이것을 묵시적 형변환 또는 자동 형변환이라 한다.
  • 큰 범위에서 작은 범위의 대입은 다음과 같은 문제가 발생할 수 있다. 이때는 명시적 형변환을 사용해야 한다.
소수점 버림
오버플로우
  • 연산과 형변환
같은 타입은 같은 결과를 낸다.
서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.
profile
반갑습니다.

0개의 댓글