컴퓨터는 잘못이 없다..
[JAVA]자바 지역변수의 특징, 자바의 형변환 본문
[메인메소드 속 지역변수 특징]
1. 지역변수(local variable) : 메소드 or 생성자 안에서 선언된 변수
지역변수는 좀더 좁은 범위의 지역변수도 존재한다.
좁은 범위란 생성자 혹은 메소드 보다 더 좁은 범위를 의미한다.
{} 중괄호 안에서 선언된 지역변수는 실행순서가 {}를 벗어나면 해당 지역변수는 없어진다.
2. 변수 선언만 해주고 값 대입을 해주지 않으면 만들어지지 않는다. ★★★★★
3. 또한 변수 선언을 먼저 해주고 나중에 값 대입을 해준다면 그 대입해주는 시점에 변수가 생성된다.
4.public static void main(String[] args) 에서 args도 지역변수이며 String[] 타입이다.
[형변환 배우기 전 알아두기]
1. 같은 데이터 타입끼리 연산하면 그 데이터 타입의 결과값이 나온다.
ex) 5/3 = 1, 5.0/3.0 = 1.6666666666666667
2. 자주 하는 실수
5/3의 실수값을 얻고싶다?
(float)(5/3) 이렇게 형변환 해주면 결과로 1.0 이 나와버림!
5/3.0 혹은 5.0/3 혹은 5.0/3.0 혹은 (실수형)5/3 혹은 5/(실수형) 으로 써주어야한다!
[자동 형변환]
1. 바이트 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우 (큰그릇에는 작은그릇의 내용을 넣을 수 있다!)
2. 덜 정밀한 자료형에서 더 정밀한 자료형으로 대입하는경우(정수 자료형보다 실수 자료형이 더 정밀함!)
3. 연산 중에 자동 변환되는 경우
ex1) 정수와 실수를 연산하면 실수가 나옴,
ex2)int와 float을 연산하면 float형 결과값이 나오고 그 값을 double에 대입하면 double로 바뀜
--> 이렇게 자동형변환이 되지 않은 경우이면 빨간줄이 뜨며 에러가 난다, 또한 명시적 형변환을 해주어야한다.
[명시적 형변환]
1. 바이트 크기가 큰 자료형에서 작은 자료형으로 대입하는 경우. (ex) byte bNum = (byte)10; --> 자료 손실이 발생한다.)
2. 더 정밀한 자료형에서 덜 밀한 자료형으로 대입하는 경우 (ex)int iNum2 = (int)3.14; --> 3이 int에 들어간다.)
결론)
표현 가능한 범위가 더 넓은 변수에 담긴 내용을 대입하려면
프로그래머가 대입을 해도 문제가 없다는 것을 확인하고
명시적으로 casting 하면 대입이 가능하다.
(myInt 안에 있는 숫자는 byte 범위를 절대 넘어가지 않아!)
[예제코드1]
package test.main;
public class MainClass02 {
public static void main(String[] args) {
System.out.println("main 메소드가 시작 되었습니다.");
//main 메소드 안의 모든 변수는 지역변수이다.
//public static void main(String[] args)
//에서 args도 지역변수이며 타입은 String[] 타입니다.
//int type 변수 선언과 동시에 값 대입하기
int num1 = 10;
//int type 변수 선언만 하고 (선언만 하면 만들어지지 않는다.)
//자바 스크립트는 변수 선언만 하면 undefined가 자동으로 대입되어 있었다.
//하지만 자바에서는 변수 선언만 하고 값을 넣지 않으면 만들어 지지 않는다.
int num2;
//값은 나중에 대입하기(값이 대입되는 시점에 변수가 만들어진다.)
num2 = 20;
/*
* 정수의 표현 가능한 범위 순서
* byte < short < int < long
*/
int myInt = 100;
byte myByte = 100;
//1.
//int type 변수에 int type 변수에 있는 값 대입 --> 문제 없다.
int a = myInt;
//2.
//int type변수에 byte type 변수에 있는 값 대입 --> 문제 없다.
int b = myByte;
//3.
//byte type변수에 int type 변수에 있는 값 대입 --> 에러난다.
//표현 가능한 범위가 큰 데이터타입에 있는 변수에 있는 값을
//표현 가능한 범위가 작은 데이터타입에 있는 변수에 넣으면 문제가 발생한다.
//byte c = myInt;
//4.
//강제로 byte type변수에 int type 변수에 있는 값 대입 --> 강제 형변환 (강제 casting)
byte e = (byte)myInt;
//5.
//byte가 표현 가능한 범위를 넘어가는 수인 200을 int type변수에 강제형변환 후 대입
//-->에러가 나진 않지만 데이터 손실이 발생한다. 실제로 -56이 f에 대입된다.
int myInt2 = 200;
byte f = (byte)myInt2;
}
}
[예제코드2]
package test.main;
public class MainClass03 {
public static void main(String[] args) {
System.out.println("main 메소드가 시작 되었습니다.");
float num1 = 10.1f;
double num2 = 10.2d;
//1.
//범위가 상대적으로 double 보다 작은 float type 변수에 담긴 값을
//double type 변수에다 담는 것은 가능하다.
double a = num1;//10.100000381469727 가 들어있다. 컴퓨터는 실수를 근사값으로 처리한다.
//2.
//float b=num2; //에러 난다.
//3.
//범위가 넓은 double type 변수에 있는 값을 float type에 담을 때는
//casting이 필요하다.
float b = (float)num2; //b에는 10.2
}
}
[예제코드3]
package test.main;
public class MainClass04 {
public static void main(String[] args) {
System.out.println("main메소드가 시작 되었습니다.");
/*
* 1. 각각의 점수를 지역변수 eng, kor, math 에 대입
* 영어점수 100
* 국어점수 100
* 수학점수 90
* */
int eng = 100;
int kor = 100;
int math = 90;
//2. eng, kor, math 세 점수의 합을 구해서 sum이라는 이름의 지역 변수에 담아 보세요.
int sum = eng + kor + math;
//3. eng, kor, math의 평균값을 구해서 avg라는 이름의 지역 변수에 담아보세요.
double avg = sum/3; //sum과 3 둘다 int type => 연산 결과는 int type으로 나옴
double realavg = sum/3.0;//3을 실수로 만들어 주었다. => 연산 결과는 double type으로 나옴
double realavg2 = (double)sum/3;//sum을 실수로 만들어 주었다. => 연산 결과는 double type으로 나옴
//4. avg 안에 있는 값을 콘솔창에 출력해보세요.
System.out.println(avg); //96.0
System.out.println(realavg); //96.66666666666667
System.out.println(realavg2); //96.66666666666667
/*
* int type과 int type을 연산하면 결과는 int type만 나온다. 만약 정확한 실수 값을 얻고 싶음 연산에 참여하는 데이터
* 중에 어느 하나가 실수 type이 되어야 실수 type이 결과로 나온다.
*/
}
}
'공부 > JAVA' 카테고리의 다른 글
[JAVA]자바의 논리형 타입 Boolean (0) | 2020.11.24 |
---|---|
[JAVA]JAVA의 숫자형 데이터 타입 byte, short, int, long, float, double (0) | 2020.11.24 |
[JAVA]자바 시작하기 (0) | 2020.11.23 |