[Java] #3 자료형과 형변환

febCho·2023년 9월 22일
0

Java

목록 보기
3/53

1. 자료형

자료형의 기본 구조는 위와 같다.
크게 기본 자료형과 참조 자료형으로 나뉘는데, 참조 자료형의 경우 객체 개념에 대한 이해가 선행되어야 하므로 여기서는 우선 '기본 자료형'과 문자/문자열의 구분을 위한 'String'만 다룬다.

  1. bit: 메모리를 저장하는 가장 작은 단위로 0 or 1이 저장된다. (8bit = 1byte)
  2. 각 자료형의 바이트 크기는 뒤에서 알아볼 '형변환'과 관련이 있으므로 암기한다.

1-1. char (문자형, 2byte)

		System.out.println("===문자형===");
		//문자형, 크기 : 2byte, 표현범위 : 0~65,535
		char c1 = 'A'; //내부적으로 아스키코드값 65
		System.out.println("c1 = " + c1);
		
		char c2 = 65; //A에 해당하는 아스키코드값 65를 직접 대입
		System.out.println("c2 = " + c2);
		
		char c3 = '\u0041'; //A를 유니코드로 표현
		System.out.println("c3 = " + c3);
		
		char c4 = '자';
		System.out.println("c4 = " + c4);
		
		char c5 = '\uc790'; //자를 유니코드로 표현
		System.out.println("c5 = " + c5);
   
  1. 아스키 코드는 영문자만, 유니코드는 한글까지도 처리가 가능하여 Java는 다국어 처리를 위한 유니코드 방식을 사용한다.
  2. char은 문자열이 아닌 '문자'형이다.

1-2. byte (정수형, 1byte)

		System.out.println("===정수형===");
		//byte, 크기 : 1byte, 표현범위 : -128~127
		byte b1= 127;
		System.out.println("b1 = " + b1);
  1. 정수를 표현하기 때문에 음수 값도 존재한다.

1-3. short (정수형, 2byte)

		//short, 크기 : 2byte, 표헌범위 : -32,768~32.767
		short s1 = 32767;
		System.out.println("s1 = " + s1);

1-4. int (정수형, 4byte)

		//int, 크기 : 4byte, 표현범위 : -2,147,483,648~2,147,483,647
		int in1 = 1234567;
		System.out.println("in1 = " + in1);
  1. int는 정수 표현의 기본형으로 자료형이 명시되어 있지 않을 경우, 컴퓨터는 int로 인식한다.
    ex. System.out.println(23);

1-5. long (정수형, 8byte)

		//long, 크기 : 8byte, 표현범위 : 20억 대 이상
		long lo1 = 1234567L;
		System.out.println("lo1 = " + lo1);

정수형의 기본은 int로 long lo1 = 1234567;라고 명시할 경우, 1234567은 int의 범위에 들어가기에 처음엔 int로 인식하나, long 자료형이기 때문에 long 데이터로 lo1 변수에 최종 대입한다.

  1. 이때 처음부터 long형으로 인식하기 위해서는 숫자 뒤에 L(자료형)을 명시하면 된다.
    long lo1 = 1234567L;
  2. L은 자료형에 대한 언급이므로 출력 시 제외되며 생략하여도 에러가 발생하지 않는다.
  3. 또한, 숫자 1과 혼동할 우려가 있어 대문자 사용을 권장한다.

1-6. float (실수형, 4byte)

1-7. double (실수형, 8byte)

		System.out.println("===실수형===");
		//float, 크기 : 4byte
		float f1 = 9.2f;
		System.out.println("f1 = " + f1);
       	//double, 크기 : 8byte
		double d1 = 9.8;
		System.out.println("d1 = " + d1);

실수형의 기본은 dobule이며 그 이유는 double이 소수점 자리를 표현하는 정밀도가 더욱 높기 때문이다.

  1. 따라서 int-long 자료형과 마찬가지로, float 데이터는 f(자료형)을 명시해준다.
    float f1 = 9.2F;
  2. 다만, 숫자 뒤에 자료형 L을 명시하지 않아도 에러가 나지 않는 long과 달리 float 데이터는 뒤에 자료형 f를 명시하지 않을 경우 에러가 발생한다.

1-8. String (문자열, 참조 자료형)

		System.out.println("===문자열 표시===");
		//문자열 표시(기본 자료형이 아님, 참조 자료형)
		String str = "Hello World";
		System.out.println("str = " + str);

1) String의 s는 대문자로 명시해야 한다.

2. 확장 특수 출력 문자

특수 문자를 출력하고 싶을 때 사용하며 '\ (역슬래시)'를 붙인다.

package kr.s02.variable;

