반응형
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 |