[ java ] 형변환 & 연산자

Suji Kang·2023년 12월 8일
0

1. 리터럴 (literal)

프로그램에 직접 표현한 값

ex) 10, 3.14, "Hello", true, false

실수 리터럴

float f = 3.14f;  // float형 뒤에 f를 붙여야 한다.
double d = 3.14(D);  // double형은 뒤에 d를 붙여도 되고 안붙여도 된다. -기본값

지수표현 exponential : 매우 큰수 또는 매우 작은 수를 표현할 때 사용

문자 리터럴

char a = 'A';
java에서  char표현하는 방식 : 2byte(16bit) 유니코드(Unicode) 문자표현방식을 사용한다. \u + 4자리의 16진수로 표현한다.
'0'-> 10진수 48, = \u0030
'A'-> 10진수 65, = \u0041
'a'-> 10진수 97 = \u0061
'가'-> 10진수 44032 = \uac00

특수문자 리터럴

\n : 줄바꿈 (new line)
\t :(tab)
\r : 캐리지 리턴 (carriage return) 띄어쓰기
\b : 백스페이스 (backspace)
\" : 큰따옴표    \"Hello\"  -> "Hello"
\' : 작은따옴표 \'Hello\'  -> 'Hello'
\\ : 역슬래시   \\Hello\\  -> \Hello\

예시)

public class FloatLiteral {
	public static void main(String[] args) {
		float f = 3.14F;
		double d = 3.14D;
		
		double e1 = 0.000000001234;
		double e2 = 0.1234E-8;
		System.out.println(e1);
		System.out.println(e2);
		
		double e3 = 4567.890000;
		double e4 = 4.56789E+3;
		System.out.println(e3);
		System.out.println(e4);
		
		char c1 = '가';
		char c2 = '\uAC00';
		System.out.println(c1);
		System.out.println(c2);
		
		System.out.println("Hello\nJava\tHi\bProgram\\\"\'");
		
		final double PI = 3.14;
		// PI = 5.55; -> 상수는 바꿀 수 없다
	}
}

2. 상수 (constant)

final ->최종값이기 때문에 변하지 않는다.

ex)

final double PI = 3.14;

final 키워드는 자료형 앞에 사용
상수는 한번 초기화 되면 변하지 않음

public class FloatLiteral {
	public static void main(String [] args) {
		float f = 3.14F;
		double d = 3.14D;
		
		double e1 = 0.000000001234;
		double e2 = 0.1234E-8;
		System.out.println(e1);
		System.out.println(e2);
		
		double e3 = 4567.890000;
		double e4 = 4.56789E+3;
		System.out.println(e3);
		System.out.println(e4);
		
		char c1 ='가';
		char c2 ='\uAC00';
		System.out.println(c1);
		System.out.println(c2);
		
		System.out.println("Hello\nJava\tHi\bProgram\\");
		
		final double PI = 3.14;
		
	}
}

3.타입 변환 (type casting)

자료형 (data type)을 다른 자료형으로 변환하는 것

*기본 자료형에서 boolean만 제외하고 서로 형 변환이 가능합니다.

1) 자동 타입 변환 (promotion)

논리 <-> 문자 <-> 정수 <-> 실수
정수: byte(1) -> short(2) -> int(4) -> long(8)
실수: float(4) -> double(8)

자연스럽게 형 변환이 되는것 = promotion(자동형 변환)

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

예제)
typeConversion.java

public class TypeConversion {
	public static void main(String[] args) {
		//int a = 20;
		//short b = a;  오류남.  작은것을 큰거에 넣어야한다.
		
		short a = 20;
		int b = a ;
		
		//double e = 3.14;
		//float f = e;   오류남
		
		float c = 3.14f;
		double d = c;
		
		int h =300;
		double i = h;
		
		int j = 400;
		float k = j;
		
		long l = 10L;
		double m = 1;
		
		long n = 10L;
		float o = n;
		
		char p = 'a';
		int q = p;
		System.out.println(p);
		System.out.println(q);
		
		//boolean r = true;
		//int s = r;
	}
}

