Java공부(코딩)

코딩초보의 Java(자바)공부 3일차-2 (스코프와 형변환)

동곤일상 2024. 12. 8. 18:06
반응형

하나만 올리려했는데 시간도 남고 공부를 더 해야 할 것 같아서 스코프와 형변환에 대해서

빠르게 공부해보도록 해요! 

 

1) 스코프(Scope)

일단 스코프(Scope)란 범위를 말해요 . 음... 변수의 생존주기라고 말하면 이해가 빠를까요?
main에서 생성된 변수는 main이 끝날 때 까지 생존하고 (스코프 넓음)
for문 안에서 선언된 변수는 for(반복문)이 끝나면 사라집니다.! (스코프 좁음)
코드로 설명한번 해볼게요 

for문 안에서 선언된 변수는 for문 에서만 사용가능(for문이 끝나면 사라짐)

 
그냥 계속 변수를 사용하게 해주면 안될까? 라는 의문이 들어서 찾아본 결과
그렇게 한다면 ,, 2가지 문제가 발생한다고 한다
1)비효율적인 메모리사용
저기 i로 예를 들자면 for문 안에서만 필요한데 계속 생존해 있다면
메모리낭비 발생
2)코드 복잡성 증가
for문 안에서만 신경써야 할 변수가 코드전체에서 생존하면
유지보수 측면에서도 복잡해지고 코드가 더러워진다.
(좋은코드의 조건 : 간소화 , 식별가능 , 분류가능 , 배열기능 , 표준화가능) 
좋은 프로그램은 자유로운게 아닌 제약이 있는 프로그램이다
 
 


2)형변환

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

형변환 설명을 위한 코드입니다.

 
작은 범위 -> 큰범위는 문제없이 변환되는 것을 알 수 있다
 
하지만
 
큰 범위 -> 작은범위는 컴파일오류가발생한다.
소수점을 버리고 넣는방법( 명시적 형 변환)을 사용해야한다.
int a ;
double d = 10.5;
a = (int) d ;   //다운캐스팅
이렇게 변환해서 넣으면 소수점을 제외한 10만 a에 들어가게 됨.
** double d 의 값은 전혀 영향받지않음 **


연산에서의 형 변환(casting)

연산에서도 형변환이 발생한다
다음 예를 보고 연산에서 캐스팅이 어떻게 일어나는지 보자.

 
눈 여겨 볼 포인트가 몇 군데 있다.
1)result2 의 묵시적(자동)형변환
int가 double보다 작은 범위이므로 자동형변환이 일어남
double result2 = (double)2 의 형태로 저장이 된다.
 
2)result 4 의  명시적 형변환(다운캐스팅)  
int a = 9; , int b = 4;
double result4 = (double)a /  b;
9.0 / 4  =>   뒤에있는 4 도 double형으로 묵시적 형변환
(double/ int ==> double / double)
 
최종 : (double)a / (double)b == 9.0 / 4.0  
result4 = 2.25;


정리

형변환

`int < long < double`
작은 범위에서 큰 범위로는 대입할 수 있다.
(작은 그릇을 큰그릇에 담을 수 있듯이)
이것을 묵시적 형변환 또는 자동 형변환이라 한다.
 
큰 범위에서 작은 범위의 대입은 다음과 같은 문제가 발생할 수 있다. .
(큰그릇을 작은그릇에 어떻게 담지??? 라 생각)
소수점 버림, 오버플로우
이때는 명시적 형변환을 사용해야 한다 
ex) long a = (long)double d ;
ex2) int c  = (int)9.4; ==> c 에는 9 만 들어감
 
연산과 형변환
같은 타입은 같은 결과를 낸다.
서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난