240731 내일배움캠프 백엔드 Java 6기 TIL : 제출한 개인과제 개선하기

박대현·2024년 7월 31일
3

1. 딱 필요한 만큼의 if문만 쓰자

if (z != '+' && z != '-' && z != '*' && z != '/') throw new FoolException("연산자오류입니다");

요구하지 않는 연산자가 들어왔을 때 예외처리하라는 요구사항에 내가 대처한 방식이다. 틀린건 아니지만 뭔가 일차원적이다.

System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
String doorstop = sc.next();
if (doorstop.equals("exit")) break;

반복문안에서 계속 연산을 반복하다 exit입력시 종료해야하는 요구사항을 코딩했다. 역시 틀린건 아니지만.. 굳이 doorstop이라는 변수를 하나 더 선언해서 메모리적으로도 낭비라는 생각을 지울수 없었다.

오늘 공개된 개인과제 해설영상을 보고 무릎을 탁!

switch(operator) { //연산자를 인자로 받기
	case '+' : //해당코딩
    case '-' : //해당코딩
    case '*' : ///해당코딩
    case '/' : ///해당코딩
    default : throw new FoolException("연산자오류입니다");
}

이렇게 하면 굳이 if문 하나를 더 안써도 된다!

do{

/// 연산코딩

System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
{ while(!sc.next().equals("exit"))

while문 조건에 달아버리면 또 굳이 if문을 안써도 된다!!!
효율적으로 코딩해야 가독성과 성능이 같이 올라가기에, 최대한 if문을 덜쓰면서 해결할 방법이 없을까 고민을 자주 해야겠다고 느꼈다.

2. 꼼꼼한 예외처리 해보기

문제의 요구사항은 '연산자를 잘못받거나, 0으로 나누려고 할때만 예외처리 실행'이었다. 하지만 숫자를 받을때도 숫자가 아니라면 오류처리를 하고 다시 제대로된 숫자를 받을때까지 반복하는 코딩을 해보자는 생각이 들었다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        //Scanner sc = new Scanner(System.in); 여기서 생성하면 안됨
        while (true) {
        	Scanner sc = new Scanner(System.in);
            try {
                System.out.print("첫 번째 정수를 입력하세요: ");
                int x = sc.nextInt();
                break;
            } catch (Exception e) {
                System.out.println("정수만 입력해주세요");
            }
        }

    }

}

맞게 한것 같은데(주석처리된 코딩) 정수가 아닌 데이터를 입력하면, 예외처리 매개메세지만 무한히 뜨는 결과가 나온다. 구글링해보니 스캐너 객체를 반복문 밖에서 만들면 이미 생성된 객체에 숫자가 아닌 값이 계속 존재하기때문에 무한루프가 나옴을 알 수 있었다.

3. 다형성을 이용하면 굳이 새로 변수를?

Calculator 인스턴스를 생성(new)할 때 생성자를 통해 연산 결과를 저장하고 있는 컬렉션 필드가 초기화 되도록 수정합니다.

제일 애먹었던 2-6문제였다. 튜터님과의 질의응답으로 해결하긴 했지만 해설영상을 보고 개선할 부분을 찾았다.

Queue<Integer> que1 = new LinkedList<Integer>();
Calculator cal1 = new Calculator(que1);

틀린건 아닌데, 정말 과제풀때 머리아팠던게, Calculator클래스에 있는 calculator필드에서 데이터 잘만 저장하고있는데 굳이 que1을 만들어야해? 단순히 생성자때문에? 굳이? 라는 생각에 엄청난 회의를 가져가면서 끝끝내 과제를 마무리했었다. 이 회의를 해설영상이 해소해주었는데

Calculator cal1 = new Calculator(new LinkedList<>());

즉시해결. 이러면 굳이 새로운 변수를 선언할 필요가 없다.

4. 그 밖에

  • alt + insert를 누르면 생성자,getter,setter 양식을 자동으로 만들어준다. 꿀
  • final이 붙은 필드는 반드시 생성자를 통한 초기화가 필요하다.

0개의 댓글