public class VariableTypeMain02 {
	public static void main(String[] args) {
		//확장 특수 출력 문자(escape sequence)
		
		char single = '\'';
		System.out.println(single);
		
		String str = "오늘은 \"수요일\" 입니다.";
		System.out.println(str);
		
		//문자열에 '를 표시하면 자동으로 일반문자로 변환됨
		String str2 = "내일은 '목요일' 입니다.";
		System.out.println(str2);
		
		String str3 = "C:\\javaWork";
		System.out.println(str3);
		
		String str4 = "여기는 서울이고\n저기는 부산입니다.";
		System.out.println(str4);
		
		String str5 = "이름\t나이\t취미";
		System.out.println(str5);
	}
}
출력)
'
오늘은 "수요일" 입니다.
내일은 '목요일' 입니다.
C:\javaWork
여기는 서울이고
저기는 부산입니다.
이름	나이	취미

1) String str2 = "내일은 '목요일' 입니다."
큰 따옴표 안 작은 따옴표의 경우 자동으로 일반 문자로 바뀐다.
2) \t : \t 다음 문자열을 한 칸 띄워 출력한다.
3) \n : \n 뒤의 문자열을 다음 라인에 출력한다.

3. 형변환

형변환 규칙

연산 시 원칙은 자료형이 같아야 한다는 것이다.
하지만 이를 고수할 경우 연산에 제한이 발생한다.

그래서 만든 것이 '형변환'이다.

package kr.s03.cast;

public class CastMain01 {
	public static void main(String[] args) {
		System.out.println("===묵시적 형변환(자동 형변환)===");
		//더 큰 자료형으로 승격이 일어나는 형태, 정보의 손실이 전혀
		//없으며 자동적으로 발생
		
		byte b1 = 127;
		byte b2 = 127;
		//byte result = b1+b2;
		int result = b1+b2;//32bit 미만의 자료형 즉,
		                  //byte형 데이터들을 연산하면 32bit로 승격
		System.out.println("result = " + result);
		
		short s1 = 32767;
		short s2 = 32767;
		//short result = s1 + s2;
		int result2 = s1 + s2;//32bit 미만의 자료형 즉,
		                      //short형 데이터들을 연산하면 32bit로 승격
		System.out.println("result2 = " + result2);
		
		int in2 = 1234;
		long lg2 = 2345L;
			         //in2: int -> long 자동 형변환
		long result3 = in2 + lg2;
		System.out.println("result3 = " + result3);
		
		int in3 = 25;
		double db = 10.5;
			           //in3: int => double 자동 형변환
		double result4 = in3 + db;//25.0 + 10.5
		System.out.println("result4 = " + result4);
	}
}

3-1. 묵시적 형변환

1) 표현 범위가 좁은 곳에서 넓은 곳으로 갈 때 발생한다.
2) 문제는 정수와 실수, 이때는 정수보다 실수가 큰 범위이므로 정수 → 실수 표현 시 묵시적 형변환이 발생한다.
ex.
int in3 = 25;
double db = 10.5;
double result4 = in3 + db;//25.0 + 10.5

package kr.s03.cast;

public class CastMain02 {
	public static void main(String[] args) {
		System.out.println("===명시적 형변환(강제 형변환)===");
		//더 작은 자료형으로 강등이 일어나는 형태, 정보의 손실이 발생할 수 있음.
		byte b1 = 127;
		byte b2 = 127;
		//int result = b1 + b2; 원래는 이렇게 하겠지만
		byte result = (byte)(b1 + b2);//자동적으로 int로 형변환된 것을
		//byte로 강제 형변환, 이때 (byte)를 캐스트 연산자라고 함.
		//이때 (b1+b2)처럼 소괄호를 해주지 않으면 b1만 형변환 함.
		System.out.println("result = " + result);
		
		short s1 = 32767;
		short s2 = 32767;
		//int result2 = s1 + s2; 원래는 이렇게 하겠지만
		short result2 = (short)(s1 + s2);//자동적으로 int로 형변환된 것을
		//short로 강제 형변환
		System.out.println("result2 = " + result2);
		
		int in1 = 100;
		long lg1 = 200L;
			                //lg1 : long -> int 강제 형변환
		int result3 = in1 + (int)lg1;
		System.out.println("result3 = " + result3);
		//int가 300을 충분히 담을 수 있기 때문에 왜곡 X
		
		int in2 = 26;
		float ft = 10.3f;
		                    //ft : float -> int 강제 형변환
		int result4 = in2 + (int)ft;
		System.out.println("result4 = " + result4);
		//int는 정수만 담을 수 있으므로 0.3이 절삭되어 정보 왜곡 O
		
	}
}

3-2. 명시적 형변환

1) 표현 범위가 넓은 곳에서 좁은 곳으로 갈 때 발생한다.
2) 단, 이때 데이터의 손실이나 값의 왜곡이 발생하기도 한다.
3) 정수에서 실수로 자동 형변환하는 것과 달리, 실수 -> 정수 표현 시 캐스트 연산자를 활용해 강제로 형변환을 해주어야 한다.
ex.
int in2 = 26;
float ft = 10.3f;
int result4 = in2 + (int)ft;
→ (int)와 같이 소괄호 안에 자료형을 명시한 것을 '캐스트 연산자'라고 한다.

profile
Done is better than perfect.

0개의 댓글