멀티캠퍼스 백엔드 과정 10일차-12일차[6월 14일~16일] - JAVA 연산자와 제어문, 반복문

GoldenDusk·2023년 6월 18일
0
post-thumbnail

연산자

오버플로우와 언더플로우

오버플로우

  • 타입이 허용하는 최대값을 벗어나는 것

언더플로우

  • 타입이 허용하는 최소값을 벗어나는 것

결론

  • 정수타입 연산 오버플로우나 언더플로우가 발생하면 에러가 발생하지 않고, 해당 정수 타입의 최댓값, 최솟값으로 변환

예제

package javastudy.day02.operator;

/*오버플로우/언더 플로우
- 오버 플로우란? 타입이 허용하는 최댓값을 벗어나는 것
- 언더플로우란? 타입이 허용하는 최솟값을 벗어나는 것
정수타입 연산 오버플로우나 언더플로우가 발생하면 에러가 발생하지 않고, 해당 정수 타입의 최댓값, 최솟값으로 변환
*/
public class OverflowUnderflowEx
{

	public static void main(String[] args)
	{
		//오버플로우 : 최대값을 벗어나 작은 허용범위 숫자로 변경
		byte var1 = 125;
		for(int i = 0; i<5; i++) {
			var1++;
			System.out.println("var1 : "+var1); // 126, 127, -128, -127 -126
			
		}
		
		System.out.println("-------------------");
		
		//언더플로우 : 최소값을 벗어나 높은 허용범위 숫자로 변경
		byte var2 = -125;
		for(int i = 0; i<5; i++) {
			var2--;
			System.out.println("var2 : " + var2); //-126, -127, -128, 127, 126
		}
		
		//허용범위가 넘어가게 됨
		int var3 = 1000000;
		int var4 = 1000000;
		int var5 = var3 * var4;
		System.out.println(var5); //-727379968
		}

	}

정확한 계산은 정수 연산으로

정수 연산

  • 산술 연산을 정확하게 계산하려면 실수 타입을 사용하지 않는 것이 좋음
package javastudy.day02.operator;

public class AccuracyEx
{

	public static void main(String[] args)
	{
		// result를 아예 실수형으로 쓰지말고 result/10.0 이런식으로 사용
		int apple = 1;
		int totalPieces = apple * 10;
		int number = 7;
		
		// 10조각에서 남은 조각수 => 3
		// 사과 1개에서 남은 양 => 0.3
		
		int result = totalPieces - number;
		
		System.out.println(result); //3
		System.out.println(result/10.0); //0.3

	}

}

나눗셈 연산

  • 0으로 나누지 못함 컴파일 해주지 않음(컴파일 오류시 실행 자체가 되지 않음)
    • 컴파일 오류
      • 소스 코드를 컴파일하는 동안 발생하는 오류
      • 컴파일 오류가 있는 경우, 실행 자체가 이루어지지 않는다.
    • 실행 오류
      • 예외 상황이나 런타임 오류
      • 컴파일은 성공하고 프로그램이 실행되는 도중에 발생하는 오류
int x = 5; 
		 * int y = 0;
		 *  int result = 5/0; 
		 *  System.out.println(result); //에러
  • Infinity 나옴 : 무한대
int x = 5;
		double y = 0.0;
		double result = x/y; //나누기 Infinity(무한대) 결과
		System.out.println(result);
  • NaN(Not a Number) => 더 이상 나아갈 수 없음 절대 나오게 하면 안됨
    • 데이터가 엉망이 됨

      int x = 5;
      		double y = 0.0;
      		double result = x%y;  //NaN => 더 이상 나아갈 수 없음 절대 나오게 하면 안됨
      		System.out.println(result);

결론

  • 예외가 발생하지 않고 ArithmeticException이거나 NaN, Infinity가 나옴
  • Infinity 또는 NaN 상태에서 계속해서 연산을 수행하면 안 됨
  • Double.isInfinite()Double.isNaN()를 사용해 /와 % 연산의 결과가 Infinity 또는 NaN인지 먼저 확인하고 다음 연산을 수행하는 것이 좋음

예제

package javastudy.day02.operator;

public class ArithmeticNaN_Infinity_Ex
{
	public static void main(String[] args) {
		
		int x = 5; 
		double y = 0.0; 
		double result = x/y;
		
		/*
		 * 나눗셈을 할 때 꼭 Double.isInfinite()와 Double.isNaN()를 사용해 /와 % 연산의 결과가 Infinity 또는
		 * NaN인지 먼저확인하고 다음 연산을 수행하는 것이 좋음
		 */		if(Double.isInfinite(result||Double.isNaN(result))) {
			System.out.println("값 산술 불가");
		}
		else {
			System.out.println(result + 2);
		}
		
	}

논리 연산자

  • && : AND
  • || : OR
  • ^ : XOR
  • ~ : NO

예제

  • 알아 둘 것
    • next() : 문자열 추출
    • charAt(인덱스) : 인덱스 번째에 있는 문자형을 찾아냄
    • 0이면 false 나머지 숫자들은 true
      • a != 0(0이 아닌 건 참)
    • boolean c = (a != 0); //a의 논리값 실행

연산자 우선 순위 : 증산쉬 관비 논삼대

예제

package myPractice;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
       int x = 2;
       int y = 5;
       char c = 'A';
       