📝
자동 형 변환은 작은 크기의 데이터를 큰 자료형으로 옮길 때 자동으로 일어나며, 주로 데이터를 손실 없이 보존하는 데 사용된다. ex) 작은 byte(1바이트)를 큰 double(8바이트)로 옮길 때 데이터가 그대로 유지된다.


📝 그러나 반대로 큰 자료형에서 작은 자료형으로 변환하거나, 실수형에서 정수형으로 변환할 때는 자동으로 이루어지지 않는다. 이럴 경우에는 개발자가 직접 명시적인 형 변환을 해야 합니다.

2) 강제형 변환 (casting)

개발자가 강제로 형 변환을 시켜야 하는 경우 = casting(강제형 변환)

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

typeConversion.java

public class TypeConversion {
	public static void main(String[] args) {
			
	int i1 = 300;
	byte b1 = (byte)i1;
	
	System.out.println(i1);
	System.out.println(b1);
	
	
	int i2 = 32768;
		short s1 = (short)i2;
		// -32768 ~ 32767 -> 오버플로우 현상
		System.out.println(i2);
		System.out.println(s1);
		
		int i3 = -129;
		byte b2 = (byte)i3;
		// -128 ~ 127 -> 언더플로우 현상
		System.out.println(i3);
		System.out.println(b2);
		
		double d1 = 3.14;
		int i4 = (int)d1;
		// 실수 -> 정수 : 소수점에 대한 손실
		System.out.println(i4);
		
		byte b5 = 127;
		int i5 = 100;
		System.out.println(b5 + i5); //1:25
		System.out.println((byte)(b5 + i5));
		System.out.println((int)2.9 + 1.8);
		System.out.println((int)(2.9 + 1.8));
		System.out.println((char)0x11110041);
		System.out.println(10.0/4);
		System.out.println(10/4);
	}
}

4. 키 입력

  • 출력: System.out.println(); 메소드
  • 입력: System.in.read(); -> 키보드를 제어하는 객체.
    과 추가적인 Scanner 클래스를 사용한다.

Scanner 클래스를 사용하기 위해서는 java.util 패키지를 import 해야 한다.

import java.util.Scanner;

main 메소드에서 Scanner 객체를 생성한다.

Scanner sc = new Scanner(System.in);

입력을 할때는 자료형 마다 사용되는 메소드가 다르다.


 byte b = sc.nextByte();
 short s = sc.nextShort();
 int i = sc.nextInt();
 long l = sc.nextLong();
 float f = sc.nextFloat();
 double d = sc.nextDouble();
 boolean b = sc.nextBoolean();

 String str1 = sc.next(); // 문자열 입력 -> 다음 토큰(단어를 구분하는 구분자 ' ', '\n', '\r', '\t')까지 입력받는다.
 String str2 = sc.nextLine(); // 문자열 입력 -> 다음 줄까지 입력받는다.-> 다음줄의 '\n'을 제외한 나머지를 입력받는다.

  sc.close(); //  사용이 완료되었으면 Scanner 객체를 닫는다. -> 메모리를 해제한다.

예시)
ScannerExample.java

import java.util.Scanner;

public class ScannerExample {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("이름을 입력하세요 > ");
		String name = sc.nextLine();
		System.out.println("이름은 " + name);
		
		System.out.print("나이를 입력하세요 > ");
		int age = sc.nextInt();
		System.out.println("나이는 " + age);
		
		System.out.print("키를 입력하세요 > ");
		double height = sc.nextDouble();
		System.out.println("키는 " + height + "cm");
		
		System.out.print("결혼 여부를 입력하세요 > ");
		boolean marry = sc.nextBoolean();
		System.out.println("결혼 여부는 " + marry);
		
		sc.close();
	}
}

예시)
ScannerExample2.java

import java.util.Scanner;

public class ScannerExample2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("이름, 나이, 거주도시, 성별을 띄어쓰기로 구분하여 입력하세요.");
		
		String name = sc.next();
		int age = sc.nextInt();
		String city = sc.next();
		String gender = sc.next();
		
		System.out.println("이름: " + name);
		System.out.println("나이: " + age);
		System.out.println("거주도시: " + city);
		System.out.println("성별: " + gender);
		
		sc.close();
	
	}
}

