본문 바로가기
풀스택 개발 학습 과정/백엔드(Java, Spring)

[자바] 타입 추론 ,연산자 Operator -1

by 육츠 2024. 8. 2.

타입 추론

변수를 선언할때 타입을 명시하지 않고 var 연산자로 변수 선언
var 로 선언되어 타입이 결정되기 때문에 자바에서는 중간에 타입이 변경 되지 않는다.

 

연산자 Operator

종류 : 산술 연산자, 대입 연산자, 증감 연산자, 비교 연산자, 논리 연산자, 비트 연산자, instanceof 연산자

연산자 우선 순위

결합방향 우선순위 연산자 의미
-> 1 (), [], (type), new (단항 연산) 괄호/ 대괄호/ 객체 생성
<- 2 !, ~, ++, --, +, - (단항 연산) 부정, 1의 보수, 증감연산, 부호
-> 3 *, / ,% (이항 연산) 곱셈 / 나눗셈 연산
-> 4 +, - (이항 연산) 덧셈/ 빼기 연산
-> 5 <<, >> (산술 shift)
>>> (논리 shift)
(이항 연산) 비트이동(shift) 연산자
-> 6 <, <=, >, >=, instanceof (이항연산) 비교 연산
-> 7 == , != (이항연산) 비교 연산
-> 8 & (이항연산) 비트 단위의 논리연산
-> 9 ^ (이항연산) 비트 단위의 논리 연산
-> 10 && (이항 연산) 논리곱
-> 11 || (이항연산) 논리합
<- 12 ?: (삼항 연산) 조건부 연산자
<- 13 = , +=, -=, *=, /=, %=,
<<=, >>=, &=, ^=, ~=
(이항연산) 대입 할당 연산자
<- 14 -> (이항연산) Lambda 연산자

 

예제

# 1. 시간환산

키보드로부터 정수 값에 해당하는 초 단위의 값을 입력받아 시,분,초 단위로 환산하여 출력하는 프로그램을 작성하시오.

실행결과 예시 
시간을 초 단위로 입력하세요 : 2354
2354 초는 0시간 39분 14초 입니다.

import java.util.Scanner;

public class ExamTime {

	public static void main(String[] args) {
		Scanner keyin = new Scanner(System.in);
		

		int sec, h,m,s;
	

		System.out.printf("시간을 초 단위로 입력하세요: ");
		sec = keyin.nextInt();
		s = sec % 60;
		m = sec / 360;
		h = sec / 3600; 
		
		
		System.out.printf("%d 초는 %d시간 %d분 %d 초입니다.", sec, h, m ,s);
		
		keyin.close();
		
	}

}

 

# 2. 금액 환산

철수는 가게에서 물건을 구매하였다. 
물건의 가격과 철수가 지불한 금액을 입력 받아 지불에 필요한 
5만원권, 만원 권, 5천원권, 천원권의 최소 개수와 나머지 금액 구하여 출력하시오.

실행결과 예시 
상품가격을 입력하세요 : 123540
123540 은 5만원권 2장, 만원권 2장, 5천원권 0자으 천원권 3장을 지불하고 540원이 남습니다.

import java.util.Scanner;

public class ExamPrice {

	public static void main(String[] args) {
		Scanner keyin = new Scanner(System.in);
		
		int price, omanwon, manwon, ocheonwon, cheonwon,extra;
		
		System.out.printf("상품가격을 입력하세요 :");
		price = keyin.nextInt();
		
		omanwon = price / 50000 ; 
		manwon = (price % 50000) / 10000;
		ocheonwon = ((price % 50000) % 10000) / 5000;
		cheonwon = (((price % 50000) % 10000) % 5000) / 1000;
		extra = price % 1000;
		
		System.out.printf("%d 은 5만원권 %d장, 만원권 %d장, 5천원권 %d장, 천원권 %d장을 지불하고 %d 원이 남았습니다.", price, omanwon,manwon, ocheonwon, cheonwon ,extra);
		
		keyin.close();
		
	}

}

 

# 3.  BMI지수 구하기

몸무게(kg)와 키(cm)를 입력 받아 BMI 지수를 구하여 출력하시오.
Hint: BMI = 몸무게(kg) / 키(m)의 제곱

