코드스테이츠 - 배열, 배열 복사, 계산기

kwak woojong·2022년 5월 9일
0

코드스테이츠

목록 보기
10/36
post-thumbnail

그 사이에 조건문, 반목문을 배웠다.

어느 언어를 가더라도 if나 for, while은 다 비슷비슷하니까 굳이 블로그로 정리할 필요성은 못느꼈음.

반성 포인트가 있다면, 페어랑 같이 천천히 진행해야 하는데, 해당 시간내로 다 제출해야 하는줄 알고 후다다다닥

거의 혼자 해버림. 페어분은 엄청 피곤하셨을듯... 후... 반성합니다.


Java 배열은 정적 배열이다.

길이가 없이 붙이고 띨 수 있는데 자바스크립트와 달리, 한번 길이를 정하면 바꿀 수 없다.

미리 정하거나, 나중에 정하거나 뭐 이런 식으로 해야함.

1. 배열

1. 배열 선언법


int[] arr1 = new int[10];
// 길이 (arr.length)가 10인 배열이 만들어졌다.
// 이렇게 만들면 배열의 요소는 0이 차 있는 상태임.

int[] arr2 = {1, 2, 3};
// 길이 3 arr[0] = 1, arr[1] = 2, arr[2] = 3인 상태

int[][] arr3 = new int[5][5];
//  5 * 5의 2차원 배열이 만들어진 상태
// {{0, 0, 0, 0, 0}
//  {0, 0, 0, 0, 0}
//	{0, 0, 0, 0, 0}
//	{0, 0, 0, 0, 0}
//	{0, 0, 0, 0, 0}} 이런 상태다.

int[][] arr4 = new int[5][];
// 5칸을 만든 상태인데, 각 요소안 배열의 길이는 정하지 않은 상태다.
arr4[0] = new int[5];
arr4[1] = new int[4];
arr4[2] = new int[3];
arr4[3] = new int[2];
arr4[4] = new int[1];
// {{0, 0, 0, 0, 0}
//	{0, 0, 0, 0}
//	{0, 0, 0}
//	{0, 0}
//	{0}
// 이런 상태임, 나름 가변 배열이라고 할 수 도 있겠다.

만약 배열의 길이를 선언해 놓고 index를 넘는 배열을 초기화하면 에러를 뱉는다.

int[] arr = new int[3];  // arr[0], [1], [2] 까지 존재함.
arr[3] = 3; // 에러 뱉음

자바스크립트는 쌩까고 arr[3]을 생성하던 것에 비해 자바는 좀 더 엄밀하다.


2. 배열 관련 메서드

1. System.arraycopy();

배열을 복사한다. 인자는 5개

원래배열, 어디서부터 복사할까?, 복사된 배열을 어디에 넣을까?, 어디서부터 넣을까? , 얼만큼 뜯어올건데?

     int[] arr = {0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8};
     int[] arr2 = new int[arr.length-1];

     System.arraycopy(arr, 0, arr2, 0,arr.length-1);

     System.out.println("arr2 = " + Arrays.toString(arr2));
        //arr2 = [0, 1, 0, 1, 2, 3, 4, 5, 6, 7] 출력

System.arraycopy는 void다. return 없이 원래 있던 배열을 조져준다.

인자가 5개라 다소 헷갈릴 수 있지만, 직접 해보면 쉽게 이해가 갈거임.

2. Arrays.copyOfRange();

배열을 범위만큼 복사해서 return한다.
윗 놈이랑 비슷해보이지만, 얘는 원래 있던 배열을 건드리지 않는다.
return만 하니까 받을 배열을 따로 선언해줘야함.
따지면 윗놈보다 좀 더 직관적일 수 있다.

        int[] arrOri = {0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8};

        int[] arr1 = Arrays.copyOf(arrOri, 3); // 원래배열, 길이
        int[] arr2 = Arrays.copyOfRange(arrOri, 3, 6); // 원래배열, 시작 인덱스, 끝 인덱스

        System.out.println("arr1 = " + Arrays.toString(arr1)); // arr1 = [0, 1, 0]
        System.out.println("arr2 = " + Arrays.toString(arr2)); // arr2 = [1, 2, 3]

