그 사이에 조건문, 반목문을 배웠다.
어느 언어를 가더라도 if나 for, while은 다 비슷비슷하니까 굳이 블로그로 정리할 필요성은 못느꼈음.
반성 포인트가 있다면, 페어랑 같이 천천히 진행해야 하는데, 해당 시간내로 다 제출해야 하는줄 알고 후다다다닥
거의 혼자 해버림. 페어분은 엄청 피곤하셨을듯... 후... 반성합니다.
Java 배열은 정적 배열이다.
길이가 없이 붙이고 띨 수 있는데 자바스크립트와 달리, 한번 길이를 정하면 바꿀 수 없다.
미리 정하거나, 나중에 정하거나 뭐 이런 식으로 해야함.
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]을 생성하던 것에 비해 자바는 좀 더 엄밀하다.
배열을 복사한다. 인자는 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개라 다소 헷갈릴 수 있지만, 직접 해보면 쉽게 이해가 갈거임.
배열을 범위만큼 복사해서 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는 인덱스를 정해준다는 거다.
첫번째, 연산자, 두번째 입력값을 받아 연산 후 콘솔에 보여주는 프로그램을 짜야함.
입력값은 Scanner로 받아오고 콘솔에서 입력하는 거로 하자.
연산자는 + = - / 4개만 가능하다.
대충 논리를 생각해보면
이 정도가 되겠다.
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로 종료함.