11일차 - Java강의(계산기 실습, 클래스화, 추상화)

2024. 7. 29. 23:15·Java & Spring/Java

◇ 코드 구현


- Step 1 : 기본적인 사칙연산 계산기

import java.util.Scanner;

public class Calculate {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String op = sc.next();
        int a = sc.nextInt();
        int b = sc.nextInt();

        System.out.println(calculate(op, a, b));
    }


    public static double calculate(String operator, int firstNumber, int secondNumber) {
        double f = (double) firstNumber;
        double s = (double) secondNumber;
        double result = 0;
        switch (operator) {
            case "+":
                result = f + s;
                break;
            case "-":
                result = f - s;
                break;
            case "*":
                result = f * s;
                break;
            case "/":
                if (s != 0) {
                    result = f / s;
                } else {
                    System.out.println("0으로 나눌 수 없습니다.");
                }
                break;
            default:
                System.out.println("사칙연산 기호 (+, -, *, /) 중에 입력해주세요.");
        }
        return result;
    }
}

 

- Step 2 : 나머지 연산 추가

 case "%":
                if (s != 0) {
                    result = f % s;
                } else {
                    System.out.println("0으로 나눌 수 없습니다.");
                }
                break;

 

- Step 3 : 클래스화

public class Main {
    public static void main(String[] args) {
        Calculator calculator  = new Calculator(new AddOperation(), new SubstractOperation(),
                new MultiplyOperation(), new DivideOperation());
        System.out.println(calculator.calculate("+", 10, 20));
    }
}
public class Calculator {

    private final AddOperation addOperation;
    private final SubstractOperation substractOperation;
    private final MultiplyOperation multiplyOperation;
    private final DivideOperation divideOperation;

    public Calculator(AddOperation addOperation, SubstractOperation substractOperation, 
                      MultiplyOperation multiplyOperation, DivideOperation divideOperation) {
        this.addOperation = addOperation;
        this.substractOperation = substractOperation;
        this.multiplyOperation = multiplyOperation;
        this.divideOperation = divideOperation;
    }

    public double calculate(String operator, int firstNumber, int secondNumber) {
        double answer = 0;

        if(operator.equals("+")){
            answer = addOperation.operate(firstNumber, secondNumber);
        }else if(operator.equals("-")){
            answer = substractOperation.operate(firstNumber, secondNumber);
        }else if(operator.equals("*")){
            answer = multiplyOperation.operate(firstNumber, secondNumber);
        }else if(operator.equals("/")) {
            answer = divideOperation.operate(firstNumber, secondNumber);
        }
        return answer;
    }

}
public class AddOperation {
    public double operate(int firstNumber, int secondNumber){
        return firstNumber + secondNumber;
    }
}


- Step 4 : 추상화

public class Main {
    public static void main(String[] args) {
        Calculator calculator  = new Calculator(new AddOperation());
        System.out.println(calculator.calculate(10, 20));
        calculator.setOperation(new MultiplyOperation());
        System.out.println(calculator.calculate(10,20));
    }
}
public class Calculator {

    private AbstractOperation operation;

    public Calculator(AbstractOperation operation) {
        this.operation = operation;
    }

    public void setOperation(AbstractOperation operation) {
        this.operation = operation;
    }

    public double calculate(int firstNumber, int secondNumber) {
        double answer = 0;
        answer = operation.operate(firstNumber, secondNumber);
        return answer;
    }

}
public class AddOperation extends AbstractOperation{
    @Override
    public double operate(int firstNumber, int secondNumber){
        return firstNumber + secondNumber;
    }
}

