컴퓨터는 잘못이 없다..

[JAVA]자바 지역변수의 특징, 자바의 형변환 본문

공부/JAVA

[JAVA]자바 지역변수의 특징, 자바의 형변환

도토리까꿍v 2020. 11. 24. 15:12
Contents 접기

[메인메소드 속 지역변수 특징]

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이 결과로 나온다.
		 */


	}
}

 

Comments