그냥 copyOf를 쓰면 시작부터 거기까지 해주고
Range를 쓰면 복사 시작할 index를 정할 수 있다.

조심해야 할 부분은 copyOf는 배열의 길이를 정해주는 거고 (index 아님)

copyOfRange는 인덱스를 정해준다는 거다.


2. 계산기 만들기

첫번째, 연산자, 두번째 입력값을 받아 연산 후 콘솔에 보여주는 프로그램을 짜야함.

입력값은 Scanner로 받아오고 콘솔에서 입력하는 거로 하자.

연산자는 + = - / 4개만 가능하다.

대충 논리를 생각해보면

  1. 첫번째 수, 연산자, 두번째 수 를 받아온다.
  2. 연산자에 따라 계산을 해주고
  3. 값을 콘솔에 찍어준다.

이 정도가 되겠다.

    Scanner input = new Scanner(System.in);

    System.out.println("첫번째 숫자를 입력해주세요.");
    double firstNum = input.nextDouble();
    double result = 0;

    boolean isGoing = true;
    char goingInput = 'y';

    while(isGoing) {
      System.out.println("연산자를 입력해주세요. <+, -, *, />");
      char operation = input.next().charAt(0);
      if(!(operation == '+' || operation == '-' || operation == '*' || operation == '/')){
        System.out.println("연산자 오류입니다. 계산기를 다시 실행해주세요.");
        break;
      }

      System.out.println("두번째 숫자를 입력해주세요.");
      double secondNum = input.nextDouble();

      System.out.println("계산을 시작합니다.");
      if (operation == '+') {
        result = firstNum + secondNum;
      } else if (operation == '-') {
        result = firstNum - secondNum;
      } else if (operation == '*') {
        result = firstNum * secondNum;
      } else if (operation == '/') {
        result = firstNum / secondNum;
      } else {
        System.out.println("연산자 오류입니다.");
      }

      System.out.println("계산결과 = " + result);

      System.out.println("계산결과에 계속 계산을 더 하시겠습니까? Y/N");
      goingInput = input.next().charAt(0);
      if(goingInput == 'y' || goingInput == 'Y'){
        isGoing = true;
        firstNum = result;
      } else if( goingInput == 'n' || goingInput == 'N'){
        isGoing = false;
        System.out.println("계산을 종료합니다.");
      } else {
        System.out.println("잘못된 값을 입력하여 종료합니다.");
        break;
      }
    }

첫번째 입력값 = firstNum
연산자 = operation
두번째 입력값 = secondNum

계속 계산할래? = isGoing (boolean)
goingInput = isGoing을 바꿔주기 위해 인풋 받아올 char값

isGoing이 true이므로

while문을 시작하는데
일부로 연산자를 이때 받아온다. 계산이 끝난 후에 firstNum에 result를 넣어주고 바로 계산을 시작하기 위해서임
그리고 연산자가 잘 왔나 확인 if문 해주고 아니면 break

두번째 숫자를 입력받는다.

그리고 바로 계산을 시작하고 그에 따라 값을 result에 넣어준다.

System.out.println("계산결과 = " + result)로 결과를 콘솔에 찍어주면 일단 첫 계산은 끝!

여기서 더 할지 안할지 물어보는 Y/N을 입력받는데 이걸 goingInput에 넣어준다.

goingInput이 y면 isGoing = true, 다시 while이 작동하고,
goingInput이 n이면 isGoing = false로 while문이 종료된다.
만약 y나 n이 아닌 값이면, 바로 break로 종료함.

profile
https://crazyleader.notion.site/Crazykwak-36c7ffc9d32e4e83b325da26ed8d1728?pvs=4<-- 포트폴리오

0개의 댓글