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

  • 최근 글

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

티스토리툴바