◇ 회고

  1. 클래스화 부분
    • Calculator클래스부분이 전체적으로 이해가 안됨
    • 아래 코드에서
      1. private final AddOperation addOperation을 쪼개서 해석
          private : 접근제어자로 변수들이 Calculator클래스 내부에서만 접근 가능
          final : 한번 할당되면 변경 불가능, 생성자에서 변수들이 초기화되면 더이상 변경안됨
          AddOperation : 변수타입
          addOperation : 변수명

      2. public Calculator(AddOperation addOperation, ...)을 쪼개서 해석
          public : 접근제어자로 어디서든 접근 가능
          Calculator : 클래스명(생성자명), 생성자는 Calculator객체를 초기화
          (AddOperation addOperation, ...) : 생성자가 받는 매개변수

      3. this.addOperation = addOperation
          this.addOperation : 현재 겍체의 addOperation을 가리킴
          = addOperation : 생성자 매개변수 addOperation을 현재 객체에 할당
      public class Calculator {
      1.    private final AddOperation addOperation;...(뺄셈, 나눗셈, 곱셈도 동일하게)
      2.    public Calculator(AddOperation addOperation, 뺄셈, 나눗셈, 곱셈) {
      3.        this.addOperation = addOperation;
              ... 뺄셈, 나눗셈, 곱셈
          }
      
          public double calculate(String operator, int firstNumber, int secondNumber) {
              double answer = 0;
              if(operator.equals("+")){
                  answer = addOperation.operate(firstNumber, secondNumber);
              }else if(뺄셈, 나눗셈, 곱셈){
              	answer = ...
              }
              return answer;
          }
      
      }


  2. 변수
    구분 생성 소멸 자동 초기화
    클래스 변수 클래스가 메모리에 올라갈 때 프로그램 종료 시 O
    인스턴스 변수 인스턴스 생성 시 인스턴스 소멸 시 O
    지역 변수 블록 내에서 변수 선언문 실행 시 블록을 벗어날 시 X(컴파일 에러)
    public class test {
        
        static int static_Var;     // 클래스 변수
        int instance_Var;          // 인스턴스 변수
        
        public static void main(String[] args) {
            int local_Var;        // 지역 변수
        }
    }
    • 클래스 변수(필드) : 클래스 영역에서 메소드 보다 밖 범위에 static 제어자를 가진 변수
    • 인스턴스 변수(전역 변수)(필드) : 클래스 영역에서 메소드 보다 밖 범위에 static을 가지지 않은 변수
    • 지역 변수 : 클래스 영역 안 메서드, 생성자, 초기화 블럭 안에 있는 변수, 해당 범위 내에서만 유효

 

 

 

 

 

 

'Java & Spring > Java' 카테고리의 다른 글

14일차 - Java강의(쓰레드)  (0) 2024.08.01
13일차 - Java강의(예외, 제네릭)  (0) 2024.07.31
10일차 - Java강의(제어자, package, import, 상속, this, super)  (0) 2024.07.26
9일차 - Java강의(클래스, 필드, 생성자, 멤버, this)  (0) 2024.07.25
8일차 - Java강의(객체지향 ☆)  (0) 2024.07.24
'Java & Spring/Java' 카테고리의 다른 글
  • 14일차 - Java강의(쓰레드)
  • 13일차 - Java강의(예외, 제네릭)
  • 10일차 - Java강의(제어자, package, import, 상속, this, super)
  • 9일차 - Java강의(클래스, 필드, 생성자, 멤버, this)
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 이론공부
        • 자격증
        • 개념
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • DB
      • AWS
      • CI-CD
      • 웹
      • git & github
      • 구인공고분석
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java arrays.copyofrnage()
    java
    java 에라토스테네스의 체
    java 유클리드 호제법
    프로그래머스 java 기초 트레이닝
    자료구조
    java 제어자
    java 멤버
    개발로드맵
    java기초
    java enhance switch
    java 메서드
    Java this
    데이터 크기
    java super
    Java 생성자
    java 세수의합
    java two-pointer
    데이터 타입
    프로그래머스 java 기초트레이닝
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
11일차 - Java강의(계산기 실습, 클래스화, 추상화)
상단으로

티스토리툴바