Java 입문 클래스 6회차 미션

    5회차 미션

    배운내용,깨달은 점

    예외 처리와 자바의 Call By Reference, Call By Value, 오버라이딩

    https://transfer-kk.tistory.com/66

     

    [Java] Java에서의 equals와 hashCode

    기본적으로 equals()함수는 boolean equals(Object obj)로 정의되며 2개의 객체가 동일한지 검사하기 위해 사용된다. 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다. publi

    transfer-kk.tistory.com

    https://transfer-kk.tistory.com/65

     

    [Java] Java의 Call by Value 와 Call by Reference

    Call by Reference는 함수의 인자를 전달할 때 주소를 전달하는 방식으로 Pass by Value, Pass by Reference라고도 한다. 대표적으로 C++이 사용한다. 반면 Java는 Call by Value를 사용하며, Call by Value는 함수의 인

    transfer-kk.tistory.com

    어려웠던 점, 반성하고 싶은 점/개선할 방법

    예외 처리에 있어서 try문에서 에러가 일어나면 그 즉시 catch문으로 옮겨진다는 사실을 간과하여 마지막 미션을 하는데 오래걸렸습니다. 좀 더 제대로 개념을 알고 나서 문제를 풀어볼 수 있도록 해야겠습니다.

    미션제출

    연습문제 1 Call by Reference, Call by Value

    // Money.java
    
    public class Money {
    
      private int value;
    
      public Money(int value) {
        this.value = value;
      }
    }
    
    // Main.java
    
    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는 참조타입으로 Heap Memory 영역에 생성된 객체의 주소값을 참조하기 때문에 '참조 타입'이라고 불립니다.

    따라서 첫 번째 케이스와 두번째 케이스는 money1과 money2가 서로 다른 주소값을 지니기 때문에 false가 나온 것입니다.

     

    ==은 주소 값 즉, 메모리 번지가 같은지 비교하는 연산

    equals는 객체의 값을 비교할 때 값 자체를 비교하는 함수 

    연습문제  2  equals(), hashCode()

    아래의 코드 출력값이 false, true가 나오도록 Money.java의 코드를 수정하기

    // Money.java
    
    package sixth.mission_2;
    
    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);
        }
    }
    
    //Main.java
    
    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));
      }
    }

    // @override란?

    => 오버라이드 메소드를 만들었는데 실수로 함수를 잘못쓰는 경우가 생겨 오버라이드를 못하는 경우를 막는 어노테이션으로 @override를 사용하고 함수가 오버라이드를 하지 못하도록 잘못 쓰면 에러를 발생시켜준다.

    연습문제 3  

    import static java.lang.Integer.parseInt;
    
    import java.util.Scanner;
    
    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 = 0;
                try {
                    number = parseInt(input);
                    System.out.println("입력하신 숫자는 " + number + "입니다.");
    
                } catch (NumberFormatException e) {
                    System.out.println("잘못된 값을 입력하셨습니다.");
                }
            }
        }
    }

    연습문제 4 

    // Main.java
    
    import java.util.Scanner;
    
    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() + "입니다.");
        }
    }
    
    // PhoneNumber.java
    
    import java.util.Scanner;
    
    public class PhoneNumber {
    
        private String value;
    
        protected PhoneNumber(String value) {
            try {
                this.validate(value);
                this.value = value;
            } catch (IllegalArgumentException e) {
                System.out.println(e.getMessage());
                this.inputPhoneNumberAgain();
            }
        }
    
        private void validate(String phoneNumber) {
            if (phoneNumber.length() != 11) {
                throw new IllegalArgumentException("휴대폰 번호는 11글자여야 합니다.");
            }
            if (!phoneNumber.substring(0, 3).equals("010")) {
                throw new IllegalArgumentException("휴대폰 번호는 010으로 시작해야 합니다.");
            }
        }
    
        private void inputPhoneNumberAgain() {
            Scanner scanner = new Scanner(System.in);
    
            System.out.println("휴대폰 번호를 입력해주세요. ");
            String inputValue = scanner.nextLine();
    
            try {
                this.validate(inputValue);
                this.value = inputValue;
            } catch (IllegalArgumentException e) {
                System.out.println(e.getMessage());
                this.inputPhoneNumberAgain();
            }
    
        }
    
    
        protected String getPhoneNumberFormally() {
            String phoneNumber = this.value;
            String phoneNumberFormally =
                phoneNumber.substring(0, 3) + '-' + phoneNumber.substring(3, 7) + '-'
                    + phoneNumber.substring(7, 11);
            return phoneNumberFormally;
        }
    }

    궁금한 점

    1.  오늘은 없습니다! 항상 좋은 피드백 감사드립니다!

    댓글