       System.out.println(1+x<<33); //6 +가 먼저고 시프트가 뒤
       System.out.println(y>=5 || x<0 && x>2); //true (true||false) =>  &&가 ||보다 우선 순위 높아서 먼저함 + 비교가 논리보다 우선순위 높음
       System.out.println(y +=10 - x++); //13 1. 증감(후치라 2를 반환후 10 - x 후 증가됨) 2. 산술 3. 대입이 맨 마지막 
       System.out.println(x+=2);//5 x= 3이니까 3+2 = 5
       System.out.println(!('A' <= c&& c<='Z')); //false !(true&&true) = false
       System.out.println('C'-c); //2 'C' = 67 c = 65 이항연산자는 숫자로 변환
       System.out.println('5'-'0'); //5 아스키 코드 5 : 53 - 0 : 48
       System.out.println(c+1);//66 65+1
       System.out.println(++c);//B 
       System.out.println(c++);//B 
       System.out.println(c);//C => C
       
    }
}

삼항연산자

  • 조건이 1개 일때
(a>b)?1:0
  • 조건이 2개 일 때
(num > 0) ? "양" : (num < 0) ? "음수" : "0";

논리 연산자

  • &&, ||, ^, !
  • 조건문, 반복문에서 주로 이용

비트 논리 연산자

  • bit 단위로 논리 연산을 수행, 0과 1이 피연산자
  • &, |, ^, ~
    • ^ : XOR - 서로 다른 비트일 때 1 같은 비트일 때 0
  • byte, short, int, long만 피연산자가 될 수 있고, 실수형이 float, double은 피연산자 불가
    • 실수는 지수부와 가수부를 나눠서 해서 더하기 때문
  • 10진수는 2진수로 바꾼 후 연산
    • 2진수 맨 앞은 부호 비트

비트 이동 연산자

  • 비트를 좌측 또는 우측으로 밀어서 이동하는 연산 수행
  • << : 왼쪽 시프트
  • >> : 오른쪽 시프트
  • 거듭 제곱 연산
    • EX. 1<<3 하면 1231*2^3
    • EX. 8<<3 하면 23232^3 * 2^3
    • 32비트를 넘어가지 않음 그래서 32비트 오른쪽 시프트 하면 자기 자신이 됨 8>>32 = 8

알아 둘 것

  • int보다 작은 값은 이항 계산 시 무조건 int로 바뀌기 때문에 byte에 넣기 위해서는 꼭 (byte)로 변환해줘야 함
  • 나눗셈은 f를 붙여줘야 실수로 연산 할 수 있음
    • 정수 계산이 되면 0이 나와 버리기 때문이다.

6월 14일에 한 것

정올


  • 정올 입력 문제 나머지 10문제 다 풀기
  • 정올 연산자 22문제 다 풀기
  • 정올은 프로젝트로 정리해서 github에 올릴 예정

모닝퀴즈

조건문과 반복문

코드 실행 흐름 제어

실행 흐름

  • main() 메소드의 시작 중괄호 끝에서 중괄호까지 위부터 아래로 실행하는 흐름

흐름 제어문

  • 개발자가 원하는 방향을 바꿀 수 있도록 해주는 것

루핑

  • 반복문 실행 완료된 경우 제어문 처음으로 다시되돌아가 반복 실행되는 것

조건문과 반복문

  • 조건문 : if문, switch문
  • 반복문 : for문, while 문, do- while 문

실행문을 반복하는 for 문

  • 초기화식에서 부동 소수점을 쓰는 float 타입 사용하지 말자

다중 for 문

  • 이게 제일 헤갈려…
for (초기식1; 조건식1; 증감식1) {
    for (초기식2; 조건식2; 증감식2) {
        // 내부 반복문의 실행 코드
    }
    // 외부 반복문의 실행 코드
}
  • 내부 반복문은 외부 반복문의 한 번의 반복마다 전체 반복
    • 외부 반복문의 첫 번째 반복에서 내부 반복문은 전체를 실행하고, 외부 반복문의 두 번째 반복에서도 내부 반복문은 다시 전체를 실행
    • 이런식으로 외부 반복문의 조건식이 false가 될 때까지 반복
  • 2차원 배열의 각 요소에 접근
    • 외부 반복문은 인덱스
    • 내부 반복문은 인덱스를 처리

6월 15일에 한 것

정올

  • 선택제어문 문제 다 풀기
  • 정올은 프로젝트로 정리해서 github에 올릴 예정

모닝퀴즈

6월 16일에 한것~ 주말과제

정올

  • 반복제어문 1, 2, 3 문제 다 풀기

모닝퀴즈

회고

어후.. 8시간 듣고 복습하는게 여간 힘든게 아니다.. 좀 더 이쁘게 잘 보이게 정리하고 싶은데 아직은 쉽지 않다 다중 for문이 너무 헤갈리고 소스트리로 예제들 github에 올릴려는데 충돌나고 조금 더 만져봐야 할 것 같다. 문제를 더 다양하게 풀어봐야 할 듯하다 조금씩 감이 오는 느낌..

profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글