기초 JAVA 3강 - 연산자

Whatever·2021년 9월 8일
0

기초 JAVA

목록 보기
3/26

연산자에는 3가지 - 산술, 비교, 논리 연산자가 있다.

[산술 연산자]

  • 사칙연산자 : +,-,*,/,%(나머지)
  • 복합연산자 : +=, -=, *=, /=, %= -> 두 개의 기능을 한 번에 실행
  • 증감연산자 : ++(변수의 값을 1만큼 증가), --(변수의 값을 1만큼 감소)

% - 나머지연산
홀수, 짝수 구분할 때 주로 사용함 (* , /와 우선순위가 같다.)

<복합연산자>
연산과 대입을 동시에 수행하는 연산자

result = result + 3;는 다음과 같다.
result += 3;

=> result 값에 3을 더하여 대입.

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

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

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

<증감연산자>

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

++i; 전위형 : 변수의 값을 읽어오기 전에 1 증가된다.
i++; 후위형 : 변수의 값을 읽어온 후에 1 증가된다.

i = 0;
system.out.println("++i" + ++i); -----> 값 : 1
i = 0;
system.out.println("i++" + i++); -----> 값 : 0

<사칙연산자>
이항연산자, 피연산자가 2개 (10 + 20일 때 10, 20은 피연산자)
피연산자의 타입이 서로 같아야만 연산이 가능하다.

int _int = 10;
double _double = 3.14;
double result2 = _int + _double; // 형변환(자동형변환)을 했기 때문에 문제가 없음.

  • 컴퓨터는 최소 4byte가 되어야 연산을 할 수 있음.
    byte(1), short(2), 이기 때문에 각각 int(4)로 변형해서 연산을 진행.
    char도 2byte여서 int로 변형되어 연산됨.

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

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

(예시)

byte b = 127
b++
system.out.println(b) ------> 결과값 : -128
b--
system.out.println(b) ------> 결과값 : 127

=> byte 타입은 가장 큰 값이 127이기 때문에 1이 증가하면 값이 -128이 된다.

Q2) 다음을 한 줄 씩 계산해서 최종 결과값을 출력해주세요.
1. 123456 + 654321
2. 1번의 결과값 * 123456
3. 2번의 결과값 / 123456
4. 3번의 결과값 - 654321
5. 4번의 결과값 % 123456

long num1 = 123456 + 654321;
num1 *= 123456;
num1 /= 123456;
num1 -= 654321;
num1 % 123456;

=> 위의 변수 num1을 long 타입이 아닌 int 타입으로 입력했을 때 오버플로우가 생긴다.

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

int a = 20;
int b = 5648;
int c = 2135;
int num = a + b + c
double avg = num / 3.0 => num이 int인데 double 값으로 보여지려면 둘 중 하나는 double형이 되어야 함(3.0).

반올림 메소드
avg = Math.round(avg); // 소수점 첫째 자리에서 반올림을 해준다.

Q4) 만약 소수점 첫째자리에 어떤 수가 있었는지를 보고싶다면?

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

외우기

랜덤
Math.random() - 0.0~1.0 미만의 수를 랜덤으로 발생시킨다.

int random = int(Math.random() * 100) + 1; => 최대 발생할 수 있는 값이 99여서 1을 더해준다.

[비교연산자]

  • <, >, <=, >=, ==(같다), !=(같지 않다)
    - 문자열 비교 : equals()
    비교연산자와 산술연산자가 있을 때는 산술연산자가 먼저 실행됨.

String type - 참조형 타입 : 변수 안에 실제 값이 아닌 주소가 들어있음.
참조형 타입을 비교하려면 메서드 - equals()를 불러와야 함.
형태 : 변수.equals() -> 같으면 true, 다르면 False

String 타입의 비교

String str1 = "abc";
String str2 = "ABC";
b = str1 != str2; => 값이 아닌 주소를 비교한 것.

문자가 그대로 같은지를 비교하려면 equals() 메소드를 사용해야 한다.

b = !str1.equals(str2);

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

x 는 y 보다 작거나 같다.

boolean b;
b = x <= y;

x + 5와 y 는 같다.

b = x + 5 == y;

y는 홀수이다.

b = y % 2 == 1;

"기본형"과 "참조형"은 다르다.

b = !"기본형".equals("참조형");

[논리연산자]

  • &&(AND), ||(OR), !(NOT)
  • 피연산자로 boolean만 허용한다. (비교연산 두 개를 연결해주는 역할을 하게 됨.)

int x = 10;
int y = 20;
boolean b = 0 < x && x < 10 || x < y;

=> &&와 ||가 함께 올 때 : &&가 우선순위가 높다.

<효율적 연산>

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

=> 왼쪽의 피연산자에서 결과가 정해지면 오른쪽은 수행하지 않는다.
&&은 둘 중 하나만 false가 나와도 false이고,
||은 둘 중 하나만 true가 나와도 true이기 때문에 왼쪽 값에서 결과가 정해지면 오른쪽 값의 계산은 생략한다.

다음과 같은 오류를 범할 수 있다.(주의)

int a = 10;
b = a < 5 && 0 < a++;
System.out.println(a); -------> a의 값 : 10

=> a가 11이 나올 것으로 의도하고 코드를 작성했다면 틀렸다.
&&의 왼쪽 값이 이미 false이기 때문에 오른쪽 값은 계산되지도 않고 값이 나와버렸다.
오른쪽 값의 a++는 적용되지 않아 11이 아닌 10이 값으로 나왔다.

<비트연산자>

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

<기타연산자>

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

오늘의 과제 : 두 개의 숫자와 연산자를 입력받아 연산결과를 알려주는 프로그램을 만들어주세요.

나의 답 :

Scanner sc = new Scanner(System.in);
System.out.println("숫자입력>");
int num1 = Integer.parseInt(sc.nextLine());
System.out.println("숫자입력>");
int num2 = Integer.parseInt(sc.nextLine());
System.out.println("연산자입력>");
//입력받은 연산자를 어떻게 저장하지? -연산자는 string
String str = sc.nextLine();
int result;
result = str.equals("+") ? num1 + num2 :
(str.equals("-")? num1 - num2 :
(str.equals("") ? num1 num2 :
(str.equals("/") ? num1 / num2 : 0 )) );
System.out.println("값은 " + result + "입니다.");

오늘의 소감 :
처음에 생각하는 과정이 어려웠다.
입력받은 연산자를 어떻게 저장하지?부터 시작해서 대응되는 메소드는 무엇일까 고민했다.
처음엔 안 배운걸로 숙제를 내시나 했는데 다 배운거였다.
연산자는 처음에 char로 저장하려고 하다가 char에 대응되는 sc.nextLine 같은 메소드가 없었다 ㅜㅜ
그래서 String 타입으로 만들고, 또 String 타입으로 만들 때 equals 메소드를 잊어버려서 String 변수인 str에 == 이걸 사용했다.
이상한 값이 나와서 고민하다가 .equals()로 바꾸니 정상 실행됐다.
아직까지는 재미있는데, 오늘은 조금 막히는 부분도 있었다.
생활코딩님이 말한 객체지향은 아직 들어가지도 않았는데 이렇게 시간이 걸리는 걸 보면...
객체지향은 대체 무엇일까, 얼마나 어려울까 궁금하다.

아, String 타입의 ==, !=는 그 자체로 오류가 뜨는 게 아니라, 객체의 번지 수(주소)를 비교하는 연산자였다.
그 값을 비교하려면 equals, 객체가 저장된 주소를 비교하려면 ==, != 이 맞다.

0개의 댓글

관련 채용 정보