CODING/스파르타 내일배움캠프 TIL

15_코트카타_Java 문법 종합반_25.1.2(목)

codingTrip 2025. 1. 2. 21:12

코트카타

17) 자연수 뒤집어 배열로 만들기

import java.util.*;
    
class Solution {
    public int[] solution(long n) {
        int n2 = (int)Math.log10(n)+1;
        // String n2 = ""+n;
        // int[] answer = new int[n2.length()];
        int[] answer = new int[n2];
        int i = 0;

        while(n>0){
            answer[i] = (int)(n%10);
            n/=10;
            i++;
        }
        return answer;
    }
}

사실 다른 분의 풀이를 먼저 보았다.

처음부터 본 것은 아니다.

테스트 코드 실행까지는 값이 잘 나오는 것까지 확인했는데

여러 번 테스트 도중에 자꾸 실패가 났다.

 

1) 자릿수를 구하는 방법에 문제가 있나? -> 그렇지는 않았다.

2) answer[i] = (int)(n%10); 

강제 형변환을 할 때 n만 하지 말고 괄호로 전체적으로 감싸주자


개인 과제 진행

Lv1

첫 번째 오류

Process 'command '/Library/Java/JavaVirtualMachines/jdk-11.0.10.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

Intellij, Gradle 환경에서 Java 코드 작성 후 실행 시 이런 에러가 나왔다.

  1. [ Intellij IDEA> Settings] 클릭 (맥 단축키 : Command + ,)
  2. [Build, Excution, Deployment > Build Tools > Gradle] 클릭
  3. Build and run using과 Run tests using을 Gradle(Default)->Intellij IDEA로 바꿔준다.

출처 : https://velog.io/@developerjun0615/Spring-Intellij-%EC%8B%A4%ED%96%89%EC%8B%9C-finished-with-non-zero-exit-value-1-%EC%98%A4%EB%A5%98

 

두 번째 오류

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0

인덱스 값으로 마이너스 값을 대입하거나, 문자열 길이보다 큰 인덱스 값을 대입하면 발생한다고 한다.

출처 : https://livebyfaith117.tistory.com/120

=> 하지만, 나로서는 이 설명만 보고서는 바로 이해가 가지 않았다. 

=> nextLine()으로 받았을 때 문제가 발생한 것 같다고 짐작할 뿐이다.

next()로 받았을 때는 오류가 발생하지 않았기 때문이다.

 

왜일까?

char operator = sc.next().charAt(0);
char operator = sc.nextLine().charAt(0);

* next() : 개행문자(\n)를 무시하고 입력 받음

                  즉, 숫자를 입력하고 엔터를 누를경우, 엔터 이전까지만 입력을 받음

* nextLine() : 한 줄 단위로 입력 받기 때문에, 개행문자(\n)도 한 줄로 인식함

                          char 타입의 경우 'A'과 같이 한 글자만 들어가야 하므로 오류 발생

출처 : https://limkydev.tistory.com/170

 

발제 후 점심 시간(12시) 전까지 작성한 코드

package com.example.calculator;

import java.util.Scanner;

public class Calculator {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num1;
        int num2;
        char calculator;
        int result = 0;
        String exit;

        while(true){
            System.out.print("첫 번째 숫자를 입력하세요: ");
            // Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
            num1 = sc.nextInt();
            System.out.print("두 번째 숫자를 입력하세요: ");
            // Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
            num2 = sc.nextInt();

            if(num1>=0 && num2>=0){
                System.out.print("사칙연산 기호를 입력하세요: ");
                // 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장합니다.
                calculator= sc.next().charAt(0);

                switch(calculator){
                    case '+':
                        result = num1 + num2;
                        break;
                    case '-':
                        result = num1 - num2;
                        break;
                    case '*':
                        result = num1 * num2;
                        break;
                    case '/':
                        if (num2 == 0) {
                            System.out.println("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다.");
                            break;
                        }
                        result = num1 / num2;
                        break;
                    default:
                        System.out.println("잘못된 연산자입니다. 다시 입력해주세요.");
                        break;
                }
                /* 제어문을 활용하여 위 요구사항을 만족할 수 있게 구현합니다.*/
                System.out.println("결과: " + result);

                System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
                /* exit을 입력 받으면 반복 종료 */
                exit = sc.next();
                if(exit.equals("exit")){
                    break;
                }
            }
        }


    }
}

 

레벨 1은 일단 여기서 마무리하고, 레벨 2를 3주차 강의 복습과 함께 진행하고자 한다.

 

=> 팀 내에서 회고를 진행했는데

nextInt()를 사용하면 문자 입력 시 에러가 발생한다고 말씀해주셨다.

예외처리(try catch) 4주차 강의 참고해서 작성해야겠다.

 

또한 나누기를 실행할 때, if else문보다는 예외로직을 나열하고, 정상로직을 먼저 써주면 좋을 것 같다고도 하셨다.

 

그리고 깃 사용을 연습해보라고도 하셨다.


Java 프로그래밍 기초 세션

클래스

= 틀, 설명서

 

생성자 

* 1. 객체를 만들 때 어떻게 만들지 강제하는 놈

   2. 클래스와 이름이 같다.

   3. 반환 자료형이 없다(return type)

//클래스 = 틀, 설명서
Class User {
	String email;
    String password;
    
    //생성자 : 회원가입 로직 만들 때, 아이디와 비밀번호는 필수로 넣어줘야 하니까 생성자로 만들기
    User(String email, String password){
    	this.email=email;
        this.password=password;
    }
}

public class Main {
     /* 중략 */
	 User user = new User("000@naver.com","1234");
}

이것으로 User 100.....개도 만들 수 있음

 


Java 문법 종합반

3주차

 

필드(속성) / 메서드(행위)

 

메서드 : 이 변수를 넣은 것을 제어할 수 있게 하는 것

생성자 - 이 변수를 넣은 이 필드들을 처음에 어떻게 정의할 것인가를 만드는 것

           - 처음 객체가 생성될 때 (instance화) 어떤 로직을 수행해야 하며, 어떤 값이 필수로 들어와야 하는지 정의!

 

메서드 오버로딩

: 메서드의 이름이 같고, 매개변수의 개수, 타입, 순서가 달라야 한다

오버로딩은 println()을 생각하면 편하다

 

기본형 매개변수 : 읽기만

참조형 매개변수 : 읽기+변경

 

클래스 멤버는 보통 고유값을 사용함

상수 static final 보통 대문자 사용