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

배운 내용, 깨달은 점
예외에 관해 배운 회차였다. try - catch 구문을 통해 예외를 처리하는 방법과 예외를 직접 발생할 수 있다는 것을 알게되었다. replaceAll 을 활용해 문자열을 원하는 형식으로 변환할 수 있다는 것도 알게 되었다.
어려웠던 점, 반성하고 싶은 점 / 개선할 방법
정규식을 반영하는 법이 조금 어려웠지만, 공부를 하다 보니 정규식을 사용하는 방법을 알게 될 수 있었던 미션이었다. 해당 미션을 정규식으로 해결하였지만, 다른 방법도 있을 지 궁금하다. 글자 수에 해당하는 부분은 size 와 같은 것을 통해 구현하는 방법도있을 것이지만, 010 으로 시작하는 부분을 받아오는 방법이 무엇이 있을지 궁금하다.
궁금한 점
위에 말했다 싶이 정규식이 아닌 다른 방법으로 구현하는 방법이 있다면 함께 공부해보고 싶습니다!
안녕하세요 민혁님! 미션 잘 구현해주셨네요~~ 제가 올려드린 코드 참고해보시면 정규식 이외의 방법으로 구현 해놨습니다! 코드 참고해보시고 추가로 학습해보시면 좋을 것 같네요:) 코드 비교해보시다가 궁금한 점 생기시면 언제든 질문 남겨주세요~!!