이것저것 공부기록

[부스트코스] 자바로 회계 처리 프로그램 만들기_1 (변수, 입력값) 본문

부스트코스 서포터즈 3기

[부스트코스] 자바로 회계 처리 프로그램 만들기_1 (변수, 입력값)

채도리 2021. 1. 26. 13:56

*부스트코스 <쉽게 배우는 자바1> 강의를 통해 학습한 내용+개인적으로 공부한 내용을 바탕으로 작성한 글입니다.

 

자바에 대한 기본적인 것들을 익혔으니, 강의를 따라가며 자바를 이용해 문제를 해결해볼 것이다.

모든 것을 다 배우는 것은 어렵고 힘들기도 하지만 효율성 또한 떨어진다.

문제를 발견했다면, 주저하지 말고 시작하고 난 뒤 부족한 부분, 필요한 부분을 계속해서 공부해나가며 적용시키면 된다.

 

최소한으로 공부하고 최대한으로 일하는 것을 반복하면서 공부와 일의 경계는 점점 사라져서 일하면서 공부하고 공부하면서 일하는 중급자가 되어 있을 것입니다.

 

라는 강사님 말을 믿고 강의를 차근차근 따라가보도록 하겠다.

문제 현상

 

출처: 부스트코스 <쉽게 배우는 자바 1> Chapter 14-1. 나의 앱 만들기_오리엔테이션

 

1. 기본 기능 구현

프로젝트와 클래스를 생성하고, 가장 기본적인 기능(연산과 출력)만으로 문제를 해결했다. (원하는 결과가 나왔으니)

public class AccountingApp {
	public static void main(String[] args) {
		System.out.println("Value of supply : " + 10000.0);  // 공급가
		System.out.println("VAT : " + (10000.0 * 0.1));  // 부가세
		System.out.println("Total : " + (10000.0 + 10000.0 * 0.1));  // 공급가 + 부가세 = 총 판매가
		System.out.println("Expense : " + (10000.0 * 0.3));  // 비용
		System.out.println("Income : " + (10000.0 - 10000.0 * 0.3));  // 이익
		System.out.println("Dividend 1 : " + (10000.0 - 10000.0 * 0.3) * 0.5);  // 배당 1
		System.out.println("Dividend 2 : " + (10000.0 - 10000.0 * 0.3) * 0.3);  // 배당 2
		System.out.println("Dividend 3 : " + (10000.0 - 10000.0 * 0.3) * 0.2);  // 배당 3
	}
}

 

실행 결과

 

공급가는 10,000원으로 가정한 상태인데, 도구 탭의 Edit - Find/Replace 기능을 이용해 코드에 쓰인 10000.0을 다른 값으로 한번에 변경할 수 있다.

 

그러나 공급가인 10,000이라는 숫자가 계속 반복되는 것만 보아도, 변수를 사용해야겠다는 생각이 들지 않는가?

앞으로 개선의 여지가 보이는 부분들을 계속해서 수정시켜 나갈 것이다.

 

2. 변수 도입

변수의 사용은 코드의 재사용성과 가독성을 높일 수 있음을 다시 한번 상기하자.

 

값 하나하나를 변수로 지정하고 다시 입력할 수도 있지만, 특정 값을 지역 변수로 바꾸기 위해 Extract Local Variable 기능을 이용할 수도 있다.

 

 

 

변수 이름을 지정하고 OK를 클릭하면

 

 

위처럼 해당 값이 지정한 변수 이름으로 바뀌고, 변수 선언까지 자동으로 해준다. 

그러나 일괄적으로 한 번에 변수를 지정할 수 있는 편리함이 있지만 10행에서 앞의 0.3은 비용에 관한 값이고, 뒤의 0.3은 배당율에 관한 값이므로 이러한 경우를 주의해서 사용해야 한다.

 

변수를 도입한 코드는 다음과 같다.

public class AccountingApp {
	public static void main(String[] args) {
		double valueOfSupply = 10000.0;
		double vatRate = 0.1;
		double expenseRate = 0.3;
		double vat = valueOfSupply * vatRate;
		double total = valueOfSupply + vat;
		double expense = valueOfSupply * expenseRate;
		double income = valueOfSupply - expense;
		double dividend1 = income * 0.5;
		double dividend2 = income * 0.3;
		double dividend3 = income * 0.2;

		System.out.println("Value of supply : " + valueOfSupply);
		System.out.println("VAT : " + vat);
		System.out.println("Total : " + total);
		System.out.println("Expense : " + expense);
		System.out.println("Income : " + income);
		System.out.println("Dividend 1 : " + dividend1);
		System.out.println("Dividend 2 : " + dividend2);
		System.out.println("Dividend 3 : " + dividend3);
	}
}

코드가 훨씬 깔끔해졌고, 필요한 값을 수정하기에도 용이해졌다.

