자바의 스코프, 형변환

hams·2023년 12월 14일
0

자바

목록 보기
8/11
post-thumbnail

1. 지역변수와 스코프

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

스코프란 변수가 접근 가능한 범위이고, 지역 변수는 본인의 코드 블록 안에서만 생존한다.
하지만 자시느이 코드 블록을 벗어나면 제거되기 때문에 접근할 수 없다.

스코프가 존재하는 이유?

package scope;

public class Scope3_1 {
    public static void main(String[] args) {
        int m =10;
        int temp =0;
        if(m>0){
            temp= m+2;
            System.out.println("temp =" + temp);
        }
        System.out.println("m = " + m);
    }
}

위의 코드는 좋은 예라고 할 수 없다. temp 변수는 if문 안에서만 사용이 되는데 전역으로 설정하게 되면 사용범위가 넓어지기 때문이다.

  • 비효율적인 메모리 사용:tempif 코드 블록에서만 필요하지만, main() 코드 블록이 종료될 때 까지 메모리에 유지된다. 따라서 불필요한 메모리가 낭비된다. 만약 if 코드 블록 안에 temp 를 선언했다면 자바를 구현하는곳에서 if 코드 블록의 종료 시점에 이 변수를 메모리에서 제거해서 더 효율적으로 메모리를 사용할 수 있다.

  • 코드 복잡성 증가: 좋은 코드는 군더더기 없는 단순한 코드이다. tempif 코드 블록에서만 필요하고, 여기서만 사용하면 된다. 만약 if 코드 블록 안에 temp 를 선언했다면 if 가 끝나고 나면temp 를 전혀 생각하지 않아도 된다. 머리 속에서 생각할 변수를 하나 줄일 수 있다. 그런데 지금 작성한 코드는 if 코드 블록이 끝나도main() 어디서나 temp 를 여전히 접근할 수 있다. 누군가 이 코드를 유지보수 할 때 m 은 물론이고 temp 까지 계속 신경써야 한다. 스코프가 불필요하게 넓은 것이다. 지금은 코드가 매우 단순해서 이해하는데 어려움이 없겠 지만 실무에서는 코드가 매우 복잡한 경우가 많다.

2. 자동형변환

자바는 기본적으로 같은 타입에만 값을 대입할 수 있다.

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

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

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

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

3. 명시적 형변환

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


java: incompatible types: possible lossy conversion from double to int라는 오류 발생

직접 (int) 형을 넣어주면서 형변환을 할 수 있지만 이 경우 숫자가 손실되는 문제가 발생할 수 있다.
하지만 만약 이런 위험을 개발자가 직접 감수하고도 값을 대입하고 싶다면 데이터 타입을 강제로 변경할 수 있다.

이것을 형(타입)을 바꾼다고 해서 형변환이라 한다. 영어로는 캐스팅이라 한다. 그리고 개발자가 직접 형변환 코드를 입 력한다고 해서 명시적 형변환이라 한다.

형변환시 발생하는 오버플로우

형변환을 할 때 작은 숫자가 표현할 수 있는 범위를 넘어서게 됐을 때 발생하는 문제
int 형은 2147483647L까지 표현할 수 있기 때문에 2147483648L 를 표현할 수 있는 방법이 없다. 이렇게 기존 범위를 초과해서 표현하게 되면 전혀 다른 숫자가 표현되는데, 이런 현상을 오버플로우라 한다.

  • 보통 오버플로우가 발생하면 마치 시계가 한바퀴 돈 것 처럼 다시 처음부터 시작한다.
  • 중요한 것은 오버플로우가 발생하는 것 자체가 문제. 오버플로우가 발생했을 때 결과가 어떻게 되는지 계산하는데 시간을 쓰지 말고 오버플로우 자체가 발생하지 않도록 막아야 한다. 이 경우 단순히 대입하는 변수(intValue )의타입을 int long 으로 변경해서 사이즈를 늘리면 오버플로우 문제가 해결된다.

계산과 형변환

  1. 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
    int + intint 를, double + doubledouble 의 결과가 나온다.
  2. 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.
    int + longlong + long 으로 자동 형변환이 일어난다.
    int + doubledouble + double 로 자동 형변환이 일어난다.

0개의 댓글