본문 바로가기

Java

JSCODE 6회차

 이번 회차에서는 예외 처리와 Call by Value, Call by Reference에 대해 공부했다.

예외 처리는 개발자가 예기치 못한 예외 발생을 미리 대처하여, 프로그램의 비정상 종료를 막고 정상 상태로 유지하는 것이 목표이며

기본적으로 try-catch 문법을 자주 사용한다. Call by Value, Call by Reference는 값을 참조하느냐, 주소를 참조하느냐의 차이다.

 

연습문제 1

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));
  }
}

위의 코드를 실행하면 둘 다 false가 출력된다. 그 이유는 무엇일까?

 "==" 연산자는 주소를 참조한다. money1과 money2는 같은 클래스의 인스턴스이고, 500이라는 같은 속성 값을 갖지만 메모리 상에서 다른 주소에 저장되기 때문에 false가 출력된다.

equals()를 오버라이딩하지 않으면 위와 같이 "==" 연산자를 통해 주소를 참조하여 값을 리턴하기 때문에 마찬가지로 false가 출력된다.

 

 

연습문제 2

연습문제 1의 코드를 실행했을 때 equals()가 true를 출력하도록 Money 클래스를 정의

 

코드

package jscode6;

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()의 파라미터로 받은 값이 자신이면 true를 반환하고, null이거나 같은 클래스가 아니라면 false를 반환한다. 또한, 같은 클래스의 인스턴스이고 속성 값이 같으면 true를 return하고 다르면 false를 리턴하도록 오버라이딩한다.

 equals()를 오버라이딩할 때에는 hashCode()도 같이 오버라이딩 해주어야한다. 그렇지 않으면 HashMap, HashSet과 같이 해시코드를 키로 갖는 자료형을 사용할 때 다른 값으로 처리하기 때문이다.

 

결과

 

6회차 미션

 

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

요구사항

- Exception이 발생해도 프로그램이 종료되지 않도록한다.

- try-catch를 활용한다.

 

코드

package jscode6;

public class PhoneNumber {
    private final String phoneNumber;

    public PhoneNumber(String phoneNumber) {
        validate(phoneNumber);
        this.phoneNumber = phoneNumber;
    }

    private void validate(String phoneNumber) {
        if (phoneNumber.length() != 11) {
            throw new IllegalArgumentException("휴대폰 번호는 11글자여야 합니다.");
        }

        if (!phoneNumber.startsWith("010")) {
            throw new IllegalArgumentException("휴대폰 번호는 010으로 시작해야 합니다.");
        }
    }

    public String getPhoneNumberFormally() {
        return this.phoneNumber.substring(0, 3)
            + "-"
            + this.phoneNumber.substring(3,7)
            + "-"
            + this.phoneNumber.substring(7);
    }
}
public class Main {

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

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

 validate() 에서 throws를 이용하여 11자가 아니거나 010으로 시작하지 않으면 IllegalArgumentException을 예외로 던져주었다. 이후 main()에서 try-catch를 통해 예외가 발생하면 메시지를 출력하고 정상 상태를 유지했다. 예외가 발생하지 않으면 번호를 출력하고 루프를 빠져나온다.

 

github: https://github.com/ParkYongSu/JSCODE

 

GitHub - ParkYongSu/JSCODE: jscode java study

jscode java study. Contribute to ParkYongSu/JSCODE development by creating an account on GitHub.

github.com

 

오늘 학습한 예외처리, Call by Value, Call by Reference는 실무에서도 많이 사용되는 개념이다. 실제로 모바일 앱 개발을 하면서 예외 처리를 제대로 하지 않아 이슈가 발생했던 적이 몇 번 있다. 그 만큼 중요한 개념이라 예제를 통해 복습할 수 있어서 좋았다.

그리고 Call by Value, Call by Reference를 공부하면서 equals()와 hashCode()를 오버라이딩하는 것이 생소했지만 확실히 잡고 가게 된 것 같다.

'Java' 카테고리의 다른 글

JSCODE 마지막 회차  (0) 2023.02.27
JSCODE 7회차  (1) 2023.02.24
JSCODE 5회차  (1) 2023.02.16
JSCODE 4회차  (2) 2023.02.13
JSCODE 3회차  (1) 2023.02.09