본문 바로가기

IT

3. 자바 - 데이터 타입2, 형 변환, 연산자

데이터 타입 2

실수 - float, double

public class Float {
	
	public static void main(String[] args) {
		
		//float를 쓸땐 뒤에 f를 붙여줘야된다고 외우자.
		//실수의 기본값이 double이여서 그렇다.
		//long도 마찬가지로 l를 붙여줘야된다고 외우자.
		
		float f1 = 7.1245f; 
		double d1 = 7.12345;
		System.out.println(f1);
		
		float f2 = 1.234567891234f;
		double d2 = 1.23456789123;
		System.out.println(f2);
		System.out.println(d2);
		
//		2132121344123 | 712343234453
//		2.1321 x e^14 | 7.3212 x e^13
//		이렇게 비교하면 어렵기 때문에 지수형으로 바꾼다.
		float f3 = 3.1315e6F; //3.1414 x 10^6
		
	}

}

 

논리형 - boolean

public class BooleanExample {

	boolean b1 = true;
	boolean b2 = false;
	
//	boolean b3 = False; (x) 무조건 소문자로 적어야한다.
//	boolean b4 = "false"; (x) ""은 문자로 인식한다.
}

 

문자형 - string

public class Textual {
	
	public static void main(String[] args) {
		
		//단일문자로 저장하는 데이터타입 char
		char c1 = 'A';
		char c2 = 66;
		/*
		 * 한글 '가'에 해당하는 유니코드 AC00을
		 * 직접 16진수형태로 저장하려면 탈출문자 \\u를
		 * 적어주어야 한다
		 */
		
		char c3 = '\uAC00';
		System.out.printf("%c %c %c\n", c1, c2, c3);
		
		//문자열을 저장할 수 있는 데이터 타입 String
		String s1 = "my dream";
		String s2 = "is a scientist";
		System.out.println("-------------");
		System.out.println(s1);
		System.out.println(s2);
		
//		print : 괄호안 내용을 단순히 출력. 개행문자(=줄바꿈문자=\n) 포함안됨.
//		printf : C에서의 printf와 동일. %d, %s 등을 쓰기위해 사용. 개행문자 포함X
//		println : 괄호안 내용을 출력한 후 마지막에 개행문자가 포함되어 있어 출력후 한 줄 띄워짐.
		
		//자바에서는 문자열의 +연산을 진행할 수 있다.
		//연산결과로 문자열을 이어붙인 결과를 도출한다.
		System.out.println(s1 +s2);
		System.out.println("-------------");
		
		//문자와 다른 데이터 타입과의 + 연산
		//오류가 날꺼 같지만 자바는 자동으로 변환을 해줌. (연산의 우선순위에 맞춰서)
		System.out.println(100 + 200);
		System.out.println(100 + "200");
		System.out.println(10 + 20 + "hello");
		System.out.println("hello" + 10 + 20);
        
        //기본데이터타입의 연산시 바이트가 큰쪽에 맞춰서 연산한다.
		System.out.println('A' + 10);
        
        	String s4 = "" // null string 길이가 0임 !!
        	String s5 = " " // blank string 길이를 0이 아니다. !!
	}

}
--------------------결과 -----------------------------
my dreamis a scientist
-------------
300
100200
30hello
hello1020
75

 


 

형 변환 (type casting)

데이터의 크기

    byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)

public class CastingExample {
	public static void main(String[] args) {
		
		/*
		 * 크기가 작은 데이터 타입의 데이터를 큰 데이터 타입으로 
		 * 변환 할때는 자바 가상머신(JVM)이 데이터타입을
		 * 자동으로 올려서 변환해준다.
		 */
		byte b = 10;
		int i = b; // byte -> int 자동 형 변환
				
		char c = '가';
		int j = c; //char -> int 자동 형 변환
		System.out.println("가의 유니코드: " + j);
		
		int k = 500;
		double d = k; //int -> double 자동 형 변환
		System.out.println(d);
		
		System.out.println("-----------------------");
		
		/*
		 * 크기가 큰 데이터를 작은 데이터 타입으로 변환하려면
		 * 반드시 캐스트 연산자(type)를 사용하여 
		 * 명시적으로 형 변환을 해야한다.
		 */
		
		int u = 72;
		char w = (char)u; // int -> char 명시적 형변환(강제 형변환) 
		System.out.println("72의 유니코드문자" + w);
		
		/* 
		 * 강제 형변환의 경우 데이터 손실이 일어날 가능성이 있기
		 * 때문에 명시적으로 타입을 변환한다.
		 */
		double g = 4.83123;
		int s = (int)g;
		System.out.println(s);
		
		/* 
		 * 강제 형 변환시 주의점은 해당 데이터 타입이 
		 * 받아들일 수 있는 범위가 아닌 데이터가 들어오면
		 * 오버플로, 언더플로가 일어난다.
		 */
		int f = 1000;
		byte x = (byte)f;
		System.out.println(x); // 11 1110 1000 -> 1110 1000 으로 바꿔서 -24가 나옴
		
	}
}
-------------------결과---------------
가의 유니코드: 44032
500.0
-----------------------
72의 유니코드뮨자H
4
-24
public class CastingOperator {
	public static void main(String[] args) {
		char c = 'B';
		int i = 2;
		
		char cc = (char)(c + i); 
		// char와 int를 + 면 자동형변환으로 큰 int에 맞춰진다.
		//B는 66으로 변경 변경되서 2와 더해진다.
		//하지만 이를 다시 문자형으로 출력하고 싶으면 char를 적어주면된다.
		int ii = c + i;
		System.out.println(cc);
		System.out.println(ii);
		
		int j = 10;
		double d = j / 4; //정수와 정수계산이여서 잘이뤄진 후 실수형으로 변환됨.
		System.out.println(d);
		
		// int형보다 작은 데이터타입의 연산을 진행할 경우 자동으로
		//int형으로 형 변환이 이루어진다.
		byte b1 =100;
		byte b2 = 10;
		//byte b3 = b1 + b2; (x) 에러 발생
		int b3 = b1 + b2;
		System.out.println(b3);
	}

}
----------------결과------------------
D
68
2.0
110

