타입 추론
변수를 선언할때 타입을 명시하지 않고 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로 나누어 떨어지는 지의 여부를 구하는 프로그램을 작성하시오.
※ &&, || 연산자를 사용하시오
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 사이의 정수를 입력 받은 후 입력받은 각각의 자릿수의 합한 결과를 출력하는 프로그램을 작성하시오.
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
수정 잘 못 해서 앞으로 와버렸다,,
'풀스택 개발 학습 과정 > 백엔드(Java, Spring)' 카테고리의 다른 글
[개인] SpringBoot 프로젝트 import ~ build 까지 (0) | 2024.10.08 |
---|---|
[ckeditor 5, spring] 두 개의 테이블이 있을 때 editor 내용 db로 보내기 (0) | 2024.06.23 |
[스프링] 게시판 구현 - 1 (게시글 목록 요청) (0) | 2024.03.18 |
[스프링] 서버 전달 (0) | 2024.03.17 |