[JAVA 백엔드 스터디] 6회차

minhyeok·2023년 2월 21일
0
post-thumbnail

학습내용

  • 예외(Exception)
  • throw
  • try-catch

예제 풀이

Ex1) Call by Reference, Call by Value

public class Money {

  private int value;

  public Money(int value) {
    this.value = value;
  }
}
public class Main {

  public static void main(String[] args) {
    Money money1 = new Money(500);
    Money money2 = new Money(500);
    System.out.println(money1 == money2);
    System.out.println(money1.equals(money2));
  }
}

위의 코드에서 출력값 중 true가 하나는 나올법한데 전부 false가 나온다. 왜 그런걸까? 이유를 정리해보자.

money1 과 money2 의 객체는 다르다. 서로 다른 두 객체가 생성된 것이다.
따라서 money1 == money2 코드에서는 주소값을 비교하게 되는데, 두 객체의 주소값이 다르기 때문에 false 가 나온다.
또한 money1.equals(money2) 코드에서는 2개의 객체가 동일한지 비교하는데, 두 객체는 다른 것이므로 false가 나온다.

Ex2) equals(), hashCode()

위의 Ex1 코드에서 출력값이 아래와 같이 나오게 Money.java의 코드를 수정해보자.

import java.util.Objects;

public class Money {

    private int value;

    public Money(int value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Money money = (Money) o;
        return value == money.value;
    }

    @Override
    public int hashCode() {
        return Objects.hash(value);
    }
}

equals 의 메서드를 재정의 해주어야 한다. 즉, 오버라이딩 하여 동일성을 비교하도록 코드를 수정해준다.
또한, equals() 메소드를 오버라이딩 한다면, hashCode() 메소드도 함께 오버라이딩 되어야 한다.
인텔리제이 IDE 에서 자동으로 두 메서드를 오버라이딩 할 수 있다.

6회차 미션

문자 말고 숫자만 입력하라구!

public class Main {

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

		boolean isContinued = true;
		while (isContinued) {
	    System.out.println("숫자를 입력해주세요.");
	    String input = scanner.nextLine();
			int number = parseInt(input);
			System.out.println("입력하신 숫자는 " + number + "입니다.");
		}
  }
}

위 코드를 수정해서 아래와 같이 작동되도록 만들어라.

숫자를 입력해주세요.
123
입력하신 숫자는 123입니다.
숫자를 입력해주세요.
abcd
잘못된 값을 입력하셨습니다.
숫자를 입력해주세요.
1234
입력하신 숫자는 1234입니다.
숫자를 입력해주세요.
  • try-catch를 활용해라.
  • 잘못된 값(숫자가 아닌 값)을 입력했을 때, Exception이 발생하면서 프로그램이 종료되면 안 된다.
  • 풀이 과정
    잘못된 값을 입력 하였을 때, NumberFormatException 이 발생한다. 따라서 try-catch 구문을 통해, 해당 예외가 발생하였을 때를 catch 에서 처리해주었다.

코드
깃허브 미션1 링크

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        boolean isContinued = true;
        while (isContinued) {
            System.out.println("숫자를 입력해주세요.");
            String input = scanner.nextLine();
            try {
                int number = parseInt(input);
                System.out.println("입력하신 숫자는 " + number + "입니다.");
            } catch (NumberFormatException e) {
                System.out.println("잘못된 값을 입력하셨습니다.");
            }

        }
    }
}

휴대폰 번호 입력받기

[요구사항 1]

public class Main {

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.println("휴대폰 번호를 입력해주세요. ");
    String input = scanner.nextLine();
    PhoneNumber phoneNumber = new PhoneNumber(input);
    System.out.println("휴대폰 번호를 정상적으로 입력하셨습니다. 입력하신 휴대폰 번호는 " + phoneNumber.getPhoneNumberFormally() + "입니다.");
  }
}

위 코드를 실행했을 때 아래와 같이 작동해야 한다.

휴대폰 번호를 입력해주세요.
12312341234

Exception in thread "main" java.lang.IllegalArgumentException: 휴대폰 번호는 010으로 시작해야 합니다.
	**...**
휴대폰 번호를 입력해주세요.
0101234

Exception in thread "main" java.lang.IllegalArgumentException: 휴대폰 번호는 11글자여야 합니다.
	...
