- 공유 링크 만들기
- X
- 이메일
- 기타 앱
산술 연산자
- 사칙연산 : +, -, *, /, % (나머지)
- 복합연산자 : +=, -=, *=, /=, %= : 사칙연산자와 대입연산자를 합쳐서 만들어짐. 사칙연산자가 먼저나오고 대입연산자가 끝에 나오는걸 헷갈리지 말것.
- 증감연산자 : ++, --
int result = 10 + 20 - 30 * 40 / 50 % 60;
int 로 result를 선언해준다. 처음에는 꼭 필요하겠지?
.계산은 왼쪽에서 오른쪽으로 이동한다.
.곱하기와 나누기가 더하기 빼기보다 우선순위가 더 높다
.나머지 연산
result = 10 % 4; ( result를 위에서 int로 선언을 해주었기 때문에 )
.(여기서 int result 를 해줄 필요가 없는게 앞에서 result를 선언을 해주었기 때문)
System.out.println(result);
출력 : 2
과제
5개의 산술연산자를 사용해 5개의 연산을 수행 후 출력해주세요.
result = 300 + 20;
System.out.println(result);
출력 : 320
result = 500 - 20;
System.out.println(result);
출력 480
result = 20 * 30;
System.out.println(result);
출력 600
result = 40 / 30;
System.out.println(result);
출력 : 1
앞에서 result를 int로 선언을 해놨기때문에 1만 출력. int가 정수이기 때문
result = 400 % 800
System.out.println(result);
출력 : 400
.이항연산자 : 양쪽에 피항연산자가 있는 애들 .
특징 : 양쪽에 있는 연산자의 타입이 같아야 연산을 할 수 있다.
.복합 연산자 모양 ( 복합연산자 : +=, -=, *=, /=, %= )
변수에 저장되어 있는 값에 연산을 수행할 때 수행할 연산자와 대입연산자를 결합해 사용할 수 있다.
(위에 과제부분에서 result를 int로 선언했고 result값이 400 이다. )
result = result + 3;
System.out.println(result);
출력 : 403
.복합연산자을 사용해보자
result += 3;
System.out.println(result);
출력 : 406
result -= 5;
System.out.println(result);
출력 : 401
result *= 2;
System.out.println(result);
출력 : 802
.증감연산자
1. 증가연산자(++) :변수의 값을 1 증가시킨다.
2. 감소연산자(--) : 변수의 값을 1 감소시킨다.
시점의 문제로 넘어가보자 증감연산자가 앞에 올수도 있고 뒤에 올 수 도 있다.
int i = 0;
전위형과 후위형이 있다.
++i 전위형 -> 1이 먼저 변수에 더해진다. (변수의 값을 읽어오기 전에 1이 증가한다. )
i++ 후위형 -> 변수의 값이 먼저 나오고 1을 증가한다. (변수의 값을 읽어온 후에 1 증가한다. )
--i; 1번저 뺌
i--; 연산자가 정의되고 1이 빼짐.
* 전위형이든 후위형이든 단독으로 쓰이게 되면 동일한 결과를 얻게 되지만 증감연산자가 문장 안에 들어가게 되면 차이를 만든다.
i = 0;
System.out.println("++i = " + ++i);
++i = 이거는 출력이 그냥 된다. + 는 단어와 단어사이를 그냥 연결 ++i는 값을 입력 1+0 -> i
출력
++i = 1
i = o;
System.out.println("i++ = " + i++);
i++ = 그냥 프린트 되는 부분 "" 이 있으니까 +는 문자와 문자두개를 연결
i++은 0 이 우선 입력이 됨.. 나중에 1이 덧붙여져서 i자체의 값은 1이지만 지금 입력되는 순간에는 0임
,따라서 출력 : i ++ = 0
System.oout.println(i);
출력 :
1
피연산자의 타입이 서로 같아야만 연산이 가능하다.
int _int = 10;
double _double = 3.14;
_int 는 int로 선언이 되었고 10이다. _double은 double 로 선언이 되었다. 그래서 실수이고, 3.14인 소숫점까지 실수로 표현되는 것이다.
double result2 = (double)_int + _double;
_int 와 _double을 더해주려면 int인 _int를 double 과 같은 연산자로 만들어 주어야 한다. 그래서 항변환을 해주려고 _int앞에 (double)을 써주었다.
그런데 이렇게 _int보다 _double이 표현범위가 더 큰 타입이기 때문에 형변환이 된다.
System.out.println(result2);
double result2 = _int + _double
int 타입에서 double 타입으로 형변환이 자동으로 되서 생략 될 수 있다.
result2는 double로 선언되었다.
_int는 정수로 선언이 되었고,
byte _byte = 5;
short _short = 10;
int result3 = _byte + _short;
System.out.println(result3);
출력 : 15
_byte는 byte형식으로 선언됬고 _short는 short 로 선언 되었다. result3는 int로 선언 되었다.
두개가 지금 다른 data type인데 두개는 int보다 작은 바이트이기 때문에 int를 기준으로 연산된다.
컴퓨터는 기본적으로 4바이트를 기준으로 연산을 한다.
/오버플로우 , 언더플로우
오버플로란 가장 큰 값을 벗어나는 것이고 언더플로우랑 가장 작은 값을 벗어나는 것이다.
표현범위를 벗어나는 값을 표현할 때 발생하는 것이 오버플로우와 언더플로우이다.
기본적으로 byte의 범위는 -128에서 127까지가 포함된다.
byte b = 127;
b++;
System.out.println(b);
그냥 기본적으로 보면 127에 1을 더하는 증감연산자여서 128의 값이 되는데 byte는 127까지만 가능하다 그래서 반대쪽 맨 끝으로 가서 -128 출력
b = -128
b--; (b의 값에서 증감연산자로 -1이되서 범위를 넘어가는 것이기 때문에 반대쪽 끝까지 간다.
System.out.println(b);
결과 값 써주기 : 127
따라서 연산을 할 때는 표현 범위를 잘 예상해서 타입을 결정하는 것이 필요하다.
다음을 한줄씩 계산해서 최종 결과값을 출력해주세요.
int num1 = 15;
int num2 = 34;
int num3 = 49;
int sum = num1 + num2 + num3
(int는 소숫점부분을 제대로 얻을 수 없지만 double로 실수로 구해서 소숫점까지 구하고싶다. )
double avg = sum / 3.0; (3이 아니라 3.0을 해준다. )
System.out.println("합계 : " + sum + " / 평균: " + avg );
/반올림 하는법 메소드 : Math.round(avg); 를 사용할 것이다. !
avg = Math.round(avg);
System.out.println(avg);
반올림을 해주는 메소드가 바로 math.round() 는 소숫점 첫째자리에서 반올림을 해준다.
참고 : avg = 32.666666666666664
Math.round(avg) avg를 소숫점 첫째자리에서 반올림. double 타입일테니까 소숫점으로 나오네
((( avg = Math.round(avg);
System.out.println(avg);
출력 : 33.0 이다.
예를 들어 소숫점 둘째자리에서 반올림하고 싶다. 하면
avg = Math.round(avg*10) / 10.0;
그러면 avg 부분은 32.666666666666664 이 수이다. 여기서 10을 곱하기 하면 326.66666666666664 이렇게 되고 이거에서 Math.round 을 이용해서 반올림을 하면 Method 인 Math.round는 소숫점 첫째자리에서 반올림을 한다. 니까
327이되고 원래데로 돌아가려면 10을 나눠줘야함. 그거를 다시 avg로 입력하면 32.7이되서 소숫점 2째자리에서 반올림을 한것이 된다.
그것처럼 10이 아니라 100을 곱하고 나누어 주면 소숫점 3번째자리에서 반올림이 되서 소숫점 2번째 자리까지 구할 수 있다.
avg = Math.round(avg * 10 )
/랜덤수 발생
System.out.println((int)(Math.random()*100) + 1);
// Math.random() 은 0.0 부터 1.0미만의 수를 발생시켜 준다.
0 ----------------------------1 사이의 수.
그러면 Math.random 이 숫자에 우선 100을 곱해주는 것에 정수만을 구하고 1을 더해주면
1부터 100까지의 수가 나온다.
/비교연산자
< , >, <= , >=, ==, !=(다르다라는 뜻)
문자열 비교 : equals()
boolean b = 10 < 20 ;
System.out.println(b)
.false 나 true로 나오겠지?
.비교연산자의 연산결과는 boolean 이다.
.boolean은 논리 연산자이다.
. 산술연산 후 비교연산을 수행한다.
즉 b = 10 <= 20 - 15; 인데
산술연산인 20 -15 를 먼저 수행하면 5 , b = 10 <= 5 이다
그러면 이제 비교연산자를 수행해서 boolean결과를 나오게 한다.
b는 false (비교연산자)
String str1 = "abc";
String str2 = "abc";
b = str1 == str2;
System.out.println(b);
출력 : true
. str1은 문자 str2도 문자
.여기서 문자열의 내용이 아닌 저장된 주소를 비교하는 것이다.
.주소가 같기 때문에 true가 나오는 것.
.string 은 참조형 타입이다.
참조형 타입 : 변수에 저장을 하는 것이 아니라 따로 저장하는 것 -> 따로 저장한 주소를 변수에 저장하는 것 -> 그 주소가 같기 때문에 비교연산에서 true가 나왔다.
/ 그러면 string 의 내용을 비교해 볼까?
String 의 내용을 비교하기 위해서는 equals () 메서드를 사용한다.
b = str1.equals(str2)
이문장의 뜻은 앞에 있는 str1 이 가로에 있는 str2와 내용이 같니? 를 물어보는 것이다.
b = str1.equals(str2); 얘네는 같다 그래서 결과는 true가 나옴
System.out.println(b);
결과 : true
b = !str1.equals(str2); 이문장의 의미는 !는 not의 의미
그래서 str1이랑 str2랑 같은데 ! 얘가 같지 않다고 물어보는 것이니 false가 나옴
System.out.println(b); 는 false가 나옴
과제.
int 타입의 x와 y 변수를 만들고 다음의 문장을 코드로 작성하기
1. x가 y보다 크다.
2. x + 5와 y는 같다.
3. y는 홀수이다.
4. "변수"와 "데이터"는 같다.
먼저 int 타입의 x와 y의 변수를 만들기
int x = 30;
int y = 60;
System.out.println(x > y);
false 출력
가로 안에 들어있는것은 비교연산자이며 비교연산자는 boolean으로 나타난다.
System,out.println(x+5 == y);
false 출력
System.out.println(y%2 == 1);
false 출력된다.
System.out.println("변수".equals("데이터"));
false 출력된다.
/ 논리 연산자
.&&( and의 의미 ), ||(or의 의미 ), !(not의 의미 : true는 false로 변환하고 false는 true로 변경된다. 피 연산자로 boolean만 허용된다.)
. and or는 boolean 타입만 허용된다.
boolean b = 5 < 20 && 15 % 2 == 0 || 0 >= 5 ;
비교연산 먼저하고 그리고 논리연산 순이다.
|| 보다 &&의 우선순위가 높다 and의 우선순위가 높다.
. !는 true and false 에만 붙을 수 있다.
조건식의 결과를 반대로 저장한다.
b = ! (10<20);
b = !10 < 20; 이렇게 안됨.
! 는 true and false 에만 붙을 수 있다.
효율적 연산
그리고 &&
b = true && true; //true
b = true && false; //false
b = false && true // false
b = false && false; // false
또는 ||
b = true || true // true
b = true || false; //true
b = false || true; //true
b = false || false; // false
왼쪽의 피연산자에서 결과가 정해지면 오른쪽은 수행하지 않는다.
왼쪽에서 결과가 정해지면 오른쪽 수행하지 않음
.조심해야 할 상황
int a = 10;
b = a < 5 && 0 < a++;
System.out.println(a);
왼쪽 항에서 false가 나왔고 오른쪽에서 의도한 a++ 계산 결과를 볼 필요도 없이 결정됬기 때문에 오른쪽은 시행되지 않음. 그래서
a가 의도한 11이 아니라 10이 된다.
a++이 실행되지 않음.
모르는것
//int 타입의 x와 y 변수를 만들고, 다음의 무장들을 코드로 작성해 주세요.
//1. x가 y보다 크고, x가 10보다 작다.
//2. x가 3m의 배수이거나 x가 5의 배수이다.
int x;
int y;
X > y && x < 10
boolean ss = x > y && x < 10;
boolean jj = x % 3 == 0 || x % 5 == 0;
비트 연산자
. |, &, ^, ~, <<, >>
.비트 단위로 연산한다.
비트 : 컴퓨터가 표현하는 가장 작은 단위
/기타 연산자
. ( 참조 연산자) : 특정 범위 내에 속해 있는 멤버를 지칭할 때 사용한다.
(type) : 형변환
? : 삼항 연산자. 조건식주고 그 조건식이 참일경우 여기 실행 : 조건식이 거짓일 경우 여기실행
-> 처음에 조건식이 false 인지 true 인지. -> 참이면 두번째 식 수행, false면 세번째 식 수행
/ 1 byte : 0이나 1이 8개가 있는것. 01011000 ( 각각 하나하나가 비트 )
System.out.println( 10 | 15 ) ; // | : 둘다 0인 경우 0 그외 1
(세로로 비교해봐 )
10 : 00001010
15 : 00001111
답 00001111
결과 : 15
/삼항 연산자
int x = 10;
int y = 20;
int result = ( x < y) ? x : 7;
---> 여기 구조를 잘보면 우선 result는 x와 y를 비교한다 그게 첫번째 그리고 ?를 기준으로 만약 (x<y) 가 참이면 x를 프린트 하고 만약 거짓이면 7을 프린트한다 즉
틀을 보면 변수 = ( 처음 조건식 ) ? 조건식이참이면 이것 : 조건식이 거짓이면 이것
System.out.println(result);
문제
주민등록번호 뒷자리의 첫번째 숫자가 1이면 남자, 2이면 여자
int regNo = 2; // ( or 1이 겠지)
String gender = (regNo == 1) ? " 남자" : "여자" ;
System.out.println ( "당신의 성별은 " + gender + "입니다. " ;
삼항 연산자를 두개 사용가능
gender = regNo ==1 ? "남자" : (regno ==2 ? "여자" : "확인불가" ) ;
// 2개의 숫자를 입력받고, 둘 중 더 큰 숫자를 출력해주세요.
//
Scanner sc = new Scanner(System.in);
//
//System.out.println("첫번쨰 숫자를 입력해주세요>");
//int number1 = Integer.parseInt(sc.nextLine());
//System.out.println("두번째 숫자를 입력해주세요>");
//int number2 = Integer.parseInt(sc.nextLine());
//
//int result_2 = (number1 < number2 ) ? number2 : number1;
//
//
//System.out.println("입력받은 내용 : " + str2);
//
// 숫자를 입력받고, 그 숫자가 1이나 3이면 남자를 2나 4면 여자를 출력해 주세요.
//그외의 숫자를 입력하면 확인 불가를 출력해 주세요.
System.out.println("숫자를 입력해 주세요>");
int num1 = Integer.parseInt(sc.nextLine());
gender = num1 == 1 || num1 == 3 ? "남자" : ( (num1 == 2 || num1 == 4) ? "여자" : "확인불가" );
//두개의 숫자와 연산자를 입력받아 연산결과를 알려주는 프로그램을 만들어주세요.
문자의 값을 비교
과제.....
두개의 숫자와 연산자를 입력받아 연산결과를 알려주는 프로그램을 만들어 주세요.
1. import를 한다 단축기 : ctrl + shift + o
Scanner sc = new Scanner(system.in);
System.out.println("첫째로 아무 숫자나 입력해주세요 x : ");
int x_ = Integer.parseInt(sc.nextLine());
System.out.println("둘째로 아무 숫자나 입력해 주세요 y: ");
int y_ = integer.parselnt(sc.nextLine());
System.out.println (" 연산자를 입력하시오 : > ");
int z_ = Integer.parselent(sc.nextLine());
System.out.println( "결과값 : " + x + z + Y )
sum = x + y;
mutli = x * y;
divi = x / y;
remainder = x % y;
minus = x - y;
System.out.println( " 두 연산의 합 : " + sum );
System.out.println(" 두 연산의 곱셈 : " + multi );
System.out.println(" 두 연산의 나눗셈 : " + divi);
System.out.println(" 두 연산의 나머지 : " + remainder);
System.out.println(" 두 연산의 뺄셈 : " + minus);
댓글
댓글 쓰기