TIL

[TIL]연산자 처리

높하늬바람 2025. 5. 14. 09:42

TIL - 2025.03.04

오늘 배운 것 개요

오늘은 Java 콘솔 기반 계산기의 기능을 확장하고, 다양한 연산 기능을 추가하는 작업을 수행
특히 연산자 처리 방식 개선, 오류 해결, 그리고 프로그래머스 문제 풀이를 진행하며 Java의 기본 문법과 활용 방법을 익혔다.


1. 연산자 처리 방식 개선

문제점

  • OperatorType에서 sqrtsin이 동일한 's'로 매핑되어 있어 연산자가 올바르게 구별 불가.
  • App.java에서 parsed[0].charAt(0)을 사용하여 연산자를 찾다 보니, 같은 앞글자를 가진 연산자(sqrt vs sin)를 구별할 수 없었음.

해결 방법

  1. OperatorType에서 sqrt'q'로 변경하여 sin과 구별
  2. parseExpression()에서 sqrt"qrt"로 변환하여 OperatorType과 일치
  3. App.java에서 getOperatorType(parsed[0])을 직접 호출하여 문자열을 전달하도록 수정
public enum OperatorType {
    add('+'), sub('-'), mul('*'), div('/'),  
    pow('^'), mod('%'),
    log('l'), sin('s'), cos('c'), tan('t'), sqrt('q'); // sqrt를 'q'로 변경하여 충돌 방지
}

이제 sqrt(45)를 입력하면 sin(45)로 출력되지 않고, 정확한 결과 출력


2. 새로운 연산 기능 추가

삼각함수 (sin, cos, tan) 지원

  • Math.toRadians()를 활용하여 도 단위를 라디안 단위로 변환 후 계산
    result = Math.sin(Math.toRadians(fstValDouble));
    result = Math.cos(Math.toRadians(fstValDouble));
    result = Math.tan(Math.toRadians(fstValDouble));
  • 이제 sin(30), cos(45), tan(60)이 정확한 값출력*

거듭제곱 (pow), 나머지 (mod) 연산 추가

result = Math.pow(fstValDouble, sndValDouble); // 거듭제곱
result = fstValDouble % sndValDouble; // 나머지 연산

이제 2^3 = 8, 10 % 3 = 1 연산을 수행 가능


3. 프로그래머스 문제 풀이

문제 1: 두 정수의 합

class Solution {
    public long solution(int a, int b) {
        long sum = 0;
        int start = Math.min(a, b);
        int end = Math.max(a, b);
        for (int i = start; i <= end; i++) {
            sum += i;
        }
        return sum;
    }
}

모든 정수를 더하는 for문을 활용하여 해결

문제 2: 짝수와 홀수 판별

class Solution {
    public String solution(int num) {
        return (num % 2 == 0) ? "Even" : "Odd";
    }
}

삼항 연산자를 활용하여 간결하게 해결


4. 오늘 느낀 점 & 개선할 부분

  • 연산자 매핑이 겹치면 처리 순서에 따라 잘못된 결과가 나올 수 있다는 점을 다시 한 번 확인함.
  • Math.toRadians()를 사용하지 않으면 삼각함수 계산이 잘못될 수 있음을 알게 됨.
  • Math.pow(), Math.toRadians() 같은 내장 메서드를 적극 활용하면 코드를 훨씬 간결하게 만들 수 있음.
  • 프로그래머스 문제 풀이를 통해 반복문, 삼항 연산자, Math 유틸리티 함수 활용법을 복습할 수 있었음.
  • 다음 목표: 괄호 연산과 다항식 연산(2 + 3 * 4)을 적용하여 계산기를 더욱 발전시키기!