Java 로그인 예외 처리 및 트러블슈팅

습토리·2025년 2월 27일
0

Java

목록 보기
29/32

1. 과제 요구사항

사용자로부터 아이디와 비밀번호를 입력받아 로그인하는 프로그램을 작성해야 한다.

로그인 검증 조건

  1. 사용자로부터 아이디와 비밀번호를 입력받는다.
  2. 아이디가 "admin", 비밀번호가 "1234"가 아니면 예외를 발생시킨다.
  3. 로그인 실패 시 "로그인 실패! 아이디 또는 비밀번호가 잘못되었습니다." 출력 후 다시 입력받는다.

2. 트러블슈팅

2.1 메서드를 main 메서드 안에 선언한 오류

처음에는 login 메서드를 main 메서드 내부에 선언하여 컴파일 오류가 발생했다.

public static void main(String[] args) {
    public static void login(String id, int password) throws Exception { // ❌ 오류 발생
        if (!id.equals("admin") || password != 1234) {
            throw new Exception("Log in failed! Your id or password is not correct!");
        }
    }
}

원인:

  • 자바에서는 메서드 내부에 다른 메서드를 선언할 수 없다.
  • 모든 메서드는 클래스 내부에만 선언 가능하며, 다른 메서드 내부에는 선언할 수 없다. 자세한 이유는 이전 글을 참고하자.

해결 방법:

  • login 메서드를 main 메서드 밖으로 이동.

메서드 위치가 실행에 영향을 미칠까?

나는 자바스크립트를 배운 기억이 있어서, 처음에는 main 안에 login 메서드가 호출되니까, login을 맨 위로 올려야하나 생각했다. 하지만 아니다. 자바에서는 main 메서드가 항상 먼저 실행되므로, 코드 상의 위치는 실행 순서에 영향을 미치지 않는다.

하지만 일반적으로 클래스는 "변수 → 생성자 → 메서드" 순서로 구성하는 것이 관례이다.


2.2 int 타입 비밀번호를 .equals()로 비교한 오류

비밀번호 비교를 .equals()로 했을 때 오류가 발생했다.

if (!id.equals("admin") || password.equals(1234)) { // ❌ 오류 발생

원인:

  • .equals()String과 같은 참조형(객체) 비교에 사용해야 한다.
  • int 같은 기본 자료형(primitive type)은 == 또는 != 연산자로 비교해야 한다.

해결 방법:

  • != 연산자로 변경
if (!id.equals("admin") || password != 1234) {  // ✅ 정수 비교는 != 사용

3. 최종 코드

package chapter3.exception.practice; 

import java.util.Scanner;

public class Main { // 클래스

    public static void main(String[] args) { // 메인 메서드
        Scanner scanner = new Scanner(System.in);

        while (true) {
            try {
                System.out.print("Type your id: ");
                String id = scanner.nextLine();
                System.out.print("Type your password: ");
                int password = scanner.nextInt();

                login(id, password); // static 메서드라 new를 안 써도 된다.
                System.out.println("Log in success!");
                break;

            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }

    // 로그인 검증 메서드
    public static void login(String id, int password) throws Exception {
        if (!id.equals("admin") || password != 1234) {
            throw new Exception("Log in failed! Your id or password is not correct!");
        }
    }
}

4. 배운 점

  1. 자바에서는 메서드 내부에 또 다른 메서드를 선언할 수 없다.
  2. 메서드의 위치는 실행에 영향을 미치지 않지만, 클래스는 "변수 → 생성자 → 메서드" 순으로 작성하는 것이 일반적이다.
  3. static 메서드는 new 없이 바로 호출할 수 있다.
  4. 문자열 비교.equals()를 사용하지만, 정수 비교== 또는 !=을 사용해야 한다.
profile
재미난 삶을 살다

0개의 댓글