5. 연산자 (operator)

연산자의 종류
1) 산술 연산자 : +, -, *(asterisk), /, %
2) 논리 연산자 : &&, ||, ! (and, or, not), ^(hat)
3) 비트 연산자 : &, |, ~(tilt), ^
4) 대입 연산자  =
- 복합 대입 연산자 : +=, -=, &=, <<=, >>=
5) 비교 연산자 : >, <, >=, <=, ==, !=
6) 조건 연산자   ? :
7) 증감 연산자 : ++, --
8) 시프트(이동 ) <<, >>, >>>

1) 산술 연산자
예시)

public class ArithmeticOperator {

	public static void main(String[] args) {
		double a = 10;
		int b = 20;
		
		double add = a + b; // 30		// 30.0
		double sub = a - b; // -10		// -10.0
		double mul = a * b; // 200		// 200.0
		double div = a / b; // 0.5 -> 0	// 0.5
		double rem = a % b; // 10		// 10.0
		System.out.println(add);
		System.out.println(sub);
		System.out.println(mul);
		System.out.println(div);
		System.out.println(rem);
	}
}

2) 비교 연산자
예시)

import java.util.Scanner;

public class ComparisionOperator {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("두 개의 수를 입력하세요 > ");
		int num1 = sc.nextInt();
		int num2 = sc.nextInt();
		
		sc.close();
		
		boolean b1 = num1 > num2;
		boolean b2 = num1 < num2;
		boolean b3 = num1 >= num2;
		boolean b4 = num1 <= num2;
		boolean b5 = num1 == num2;
		boolean b6 = num1 != num2;
		
		System.out.println(b1+" "+b2+" "+b3+" "+b4+" "+b5+" "+b6);
	}
}

3) 논리 연산자
예시)

public class LogicalOperator {

	public static void main(String[] args) {
		// AND
				System.out.println(true && false);
				System.out.println((5!=6) && (7>3));
				
				// OR
				System.out.println(false || false);
				System.out.println((7==7) || (5==6));
				
				// NOT
				System.out.println(!true);
				System.out.println(!(6!=6));
				System.out.println(!( (5==6) || (4>3) ));
				
				// XOR -> 다르면 true, 같으면 false
				System.out.println(true ^ true);
				System.out.println(true ^ false);
				System.out.println((5>3) ^ (4<=7));

	}
}

4) 증감 연산자
예시)

public class DoubleOperator {

	public static void main(String[] args) {
		int a = 1;
		a++;
		System.out.println(a);
		a--;
		System.out.println(a);
		++a;
		System.out.println(a);
		--a;
		System.out.println(a);
		
		int b = 1;
		System.out.println(++b);//2
		System.out.println(--b);//1
		
		System.out.println(b++);//1
		System.out.println(b);  //2
		
		System.out.println(--b+b++); // 1 -> (1) + 1 -> (2) = 2
		System.out.println(b+++--b); // 2 -> (3) + 2 -> (2) = 4
	}
}

5) 비트 연산자
예시)

public class BitwiseOperator {

	public static void main(String[] args) {
		int a = 9;
		int b = 5;
		System.out.println(a & b); // 1
		System.out.println(a | b); // 13
		System.out.println(a ^ b); // 12
		System.out.println(~a);    // -10
		
		System.out.println(9 >> 2); // 10
		System.out.println(9 << 2); // 100100
		System.out.println(9 >>> 2); // 10
		
		System.out.println(-10 >> 2); // 1001
		System.out.println(-10 << 2); // 1001
		System.out.println(-10 >>> 2); // 1001
	}

}

6. 연산자 우선순위

우선순위가 높은 연산자가 먼저 계산된다.
0. 괄호
1. 증감(뒤)
2. +, -(양수음수표현), 증감(앞), ~, !
3. 형변환 
4. *, /, %
5. +, -(산술)
6. <<, >>, >>>(시프트 연산자)
7. <, <=, >, >=, instanceof
8. ==, !=
9. &
10. ^
11. |
12. &&
13. ||
14. ?:
15. 대입 연산자 =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=
profile
나를위한 노트필기 📒🔎📝

0개의 댓글