본문 바로가기

국비과정/JAVA (기초)

20230602 _[2일차]_02. 데이터타입1

[데이터타입]

 

프로그램에서는 변수, 상수에 값을 담기 위해서는 그 값의 타입에 맞는 변수를 사용해야 합니다.

이를 '데이터 타입' 이라고 합니다.

 

데이터 타입은 크게 R타입(Reference Type, 참조 타입)과 P타입(Primitive Type, 기본 타입)이 있습니다.

# 이중에 P타입에 대해서 보겠습니다.

 

기본타입은 다시 4가지로 분류됩니다. (pdf p.19 & 책 p.60 ----외우기** )

각 타입마다 메모리 크기가 엄격하게 제한됩니다.

 

정수 타입 

  • byte
  • short
  • int (기본타입)
  • long

실수 타입

  • float
  • double (기본타입)

문자 타입_ 한글자 (A, 가..)

  • char

논리 타입_ true 참 / false 거

  • boolean

String

 


정수타입

 

[byte]    -128 ~ 127

package jun02;

class Apple {
	
}

public class DataType02 {
	// 파일명과 동일한 클래스 앞에 public을 붙여줍니다.
	// 접근제어자
	public static void main(String[] args) {
		
		byte bNumber = 127;  // 127까지만 가능, 그 이상은 형변환 
		byte bNumber2 = (byte) -129;   //  값 허용범위 : -128 ~ 0 ~ 127 
		System.out.println(bNumber2);  //  127  -> 표시 가능한 값들사이에서 돌고 돔.
	}
}

 


[프로모션 / 캐스트]

 

프로모션 : 변수를 대입할 때 작은 타입을 큰 타입에 대입하는 형태 = 자동대입

 

캐스트 : 큰 타입을 작은 타입에 대입할 때 범위를 초과하므로 반드시 해야하는 연산

           (type) 을 명시해서 값을 대입시킵니다.

    이 때, 주의할 점은 상위 비트를 대입되는 타입에 맞게 잘라내기 때문에 값의 변화가 올 수 있습니다.


[short]    -32,768 ~ 32,767

package jun02;

public class DataType02 {
	public static void main(String[] args) {

		short sNum = 32767 + 1; // 형변환 필요
		short sNum =  (short) 32767 + 1;
                           // short + int = int (결과값이 int가 되어버림)
        // 아래처럼 괄호로 묶어서 먼저 계산한 뒤 결과값을 short로 저장해줘야 함
        
		short sNum = (short) (32767 + 1);
		System.out.println(sNum);  //  -32768
	}

}

[int]   -2,147,483,648 ~2,147,483,647

 

package jun02;

public class DataType02 {

	public static void main(String[] args) {
			
		int iNum = 2147483647;   // 허용되는 최대숫자
		int iNum = 2147483648;   // 불가능
        
		iNum2 = Integer.MAX_VALUE;  // 최댓값
		System.out.println(iNum);   // 2147483647
		
		iNum2 = Integer.MIN_VALUE;  // 최솟값
		System.out.println(iNum);   // -2147483648
	}
}

[long]    –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

 

package jun02;

public class DataType02 {
	public static void main(String[] args) {

		long lNum = 9223372036854775807;    // 불가능 (error)
		long lNum = 9223372036854775807L;   // 끝에 L 붙여줘서 long타입임을 표기해줘야 함
		System.out.println(lNum);           // 9223372036854775807
		
		System.out.println(Long.MAX_VALUE);  // 9223372036854775807
		System.out.println(Long.MIN_VALUE);  // -9223372036854775808
	}
}

컴파일러는 기본적으로 정수 리터럴을 int타입으로 간주하기 때문에 

int타입 허용범위를 벗어나는 경우는 대문자 L 표기!!! (long타입임을 컴파일러에게 알림) _ p. 62

 

[형변환연습]

		int iNum = 2147483648; // 불가능, 형변환 필요

		int iNum = (int) 2147483648L;  //  1. L타입 표기후 int로 변환
		long iNum = 2147483648L;       //  2. L타입 표기후 long타입으로 선언

실수타입

 

[float] & [double]

package jun02;

public class DataType02 {
	public static void main(String[] args) {

		float fNum = 3.14;    // 불가능 (error)
		float fNum = 3.14F;   // 끝에 F 붙여줘서 float타입임을 표기해줘야 함
		
		double dNum = fNum;
		iNum = (int) fNum;
		// 정수보다 실수를 더 큰 수로 인지합니다. 
        
        int iNum = 2147483647;
        iNum = fNum;  // 불가능, 같은 4byte지만 타입이 다름!
	}
}

*크기순서*

byte < short < int < long < float < double

[형변환연습]

		iNum = lNum; 
		iNum = fNum;
		lNum = fNum;        
        // 해보기

[Quiz]

여러분은 과수원을 경영하고 있습니다.

키우는 과일은 사과, 배, 오렌지 이며, 각각 하루 생산량은 5, 7, 5 개 입니다..

위 값을 기준으로 하루에 총 생산되는 과일의 수를 출력시키고,

하루를 기준으로 시간당 몇 개의 과일이 생산되는지를 출력해주세요.

 

예) 총 생산 갯수 : 17

     시간당 생산 갯수 : 0.0014598

 

최대한 많은 변수를 만들어서 해주세요.

반드시 한 번의 리터럴과 캐스팅을 활용해주세요.

평균 변수는 모두 float 타입으로 선언해주세요.

 

package jun02;

public class DataType03 {
	public static void main(String[] args) {
		int apple, pear, orange, total;
		float avg;
		
		apple = 5; 
		pear = 7; 
		orange = 5;
		total = apple + pear + orange;
		System.out.println(total);  // 17
		
		avg = total / 24F;        // 방법1
		System.out.println(avg);  // 0.7083333	
        
		avg = (float) (total / 24.0);  //  방법2
		System.out.println(avg);  // 0.7083333	
              
//		**주의**
//		avg = (float) (total / 24);  // 오답
//		System.out.println(avg);     //  0
        
		System.out.println("총 생산 갯수 : " + total);   // 총 생산 갯수 : 17
		System.out.println("시간당 생산 갯수 : " + avg); // 시간당 생산 갯수 : 0.7083333
		// 숫자 + 숫자 = 계산됨
		// 문자 + 숫자 = 연결됨
	}
}

 

서로 다른 타입의 연산에서는, 큰 타입으로 변환된 후 연산이 실행됨.

 avg = total / 24 

(float)  (int) / 24

따라서 (int) / 24 = (int) 가 되어 결과값이 0나옴 (주의**)  _ 책 p.80

 

방법1. 

 avg = total / 24F

           (int) / (float) 의 결과값은 float이므로 가능

or

avg = (float) total / 24

                 (float) / (int) 의 결과값은 float이므로 가능

 

방법2.

 avg = (float) (total / 24.0);

                    (int) / (double) 의 결과값은 double이므로 (float) 타입으로 넘겨주면 가능.