Today's 코드카타
class Solution {
public int solution(int angle) {
if (angle < 1 || angle > 180) {
throw new IllegalArgumentException("1부터 180 사이의 값만 입력 가능합니다.");
} // 때때마다 어떤 예외처리문을 사용하는지 알아야겠다.
if (0 < angle && angle < 90) { // 0 < angle < 90 이렇게 적었다가 아! 하고 한참 헤맸다.
return 1;
} else if (angle == 90) {
return 2;
} else if (90 < angle && angle < 180) {
return 3;
} else {
return 4;
}
}
}
return angle == 180 ? 4 : angle < 90 ? 1 : angle == 90 ? 2 : angle > 90 ? 3 : 0;
// 삼항연산자를 사용해서 한 줄로 만들어버린 분도 계셨다.
// 뒤에 return 0; 부분을 날려버리고 내 예외처리문과 같이 쓰면 간결해보일 것 같다.
class Solution {
public int solution(int n) {
if (1 > n || n > 1000) {
throw new IllegalArgumentException("1부터 1000까지의 숫자만 입력 가능합니다.");
}
int sum = 0;
for (int i = 0; i <= n; i++) {
if (i % 2 == 0) {
sum += i;
}
}
return sum;
}
}
// 최대한 ai 없이 풀어보려고 노력했더니 시간이 많이 소요됐다.
// main 메서드에 직접 활용해보는 것도 작성해봤는데, 결과값 출력문을 안 만들어놓고 뭐가 잘못 됐는지 한참 찾았다.
// 다른 사람 풀이를 통해 i+=2 2씩 더 해나가는 방법도 알게 되었다.
class Solution {
public double solution(int[] numbers) {
if (1 > numbers.length || 100 < numbers.length) {
throw new IllegalArgumentException("해당 배열의 길이 범위는 1~100 까지 입니다.");
}
double answer = 0;
int sum = 0;
for (int number : numbers) { // 일반 for문으로 성공한 뒤에 향상된 for문 사용해봤다.
if (0 > number || number > 1000) {
throw new IllegalArgumentException("입력 값의 범위는 0~1000 까지 입니다.");
}
sum += number;
}
return answer = (double) sum / numbers.length;
}
}
// 배열 안에 번호를 더하는게 아니라 그 번호 안에 든 값들을 더하려면 어떻게 해야할지 많이 고민했다.
계산기 만들기 ing...
// 첫 번째 숫자
int num1 = 0;
while (true) {
System.out.print("첫 번째 숫자를 입력하세요: ");
try {
num1 = scanner.nextInt();
if (num1 < 0) { // 음수인 경우
System.out.println("0를 포함한 양의 정수만 입력이 가능합니다.");
continue; // 다시 입력 받기
}
break; // 음수도 아니고 예외도 없다면 루프 탈출!
} catch (InputMismatchException e) { // 입력값이 숫자가 아닌 경우
System.out.println("숫자가 아닌 값을 입력하였습니다. 다시 입력해주세요!");
scanner.next(); // 남아 있는 잘못된 입력값을 버퍼에서 제거
}
}
public int isValid(Scanner scanner, String label) { // 입력값이 양의 정수인지 확인 후 값 반환
while (true) {
System.out.print(label + " 숫자를 입력하세요: ");
try {
int num = scanner.nextInt(); // 숫자 입력 받기
if (num < 0) { // 음수인 경우
System.out.println("0를 포함한 양의 정수만 입력이 가능합니다.");
continue; // 다시 입력 받기
}
return num; // 문제없을 시 값 반환!
// break; // 음수도 아니고 예외도 없다면 루프 탈출! → return이 있어서 필요 없어졌다.
} catch (InputMismatchException e) { // 입력값이 숫자가 아닌 경우
System.out.println("숫자가 아닌 값을 입력하였습니다. 다시 입력해주세요!");
scanner.next(); // 남아 있는 입력값 제거 ↑위 코드의 println의 ln이 엔터값을 넣어서 에러가 났다.
}
}
}
위 코드가 main 메서드 안에서 반복되어서 따로 빼서 메서드로 만들어보려했다. 처음엔 별 생각없이 메서드 앞에 void를 붙였는데, 값 반환이라는 개념이 얽히면서 혼란이 생겼다. void가 반환하는 값이 없을 때 쓴다는 걸 머리로는 알고 있었는데도, void를 적어놓고 왜 안 되는지 고민했었다. 그러다 알게 된 것이 메서드는 접근 제어자 + 반환 타입 + 메서드명 + 괄호(매개변수) + 중괄호라는 구조로 이루어지는데, 이걸 떠올려보며 “지금 내가 만드는 기능은 어떤 반환 타입을 가져야 하지?”라는 점에서 길이 보이기 시작했다. void 타입의 메서드에서는 당연하게도 return num;을 시도했을 때 컴파일 오류가 발생했고, 처음에는 그 당연한 걸 생각치 못하고 “그럼 그냥 return이나 void를 없애버리면 되나?”라고 생각했지만, 그 순간 또 다른 오류들이 또 발생했다. 이때 깨달은 점은 내가 만드려는 메서드의 기능이 입력을 받아서 검증 후 값을 반환하는 것이라면, 기능을 통해 반환하는 결과 타입(int)이 곧 메서드의 반환 타입이라는 것을 알게 되었다. 즉, num이 정수니까 isValid 메서드는 int를 반환해야 맞는 설계라는 걸 이해했다. 처음엔 "isValid라는 기능 자체가 정수형은 아니잖아?" 하는 생각도 들었지만, 곰곰이 따져보니 메서드 이름은 동작을 나타내는 표현이고, 반환 타입은 그 동작의 결과물의 타입이기 때문에 두 개념은 엄연히 구분된다는 걸 이해하게 됐다.