그러나 공급가를 바꾸려면 여전히 이클립스를 켜서 코드를 열어 변수 값을 수정해주어야 하는 번거로움이 있다.

따라서 프로그램 실행 시 argument(전달인자)를 받아서 자동으로 회계 처리를 진행할 수 있도록 수정해보자.

 

 

 


<생각해보기>

1) 이렇게 프로그램의 기능은 바꾸지 않으면서 이해하기 쉽게 바꾸는 과정을 리팩토링이라고 합니다. 리팩토링에 대해 알아보세요.

 

리팩토링(Refactoring)이란?

- 프로그램의 기능은 바꾸지 않으면서 이해하기 쉽고, 수정하기 쉽도록 바꾸는 과정

- 외부 동작을 바꾸지 않으면서 내부 구조를 개선하는 방법 → 기능 추가 X

- 좋은 소프트웨어 디자인을 위한 방법

- 중복된 코드, 긴 메소드, 주석 등을 리팩토링할 수 있다.

 

<references>

Refactoring이란? - nesoy.github.io/articles/2018-05/Refactoring

리팩토링이란 무엇인가? - https://codereview.tistory.com/3 [Code Review]

 


 

3. 입력값 도입

double valueOfSupply = args[0];

valueOfSupply 변수(공급가 변수)에 argument 값을 받아와서 저장하도록 수정한다.

그러나 args는 문자형 배열이기 때문에, double 형 데이터에 넣으려고 하면 오류가 발생한다.

 

 

double valueOfSupply = Double.parseDouble(args[0]);

따라서 위처럼 수정해주면 된다.

 

 

Run Configurations 탭에서 Arguments를 수정하여 확인할 수 있다.

 

 

이클립스를 켜서 값을 수정하는 것이 번거로워서 입력값을 도입한 것이었으므로, 이클립스로 실행해보는 것은 의미가 없다.

cmd 창을 열어 프로젝트 폴더의 경로를 이동하여 java 명령어로 프로그램을 실행해보자.

 

실행 결과

 

만약 다른 컴퓨터에서 위 프로그램을 실행시키고 싶다면, 컴파일된 class 파일만 있으면 어디서든지 실행할 수 있다. (다만, 그 컴퓨터에도 자바는 설치되어 있어야 하고, 자바가 설치되어 있지 않다면 launch4와 같은 솔루션을 이용하는 방법이 있다.)

 

한 줄밖에 수정하지 않았지만, 지금까지의 코드는 다음과 같다.

public class AccountingApp {
	public static void main(String[] args) {
		double valueOfSupply = Double.parseDouble(args[0]);
		double vatRate = 0.1;
		double expenseRate = 0.3;
		double vat = valueOfSupply * vatRate;
		double total = valueOfSupply + vat;
		double expense = valueOfSupply * expenseRate;
		double income = valueOfSupply - expense;
		double dividend1 = income * 0.5;
		double dividend2 = income * 0.3;
		double dividend3 = income * 0.2;

		System.out.println("Value of supply : " + valueOfSupply);
		System.out.println("VAT : " + vat);
		System.out.println("Total : " + total);
		System.out.println("Expense : " + expense);
		System.out.println("Income : " + income);
		System.out.println("Dividend 1 : " + dividend1);
		System.out.println("Dividend 2 : " + dividend2);
		System.out.println("Dividend 3 : " + dividend3);
	}
}

 

 


 

다음 챕터의 제목을 보니 조건문, 배열, 반복문, 메소드 등이 있는데, 이 간단한 프로그램을 어디까지 어떻게 개선시키고 진화시켜나갈 것인지 궁금하고 기대가 되었다.

 

생각해보니 나는 보통 코드를 짤 때(특히 혼자 코드를 작성할 때) 전체적인 흐름을 머리속으로 그려두고, 한번에 모든 기능을 포함한 코드를 작성하려고 했었던 것 같다. 그러다보니 가끔 내가 뭘 구현하고 있는지 헷갈릴 때도 있었고, 머릿속에 프로그램의 구조가 이리저리 뒤섞일 때도 있었다. 아직 그러한 점이 문제가 될 만큼 거대한 프로그램을 만들어본 적이 없어서 이러한 방식으로 코딩이 가능했을 지도 모르겠다.

 

처음부터 완벽한 코드를 짜려고 하기보다, 기본 기능을 구현하고 불편한 점을 해소하기 위해 수정하고 추가해나가는 방식을 직접 경험해볼 수 있어서 좋은 것 같고, 앞으로도 이러한 방식으로 프로그래밍할 수 있도록 습관을 바꾸기 위해 노력해야겠다.😊

 

 

다 함께 배우고 성장하는 부스트코스

부스트코스(boostcourse)는 모두 함께 배우고 성장하는 비영리 SW 온라인 플랫폼입니다.

www.boostcourse.org