실행결과 예시 
몸무게를 입력하세요(kg) : 67
키를 입력하세요(cm) : 165
bmi 지수: 24.6893....

import java.util.Scanner;

public class ExamBmi {
	public static void main(String[] args) {
		
		Scanner keyin = new Scanner(System.in);

		// int weight;
		double weight, height, bmi;
		
		System.out.printf("몸무게를 입력하세요(kg): ");
		weight = keyin.nextDouble();
		
		System.out.printf("키를 입력하세요(cm): ");
		height = keyin.nextDouble();
		
		height = height * 0.01;
		
		bmi = weight / (height * height);
		
		System.out.printf("bmi 지수: %f", bmi);
		
		keyin.close();
	}

}

 

삼항 연산자

변수 = 항1(조건) ? 항2(true) : 항3(false)

public class OperatorTest1 {

	public static void main(String[] args) {
		int a = 6;  // 선언 + 초기화
		String data; // 선언
		
		data = (a % 2 == 0) ? "짝수" : "홀수";   
		// ? 앞은 true 나 false 로 나오는 식을 넣어야함
		System.out.println(data); 
		
		a = 0;
		data = (a > 0) ? "양수" : (a < 0) ? "음수" : "영";
		System.out.println(data); 

	}

}

 

비트 연산자

비트관련 연산자 : & , |, ^, >>, <<, >>>, ~ (1의 보수:단항)

public class OperatorTest2 {

	public static void main(String[] args) {
		int a = 3; // 0000 0011
		int b = 2; // 0000 0010
		int c ;
		c = a & b;
		System.out.println("a & b 의 결과 : " + c); // 문자열로 알아서 변환 되는 것
		
		c = a | b;
		System.out.println("a | b 의 결과 : " + c); // 문자열로 알아서 변환 되는 것
		
		c = a ^ b;
		System.out.println("a ^ b 의 결과 : " + c); // 문자열로 알아서 변환 되는 것
		
		a = 1; // 0000 0001
		c = a << 3; // 0000 1000 (왼쪽으로 3칸 자리 이동)
//		1100 0001  -> 0000 10000
 		System.out.println("a << 3 의 결과 : " + c); //  문자열로 알아서 변환 되는 것
 		
 		
 		// -1000 0000  byte = -128
		a = Integer.MIN_VALUE; // -1000 0000 32 비트가 맨앞만 1이고 전부 0
		c = a >>1;
		System.out.println("a >> 1 의 결과 (산술 shift): " + c);
		// 왜 양수가 아닌가? 
		// 산술 쉬프트는 부호비트를 부호로 채움. 
		// 논리 쉬프트는 부호비트를 0으로 채움.
		// 왜 양수가 아닌가? 산술 쉬프트는 부호가 따라온다. 논리쉬프트는 부호 상관없이 0으로 채움
		
		c = a >>>1;
		System.out.println("a >>> 1의 결과(논리 shift): " + c);
		
		
		// 1111 1111 (음수) ==> -1 
		// a = -1;
		// a = a >> 1
		// (언더플로우) 후 남은 자리에 부호를 넣음
		// 다시 1111 1111 이 된다.
		
		 a = -1;
		 c = ~a; // (1's complement)
		 System.out.println("~a 의 결과: " + c);
		
		
	}

}

 

비트 연산자(2)

boolean b1 = true;
boolean b2 = false;
boolean result;

result = b1 && b2; // 둘 다 true 일 때 true
result = b1 || b2; // 둘 중 하나가 true 면 true
result = !b1; // true < - > false

예제 문제
출결 점수 80점 이상, 세 과목의 평균이 60이상, 과락이 없을 경우에만 수료한다고 가정

public class OperatorTest3 {

	public static void main(String[] args) {
		
		boolean graduate;
		
		int attendance = 80; 
		int trade = 45;
		int it = 40;
		
		graduate = (attendance >= 80) && (((attendance + trade + it) / 3.0) >= 60) && (attendance >= 40 && trade >= 40 && it >= 40);
		
		
		String result = ( graduate) ? "수료" : "미수료";
		
		System.out.printf("당신은 %s 입니다. " , result);
		// System.out.println("당신은" + result + "입니다.");		 
	}
}

 

단축 연산 Short Circuit

