초급JAVA 2 - 연산자

voilà!·2021년 10월 31일
0

초급JAVA

목록 보기
3/24

<산술연산자>

  • 사칙연산자 : +, -, *, /, %(나머지만 구함)
  • 복합연산자 : +=, -=, *=, /=, %=
  • 증감연산자 : ++(변수의 값을 1만큼 증가), --(변수의 값을 1만큼 감소)

int result = 10 + 20 - 30 / 40 % 50;

여러개의 연산자가 한꺼번에 있을때, * / 를 먼저 수행
%도 나누기를 하기때문에 /와 우선순위 동일

나머지 연산 : 주로 홀짝 구분시 사용

복합연산자 (변수가 연산과 대입에 사용될 때)

result = result + 3;
result += 3;

아래의 문장을 복합연산자를 사용한 문장으로 만들어주세요.

result = result + 10;
result = result % 5;
result = result -2 * 3;

result += 10;
result %= 5;
result -= 2 * 3;

증감연산자
증가연산자(++) : 변수의 값을 1 증가시킨다.
감소연산자(--) : 변수의 값을 1 감소시킨다.

int i = 0;
++i; 전위형 : 변수의 값을 읽어오기 전에 1 증가된다. (읽은 값이 1)
--i; 후위형 : 변수의 값을 읽어온 후에 1 증가된다. (읽은 값이 0)

사칙연산자
피연산자의 값이 서로 같아야만 연산이 가능하다.
+, -, *, /, % : 2항 연산자
ex) 1 + 1 피연산자가 2개

int _int = 10;
double _double = 3.14;
double result2 = _int + _double;
// 자동형변환을 했기 때문에 연산가능

byte _byte = 5;
short _short = 10;
_int = _byte + _short;
// int보다 작은 타입은 int로 형변환된다.
(컴퓨터는 최소 4byte 이상부터 연산 가능)

char도 2byte여서 int로 형변환되어 연산된다.

char _char = 'a';
char _char2 = 'b';
_int = _char + _char2;

<오버플로우, 언더플로우>
표현범위를 벗어나는 값을 표현할 때 발생하는 현상

  • 오버플로우 : 가장 큰 값을 벗어나는 것

    byte b = 127;
    b++;
    System.out.println(b); //결과값 -128
    (byte 타입의 가장 큰 값이 127이므로 1이 증가하면 -128이 됨)

  • 언더플로우 : 가장 작은 값을 벗어나는 것

    b--;
    System.out.println(b); //결과값 : 127

다음을 한줄씩 계산해서 최종 결과값을 출력해주세요.

  1. 123456 + 654321
  2. 1번의 결과값 * 123456
  3. 2번의 결과값 / 123456
  4. 3번의 결과값 - 654321
  5. 4번의 결과값 % 123456

    long result1 = 123456+654321;
    result1 *= 123456;
    result1 /= 123456;
    result1 -= 123456;
    result1 %= 123456;
    //result1을 int타입으로 적으면 오버플로우가 발생

3개의 int형 변수를 선언 및 초기화 후 합계와 평균을 구해주세요.

int a = 3;
int b = 5;
int c = 9;

int sum = a+b+c;
double avg = sum / 3.0
//sum이 int이므로 3.0으로 나눠 double 값으로 만들기
System.out.println("합계 : " + sum + " / 평균 : " + avg);

<반올림>
소수점 첫째자리에서 반올림을 해준다.

avg = Math.round(avg);

소수점 첫째자리까지 보고싶다면

avg = Math.round(avg * 10) / 10.0;

소수점 둘째자리까지 보고싶다면

avg = Math.round(avg * 100) / 100.0;

<랜덤 숫자생성>
0.0 ~ 1.0미만의 수를 랜덤으로 발생시킨다.

Math.random()

1~100까지의 수를 랜덤으로 발생시킨다.

int random = (int)(Math.random() * 100) + 1;
// 최대값이 99이므로 1 더해서 100만들기

<비교연산자>
양쪽에 있는 두 값을 비교
<, >, <=, >=, ==, !=(같지 않다, ! 부정의 의미)
문자열 비교 : equals()

int x = 10;
int y = 20;
boolean b = x < y;
System.out.println(b);

산술, 비교 연산자가 있을 때 산술연산자가 먼저 실행된다.

b = x <= y - 15;
System.out.println(b);

String 타입은 참조형이므로 변수의 값을 비교할 수 없다.
아래에서는 각각 저장된 주소를 비교한 것이므로 false가 출력된다.

String str1 = "abc";
String str2 = "ABC";
b = str1 != str2; //!= 같지 않다
System.out.println(b);

문자열 비교를 위해 equals() 메서드를 사용한다.
같지 않다를 표현할 때는 !를 붙인다.

b = !str1.equals(str2);
System.out.println(b);

다음의 문장들을 코드로 작성해주세요.

x는 y보다 작거나 같다.
x + 5와 y는 같다.
y는 홀수이다.
"기본형"과 "참조형"은 다르다.

boolean b;
b = x <= y;
b = x+5 == y;
b = y % 2 == 1;
b = !"기본형".equals("참조형");

<논리연산자>
&&(AND, 양쪽에 있는 피연산자가 TRUE/FALSE) ||(OR, 둘 중 하나만 TRUE/FALSE)
!(NOT,TRUE를 FALSE, FALSE를 TRUE로)

피연산자로 boolean만 허용한다.

논리연산은 효율적 연산을 수행한다.
왼쪽의 피연산자에서 결과가 정해지면 오른쪽은 수행하지 않는다.
(실행하지 않는 연산은 왼쪽에 경고표시)

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이기 때문에 오른쪽 연산을 수행하지 않으므로 11이 아닌 10이 출력
-> 논리연산 사용시 의도와 다른 값이 출력될 수 있다.

다음의 문장들을 코드로 작성해주세요.

  1. x가 y보다 크고 x가 10보다 작다.
  2. x가 짝수이고 y보다 작거나 같다.
  3. x가 3의 배수이거나 5의 배수이다.

    b = x > y && x < 10;
    b = x % 2 == 0 && x <= y;
    b = x % 3 == 0 || x % 5 == 0;

<비트연산자>

  • |, &, ^, ~, <<, >>
  • 비트(컴퓨터가 표현할 수 있는 가장 작은 단위) 단위로 연산한다.

1byte : 01010101(8bit)

System.out.println(10 | 15); //2진수로 연산
//10 : 00001010
//15 : 00001111
// 00001111
// | 의 경우, 둘다 0이면 결과는 0, 그외는 1

<기타연산자>

  • . (참조연산자) : 특정 범위 내에 속해 있는 멤버를 지칭할 때 사용한다.
  • ?: (삼항연산자) : 조건식? 조건식이 참일 경우 수행할 문장 : 조건식이 거짓일 경우 수행할 문장

int x = 10;
int y = 20;
int result = x < y ? x : y;
System.out.println(result);

주민등록번호 뒷자리의 첫번째 숫자가 1이면 남자, 2이면 여자

int regNo = 3;
String gender = regNo == 1? "남자" : "여자";
//1,2 이외의 숫자를 넣어도 여자로 출력됨
System.out.println("당신의 성별은 " + gender + " 입니다.");

gender = regNo == 1? "남자" : (regNo == 2? "여자" : "확인불가");
// 조건식에 삼항연산을 한번 더 넣어서 해결
System.out.println("당신의 성별은 " + gender + " 입니다.");

0개의 댓글