본문 바로가기

Back-End/JAVA

변수 스코프와 형변환

변수 스코프

변수의 생존 범위는 { }로 따진다. 만약 { } 내부에서 변수가 선언되었다면 그 변수의 생존 범위는 { } 안까지다. { }밖은 생존 불가

참고) {1. {2. } }  1번에 생성된 변수는 2번 안에서 생존이 가능하지만 2번에서 생성된 변수는 1번에서 생존이 불가능하다. 

왜냐? 변수의 생존 범위는 { }이기 때문이다. 

public class Scope {
    public static void main(String[] args) {
        int m = 10; // m의 범위는 main 메서드 안까지
        
        if (true) {
            int x = 20; //x의 범위는 if문 안까지만 if문 나가는 순간 생존x
            System.out.println("m = " + m);
            System.out.println("x = " + x);
        }
        
        for (int i = 0; i <= 2; i++) {
        	System.out.println("m = " + m);
        	System.out.println("i = " + i);
        }
    }
}

그래서 변수 m의 경우 main 메서드 { }안에서 활동이 가능하고, 변수 x의 경우 if{ } 안에서만 활동 가능,

변수 i 같은 경우 { } 밖에서 선언했는데 왜 for { } 안에서만 생존 할 수 있지? 라고 생각이 들거다. for (int i = 0; ...)에서 초기식으로 선언하면 for문 안에서만 사용가능하다. 예외니깐 기억해두자!

 


형(타입)변환

 

작은 범위의 데이터 타입에서 큰 범위의 데이터 타입으로 값을 넣는 건 자동으로 처리되지만,

int -> double -> long 은 가능!

큰 범위에서 작은 범위로 값을 넣으려면 오류가 날 수 있다.

int <- double <- long 가능은 하지만 심각한 문제가 발생할 수 있다!

예를 들어, int에서 double, double에서 long으로 변환하는 건 문제가 없지만, long에서 double이나 double에서 int로 변환할 때는

데이터 손실이 있을 수 있어서 조심해야 한다!

또, int에서 long으로 변환하는 건 가능하다고 했는데, 사실 다른 범위에 값을 넣으려면 타입을 맞춰야한다!. 하지만 Java는 이런 변환을 자동으로 해주는데, 이를 캐스팅(casting)이라고 부른다. Java에서는 타입을 맞추는 게 중요하기 때문에 이런 자동 형 변환이 있을 때도 타입 일관성을 지키는 게 필요하다.

그럼 큰 범위에서 작은 범위로 넣으려면 어떻게 해야될까? 바로 명시적으로 형변환 해주는 것이다.

int valueInt;
double valueDouble = 1.5;

valueInt = (double) valueDouble

// 결과 : valueInt = 1

이렇게 double형을 int형으로 바꿀 때 "(대입하려는 타입)"을 명시적으로 적어주면서 형변환을 하면 가능하다. 

 

계산에서도 형변환이 적용된다. 이것만 기억하자!

1. 같은 타입끼리의 계산은 같은 타입의 결과가 나온다

int valueInt = 3 / 2; // int / int 이므로 int값이 도출된다.

double valueDouble = 3 / 2;
/* 
 뭔가 1.5가 도출될 것 같지만 아니다. 
 원칙을 그대로 수행하면 int / int 이므로 1이 나오고 
 double valueDouble = (double)1;
 valueDouble = 1.0; 
 같은 int 타입끼리 계산되어 int형이 도출되고 자바가 double형으로 자동 형변환 해준 것.
 */

2. 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다. (명시적 형변환으로도 형변환이 일어나진다)

double valueDouble = 3.0 / 2 // double / int
double valueDouble = 3.0 / (double)2 // dobule이 더 큰 타입이니 int 2도 double로 자동 형변환
double valueDouble = 3.0 / 2.0 // double / double
double valueDouble = 1.5 // double

'Back-End > JAVA' 카테고리의 다른 글

오버로딩과 this()  (0) 2024.11.16
기본형 변수와 참조형 변수  (0) 2024.11.16
Java의 객체 공유(의존성 주입)  (2) 2024.11.16
ENUM  (4) 2024.11.15
배열  (0) 2024.11.08