자바 공부/[ 完 ] 자바 입문 - 자바 첫걸음
7. 스코프와 형변환
잘데친갈비
2024. 2. 25. 13:12
스코프 - 지역변수와 스코프
→ 스코프의 뜻은 범위를 말한다.
- 변수 : 선언한 위치에 따라 지역변수(Local Variable), 맴버변수 로 나뉜다. 지금까지 우리는 지역 변수로 배웠다.
- 지역변수 → 이름 그대로 특정 지역에서만 사용할 수 있는 변수, 지역을 벗어나면 사용할 수 없다. 여기서 말하는 지역은 변수가 선언된 코드 블럭( { } ) 중괄호 안을 의미 한다.
스코프의 존재 이유
- 변수를 선언한 시점부터 변수를 계속 사용할 수 있게 하면 좋겠다고 생각하지만 → 비효율적으로 메모리가 사용되고, 코드의 복잡성이 증가하게 된다.(스코프 범위 안의 변수가 사라지지 않는다면 변수를 새로 선언이나 사용할때에 주의를 기울여야하는 불편함이 생긴다.)
- while 문과 for문을 비교해보면
// -> while문
public static void main(String[] args) {
int sum = 0;
int i = 1;
int endNum = 3;
while ( i <= endNum ) {
sum = sum + i;
System.out.println("i = " + i + " sum = " + sum);
i++;
}
}
// -> for문
public static void main(String[] args) {
int sum = 0;
int endNum = 3;
for (int i = 1; i <= endNum; i++) {
sum = sum + i;
System.out.println(sum);
}
}
// for 문과 while문은 같은 작동을 한다.
→ 해당 코드의 for 문과 while 문은 같은 작동을 하지만 while문의 scope 내에서 i 를 선언해 사용할 수 없어 main 에서 i 를 선언해줬다 그럼 생기는 문제가 다음 코드를 작성 해 줄 때에도 i 변수를 생각하면서 코드를 짜야하는 불편함이 생긴다. ⇒해당 코드는 for 문이 구조적으로 더 깔끔하다고 할 수 있다.
스코프 정리
- 변수는 꼭 필요한 범위로 한정하여 사용하자
- 좋은 프로그램은 무한한 자유보다 적절한 제약이 있는 프로그램이다.
형변환 → Casting
자동 형변환
- 작은 범위에서 큰 범위로는 당연히 값을 넣을 수 있다.
- ex) int → long → double (가능)
- 큰 범위에서 작은 범위는 문제가 발생할 수 있다.
- 소수점 버림 (double → long, int)
- 오버 플로우 (long → int)
- 작은 → 큰 데이터 타입으로 변환될때에 자동으로 형태를 변환 시켜준다
- ex ) int → double 할때에 int 타입의 데이터를 double 타입으로 자동으로 변환 시켜서 저장 시킨다.
명시적 형변환
- 큰 범위에서 작은 범위 대입은 명시적 형변환이 필요하다.→ 손실변환을 시킨다.
- double doubleValue = 1.5; int intValue = 0; // intValue = doubleValue; // 컴파일 오류 발생 intValue = (int) doubleValue; // 명시적 형변환 System.out.println(intValue);
- 위의 코드와 같이 변경하고 싶은 타입을 ( int ) 와 같이 괄호안에 사용하여 명시적으로 입력하면 된다.
형변환 특징
- 형변환 한다고 해서 doubleValue의 자체의 타입이 변경 되거나 그 안의 값이 변경 되는것이 아니다.
- 읽는 값의 형태만 변경하는 것이다. 해당 타입의 값은 그대로 저장되어 있는 상태다.
- 변수의 값은 ( = ) 대입 연산자 할때만 변경 된다.
- 같은 타입끼리의 계산은 같은 타입 → int + int = int
- 서로 다른 타입 계산은 큰 범위로 자동 형변환이 된다 → int + double = double + double → double
오버플로우가 발생했을때 대처
- 오버플로우가 발생하면 끝난거다 → 그냥 상위 타입으로 사용해라