: 앞에 대한 결과를 알면 뒤에대한 결과를 알 수 있는 것 

기본 연산 AND 연산자 사용 경우 OR 연산자의 경우
      A && B    result
T       T      T
T       F      F
F       T      F
F       F      F
     A && B    result
T       -       ?
T       -       ?
F       x      F
F       x      F
     A || B    result
T     x      T
T     x      T
F     -      ?
F     -      ?

Short Circuit 을 하지 않는 논리 연산자 >> & , |
피연산자가 정수이면 비트연산
피연산자가 boolean이면 논리연산


위의 예제에서 (attendance >= 80) 값이 false 라면 바로 result가 나옴

 

예제

# 1. 나누어 떨어지는 수 구하기

키보드로 정수를 입력 받아, 4와 5로 나누어 떨어지는 지의 여부를 구하는 프로그램을 작성하시오.
※ &&, || 연산자를 사용하시오

더보기
더보기
더보기
더보기

(실행 예)
정수입력 :45
4와 5로 나누어 지지 않습니다. // 둘 다 나눠지지 않는 경우
4또는 5로 나누어집니다. // 둘 중 하나로만 나눠지는 경우
5로 나누어 집니다. // 어느값이 나눠지는 값인지

정수입력 :20
4와 5로 나누어 집니다. // 둘 다 나눠지는 경우
4또는 5로 나누어집니다.
 
정수입력 :8
4와 5로 나누어 지지 않습니다.
4또는 5로 나누어집니다.
4로 나누어 집니다.

import java.util.Scanner;

public class ExamDivision {

	public static void main(String[] args) {
		int num;
		String and, or, result;
		boolean four, five, onlyOne;
		
		Scanner input = new Scanner(System.in);
		System.out.printf("정수 입력: ");
		num = input.nextInt();
		
		four= num%4 == 0;
		five= num%5 == 0;
		onlyOne = ((four&&!five) || (!four&&five)) ? true : false;
		
		and = four && five ? "4와 5로 나누어집니다." : "4와 5로 나누어 지지 않습니다.";
		or = four || five ? "4또는 5로 나누어집니다." : "4또는 5로 나누어지지 않습니다.";
		result = onlyOne && four ? "4로 나누어 집니다." : "";
		result += onlyOne && five ? "5로 나누어 집니다." : "";

		System.out.println(and);
		System.out.println(or);
		System.out.println(result);
			
		input.close();
	}

}

 

# 2. 합계 구하기

키보드로 0 부터 999 사이의 정수를 입력 받은 후 입력받은 각각의 자릿수의 합한 결과를 출력하는 프로그램을 작성하시오.

더보기
더보기
더보기
더보기

(실행 예)
0~999까지의 정수입력 :456
15

0~999까지의 정수입력 :123
 6

import java.util.Scanner;

public class Exam10 {

	public static void main(String[] args) {
		int num,digit,decimal,hundreds;
		
		Scanner input = new Scanner(System.in);
		System.out.printf("0 ~ 999까지의 정수 입력: ");
		num = input.nextInt();
		
		hundreds = num / 100; 		// 100의 자리
		decimal  = num % 100 / 10; 	// 10의 자리
		digit    = num % 100 % 10; 	// 1의 자리

		System.out.println(hundreds + decimal + digit);
		
		input.close();

	}

}

 

증감연산자

다른 연산자와 같이 사용하는 것을 권하진 않음

public class OperatorTest4 {

	public static void main(String[] args) {
		int x = 1;
		int y = 0;
		
		System.out.println("초기값: x = " + x + ", y = "+ y);
		
		y = ++x;
		System.out.println("선 증가 후: x = " + x + ", y = "+ y);
		
		y = x++;
		System.out.println("후 증가 후: x = " + x + ", y = "+ y);
		
		// 다른 연산자와 같이 사용하는 것을 권하진 않음

		x = 0;
		y = 0;
		y = ++x + x++;
		System.out.println("\nx = " + x + ", y = "+ y);
		
		// 더블로 들어간다.
		double z = 0;
		++z;
		System.out.println(z);
	}

}

초기값: x = 1, y = 0
선 증가 후: x = 2, y = 2
후 증가 후: x = 3, y = 2

x = 2, y = 2

1.0

 

수정 잘 못 해서 앞으로 와버렸다,,