단항 연산자 (Unary Operator)

단항 연산자는 피 연산자가 하나인 연산자를 말한다.

단항 연산자의 종류

1.변수으이 앞이나 뒤에 붙여서 변수 값을 하나 증가시키거나, 감소시키는 증/감 연산자(++/--)

2.양수와 음수를 나타내는 부호 연산자(+, -)

3.비트의 값을 바꿔주는 비트 반전 연산자(~)

4.논리대수의 값을 반전시켜주는 논리 반전 연산자(!)

5.데이터 타입을 바꿔주는 캐스트연산자( (type) )

public class Unary {
		public static void main(String[] args) {
			
			//증감연산자 ++, --
			int i = 1;
			int j = i++; //후위 연산자
			
			System.out.println("i의 값: " + i); // 2
			System.out.println("j의 값: " + j); // 1
			System.out.println("------------------");
			
			int x = 1;
			int y = ++x; //전위 연산자
			
			System.out.println("x의 값: " + x); // 2
			System.out.println("y의 값: " + y); // 2
			System.out.println("------------------");
		}

}

 

2항 연산자 (Binary Operator)

연산자가 int형(4byte)보다 작은 크기의 데이터 타입인 경우에 boolean형을 제외하고 모두 int형으로 자동 형변환되어 연산을 수행한다.

2항 연산자의 종류

1. 산술연산자(+, -, *, /, %) : 결과는 항상 정수

2. 비교연산자 (<, <=, >, >=, ==, !=)

  - 비교연산자의 결과 값은 크기 값을 비교하여 조건을 만족하면 true 그렇지 않으면 false를 반환한다.

  - 만약 비교되는 숫자의 데이터 타입이 다를 경우 큰 데이터 타입에 맞추어 비교 연산을 실행한다.

3. 비트 연산자 (&, |, ^) : 두 비트가 다르면 같으면 으로 나눠서 계산

4. 비트 이동 연산자 (<<, >>) : 왼쪽 항의 값을 2진수로 변환하여 오른쪽 항의 값만큼 비트를 왼쪽(<<), 오른쪽(>>)으                                                     로  이동시키는 연산을 수행

                                ex) int a = 192;

                                      00000000  00000000  00000000  11000000

                                         a << 3

                                       00000000  00000000  00000110  00000000 //1536

5.논리 연산자 (&, |, &&, ||)

 

public class BitNot {
	public static void main(String[] args) {
		//비트반전 연산자(~)
		//정수의 2진수값의 각 자리수를 반전시킨다.
		//0 -> 1, 1-> 0
		byte b = 8; //0000 1000
		System.out.println(~b); //-9
		
		//논리반전 연산자(!)
		//true -> false, false -> true
		boolean bool = false;
		System.out.println(!bool); //true
	}
}
-----------------결과-------------------
-9
true
public class LogicalOperating {

	public static void main(String[] args) {
		
		int x =10, y= 20;
		//if뒤에 조건식의 결과가 true이면 if블록 내부코드를 
		//실행하고 false면 else블록의 내부코드를 실행.
		
		if((x!= 10) & (++y ==21))
			System.out.println("연산결과가 참이다.");
		else
			System.out.println("연산결과가 거짓이다.");
		System.out.println("x:" + x + " y:" + y);
		
		System.out.println("--------------");
		
		int a =10, b = 20;
		//& &&의 차이는 비트로 비교하냐 값으로 비교하냐의 차이.
		//&&는 메모리가 절약된다.
		
		if((a!= 10) && (++b ==21))
			System.out.println("연산결과가 참이다.");
		else
			System.out.println("연산결과가 거짓이다.");
		System.out.println("a:" + a + " b:" + b);
		
	}
}
-------------결과------------
연산결과가 거짓이다.
x:10 y:21
--------------
연산결과가 거짓이다.
a:10 b:20