[내배캠/10일차] TIL - 접근제어자 ~ 추상클래스, Lv.2 계산기 리팩토링

euphony·2025년 1월 7일
0

내일배움캠프

목록 보기
25/66

✅오늘의 한 일

  • 자바 문법 종합반 3주차 끝내기
  • Lv.2 계산기 리팩토링

💻오늘의 학습

자바 문법 종합반 3주차

접근 제어자

  • 접근제어자(access modifier) : 내부에 선언된 데이터를 보호하기 위해 외부에서 접근하지 못하도록 제한하는 역할을 한다. 클래스, 멤버 변수, 메서드, 생성자에 사용되며, default가 기본값이다.
    • public : 접근 제한이 없다.
    • protected : 같은 패키지 내에서 접근 제한이 없고, 다른 패키지라도 상속 관계라면 접근이 가능하다.
    • default : 같은 패키지 내에서만 접근이 가능하다.
    • private : 같은 클래스 내에서만 접근이 가능하다.

상속

  • 상속 : 부모 클래스의 필드와 메서드를 물려주는 것. extends 키워드를 사용한다.
    • 부모 클래스(슈퍼 클래스) : 상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스
    • 자식 클래스(서브 클래스) : 부모 클래스로부터 필드와 메서드를 상속받는 클래스
   public class 자식클래스 extends 부모클래스 {

   }

✔️ 자바에서는 클래스 간의 관게가 복잡해지는 문제 때문에 다중 상속을 허용하지 않는다.
✔️ final 클래스는 상속할 수 없다. final 메서드 역시 오버라이딩 할 수 없다.

  • 오버라이딩 : 부모 클래스로부터 상속받은 메서드의 내용을 재정의 하는 것.
    @Override 애노테이션을 사용한다.

super와 super()

  • super : 부모 클래스의 멤버를 참조할 수 있는 키워드
  • super() : 부모 클래스의 생성자를 호출할 수 있는 키워드, 부모 클래스의 생성자는 가장 첫 줄에서 호출되어야 한다.

추상 클래스

  • 추상 클래스 : 상속을 목적으로 사용되는 클래스로, 추상 메서드가 하나라도 있다면 추상 클래스로 선언한다. abstract 키워드로 추상 클래스를 선언한다.
  • 추상 메서드 : 구현되지 않은 메서드로, 자식 클래스가 반드시 오버라이딩해서 사용해야 한다.

Lv2. 계산기 리팩토링

이번주 계산기 과제의 일정은 이렇다..! 강의는 감기 이슈로 이제야 3주차까지 들었지만...금요일 전까지는 완강 하는 걸 목표로 잡았다. 또 아직까진 트러블 슈팅이라고 할만한 것이 없어서 Lv.3까지 도전해봐야 뭔가 나오지 않을까 싶다.

오늘은 어제 작성했던 코드에서 중복되는 부분이나 하나의 기능이라고 판단되는 부분을 메서드로 분리시켰다. 다음은 기존의 코드이다. main 메서드 하나에 너무 많은 코드가 들어가 있어 읽기도 힘들고 직관적이지 않다.

    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        while (true) {
            System.out.println("0. 계산하기  |  1. 모든 결과 보기  |  2. 오래된 결과 삭제  |  3. 결과 수정  |  4. 나가기(exit 입력)");
            String input = sc.nextLine();
            if (input.equals("1")) {
                System.out.println(calculator.getResult());
            } else if (input.equals("2")) {
                calculator.removeResult();
                System.out.println(calculator.getResult());
            } else if (input.equals("3")) {
                int index = sc.nextInt();
                int num = sc.nextInt();
                calculator.setResult(index, num);
                System.out.println(calculator.getResult());
            } else if (input.equals("exit")) {
                break;
            } else {
                System.out.print("첫 번째 숫자를 입력하세요: ");
                int num1 = sc.nextInt();
                sc.nextLine();
                System.out.print("두 번째 숫자를 입력하세요: ");
                int num2 = sc.nextInt();
                sc.nextLine();
                System.out.print("사칙연산 기호를 입력하세요: ");
                char operator = sc.nextLine().charAt(0);

                int result = calculator.calculate(num1, num2, operator);
                System.out.println("결과: " + result);
            }
        }
    }

다음은 리팩토링한 코드이다. 메서드를 각각 printMenu(), printAllResult(), calculate(), removeOldestResult() 로 나누었다. 또 if문에서 switch문으로 바꿔 가독성을 높였다. 사실 calculate(), removeOldestResult() 내에서도 안내 문구가 나오는 부분이 분리되는 것이 좋을 것 같다는 생각이 들었다.🤔 튜터님께 여쭤봤더니 이미 잘 읽히고, 잘 분리된 것 같다고 하셔서 일단 이대로 두기로 했다.

    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        while (true) {
            printMenu();
            String input = sc.nextLine();
            switch (input) {
                case "0":
                    calculate(calculator);
                    break;
                case "1":
                    printAllResult(calculator);
                    break;
                case "2":
                    calculator.removeResult();
                    printAllResult(calculator);
                    break;
                case "3":
                    removeOldestResult(calculator);
                    printAllResult(calculator);
                    break;
                case "exit":
                    System.out.println("프로그램을 종료합니다.");
                    return;
                default:
                    System.out.println("올바른 메뉴를 골라주세요.");
            }
        }
    }

    private static void printMenu() {
        System.out.println("0. 계산하기  |  1. 모든 결과 보기  |  2. 오래된 결과 삭제  |  3. 결과 수정  |  4. 나가기(exit 입력)");
    }

    private static void printAllResult(Calculator calculator) {
        System.out.println(calculator.getResult());
    }

    private static void calculate(Calculator calculator) {
        System.out.print("첫 번째 숫자를 입력하세요: ");
        int num1 = sc.nextInt();
        sc.nextLine();
        System.out.print("두 번째 숫자를 입력하세요: ");
        int num2 = sc.nextInt();
        sc.nextLine();
        System.out.print("사칙연산 기호를 입력하세요: ");
        char operator = sc.nextLine().charAt(0);

        int result = calculator.calculate(num1, num2, operator);
        System.out.println("계산 결과: " + result);
    }

    private static void removeOldestResult(Calculator calculator) {
        System.out.print("수정할 인덱스를 입력하세요: ");
        int index = sc.nextInt();
        sc.nextLine();
        System.out.print("수정 후 숫자를 입력하세요: ");
        int num = sc.nextInt();
        sc.nextLine();
        calculator.setResult(index, num);
    }

📝오늘의 회고

약 기운에 비몽사몽한 하루였다. 밥 → 약 → 졸림의 악순환...그래도 해야할 것들은 거의 끝내서 다행이긴 하지만 내일은 좀 더 정신차리고 공부하자!

📌내일의 할 일

  • 자바 문법 종합반 4주차
  • Lv.3 계산기 진행

0개의 댓글

관련 채용 정보