본문 바로가기
코딩

[ Java ] 자바-입문 6. 스코프,형변환

by 모두의 아카이브 2024. 2. 5.
반응형

1. 지역변수와 스코프

변수는 선언한 위치에 따라 지역변수, 멤버변수(클래스변수, 인스턴스 변수)와 같이 분류된다.

 

지역변수

지역변수는 말 그대로 특정 지역에서만 사용할 수 있는 변수로

변수가 선언된 코드블록{} 안에서만 생존하고, 자신이 선언된 코드 블록을 벗어나면 제거된다.

 

예제코드

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

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

 

2. 스코프 존재 이유

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);
 }
}

 

조건이 맞으면 변수 m의 값을 두배 증가해서 출력하는 코드이다.

여기서 2배 증가한 값을 저장해두기 위해 임시변수 temp를 사용했는데 이 코드는 좋은 코드는 아니다.

왜냐하면 temp는 if 조건이 만족할 때 잠시 사용하는 변수인데  main()코드 블록에 선언되어 있다.

 

  • 비효율적인 메모리 사용: temp는 if 코드 블록에서만 필요하지만 , main() 코드 블록이 종료될 때 까지 메모리에 유지된다. 따라서 불필요한 메모리가 낭비되는데, 만약 if 코드 블록 안에 temp를 선언했다면 if코드 블록의 종료 시점에 이 변수를 메모리에서 제거하여 더 효율적으로 메모리 사용이 가능하다.
  • 코드 복잡성 증가:만약 if코드 블록안에 temp를 선언하면 if가 끝나고 나면 temp를 전혀 생각하지 않아도 된다. 그런데 지금 작성한 코드는 if블록이 끝나도 main()어디서나 temp를 접근할 수 있기 때문에 계속 신경써야 한다.

정리

  • 변수는 꼭 필요한 범위로 한정해서 사용하는 것이 메모리 효율적으로 사용하고 유지보수하기 좋은 코드를 만들 수   
    있다.
  • 좋은 프로그램은 무한한 자유가 있는 프로그램이 아니라 적절한 제약이 있는 프로그램이다.

3. 자동 형변환

  • 작은 범위에서 큰 범위로는 가능
    • int -> long -> double
  • 큰 범위에서 작으넘위는 다음과 같은 문제 발생
    • 소수점버림
    • 오버플로우

작은 범위 숫자에서 큰 범위 숫자타입으로 대입은 자동으로 일어나기 때문에 자동형변환, 또는 묵시적 형변환 이라 한다.

 

4.명시적 형변환

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

package casting;
public class Casting2 {
 public static void main(String[] args) {
 	double doubleValue = 1.5;
 	int intValue = 0;
	 //intValue = doubleValue; //컴파일 오류 발생
 	intValue = (int) doubleValue; //형변환
 	System.out.println(intValue); //출력:1
 }
}

 

큰곳에서 작은곳으로 옮기려고 하니 손실이 발생하여 오류를 발생시키는데,

개발자가 이런 위험을 감수하고도 값을 대입하고 싶으면 명시적 형변환을 하면 된다. (소수점 소실 됨)

 

형변환과 오버플로우

형변환을 할때 만약 작은 숫자가 표현할 수 있는 범위를 넘어서면, 이런 현상을 오버플로우라고 하는데

마치 시계가 한바퀴 돈 것 처럼 다시 ㅓ음 붜 시작한다. -2147483648 숫자는 int의 가장 작은 숫자이다.

 

오버플로우가 발생하지 않기 위해서는 대입하는 변수의 타입을 더 큰걸로 변경해서 사이즈를 늘리면 문제가 해결된다.

 

5.계산과 형변환

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

'코딩' 카테고리의 다른 글

[ Java ] 자바-입문 8.배열  (1) 2024.02.07
[ Java ] 자바-입문 7.Scanner  (0) 2024.02.06
[ Java ] 자바-입문 5. 반복문  (1) 2024.02.05
[ Java ] 자바-입문 4. 조건문  (0) 2024.02.03
[ Java ] 자바-입문 3. 연산자  (0) 2024.02.02