휴대폰 번호를 입력해주세요.
01012345678
휴대폰 번호를 정상적으로 입력하셨습니다. 입력하신 휴대폰 번호는 010-1234-5678입니다.
  • 휴대폰 번호(PhoneNumber) 클래스 만들기
  • 입력값이 010으로 시작하지 않으면 “휴대폰 번호는 010으로 시작해야 합니다.”라고 에러 메시지를 뱉어내라. (에러가 발생하고 프로그램이 종료될 것이다.)
    • IllegalArgumentException() 활용하기
    • 에러가 발생했을 때 프로그램이 종료돼야 한다.
  • 입력값의 길이가 11이 아닐 경우 “휴대폰 번호는 11글자여야 합니다.”라고 에러 메시지를 뱉어내라. (에러가 발생하고 프로그램이 종료될 것이다.)
    • IllegalArgumentException() 활용하기
    • 에러가 발생했을 때 프로그램이 종료돼야 한다.
  • 접근제어자를 신경써서 구현해라.

[요구사항 2]

휴대폰 번호를 입력해주세요.
12312341234
휴대폰 번호는 010으로 시작해야 합니다.
휴대폰 번호를 입력해주세요.
0101234
휴대폰 번호는 11글자여야 합니다.
휴대폰 번호를 입력해주세요.
01012345678
휴대폰 번호를 정상적으로 입력하셨습니다. 입력하신 휴대폰 번호는 010-1234-5678입니다.

요구사항 1에서는 휴대폰 번호를 잘못 입력하면 Exception이 발생해서 프로그램이 종료됐다. 하지만 이번에는 Exception이 발생하더라도 프로그램이 종료되지 않아야 한다.

  • 위와 같이 프로그램이 작동되게 코드를 수정해보자.
  • try-catch를 활용하자.
  • 조건 확인
    010 으로 시작하는지 확인
    11글자 인지 확인
    입력한 숫자를 받아와 휴대폰 번호 포맷 출력
    예외 처리를 하였을 때 각각의 메세지 출력
  • 풀이 과정
    먼저 관건은 숫자를 입력 받았을 때에, 010 으로 시작하는지 확인하는 과정과 11글자 인지 확인하는 과정이 필요하다. 따라서 이 부분을 어떻게 구현할지 고민을 하였고, 정규식을 이용하는 쪽으로 생각을 하였다.
    따라서 두 개의 정규식을 위한 String 변수를 선언하여 각각의 조건에 맞게 정규식을 구성하였다. 그리하여 if 구문을 통해 해당하는 조건에 만족하지 못하면 throw 를 던져 예외를 발생시켰다.
    또한, 입력한 숫자를 휴대폰 번호 포맷으로 출력은, replaceAll 문자열 치환 함수를 활용하여 구현하였다.
    이렇게 요구사항 1번까지 만족하였고, 요구사항 2 를 만족하기 위해 Main.java 코드를 수정하였다.
    try-catch 구문을 통해 휴대폰 번호를 정상적으로 입력할 경우 종료하게 하고, try 구문에서 예외가 발생할 경우 해당 예외를 catch 하여 각각의 상황에 맞게 에러 메세지를 출력하도록 하였다.
    그 방법은 getMessage() 를 활용하였다. 해당 함수는 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.

코드
깃허브 미션2 링크

6회차 심화 미션

동일성(identity)와 동등성(equality)

Wrapper class가 무엇이고 , 언제 사용하는 가?

정리

  • 배운 내용, 깨달은 점
    예외에 관해 배운 회차였다. try - catch 구문을 통해 예외를 처리하는 방법과 예외를 직접 발생할 수 있다는 것을 알게되었다. replaceAll 을 활용해 문자열을 원하는 형식으로 변환할 수 있다는 것도 알게 되었다.

  • 어려웠던 점, 반성하고 싶은 점 / 개선할 방법
    정규식을 반영하는 법이 조금 어려웠지만, 공부를 하다 보니 정규식을 사용하는 방법을 알게 될 수 있었던 미션이었다. 해당 미션을 정규식으로 해결하였지만, 다른 방법도 있을 지 궁금하다. 글자 수에 해당하는 부분은 size 와 같은 것을 통해 구현하는 방법도있을 것이지만, 010 으로 시작하는 부분을 받아오는 방법이 무엇이 있을지 궁금하다.

  • 궁금한 점
    위에 말했다 싶이 정규식이 아닌 다른 방법으로 구현하는 방법이 있다면 함께 공부해보고 싶습니다!

1개의 댓글

comment-user-thumbnail
2023년 2월 23일

안녕하세요 민혁님! 미션 잘 구현해주셨네요~~ 제가 올려드린 코드 참고해보시면 정규식 이외의 방법으로 구현 해놨습니다! 코드 참고해보시고 추가로 학습해보시면 좋을 것 같네요:) 코드 비교해보시다가 궁금한 점 생기시면 언제든 질문 남겨주세요~!!

답글 달기