쉽게 배우는 자바 1 강의에서 배운 내용을 토대로 우리가 맞닥뜨린 문제를 해결할 수 있는 프로그램을 짜보았다.
만약 내가 알고있거나 배웠던 내용만으로 문제가 해결되지 않는다면, 그 불편함을 해소하기 위해 공부를 하게 될 것이다.
이번 강의에서는 문제를 해결하면서 발생할 수 있는 불편함을 해소할 수 있을만한 도구들에 대해 배울 것이다.
제어문은 프로그램의 실행 과정을 조건에 따라 바꾸는 것이다.
자바에는 두 가지 제어문이 있는데, 크게 조건문과 반복문이 있다.
조건문을 활용해 프로그램을 만들어볼 것이다.
public class AccountingIFApp {
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;
double dividend2;
double dividend3;
if(income > 10000.0) {
dividend1 = income * 0.5;
dividend2 = income * 0.3;
dividend3 = income * 0.2;
} else {
dividend1 = income * 1.0;
dividend2 = income * 0;
dividend3 = income * 0;
}
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);
}
}
만약, 문제 상황에 새로운 조건이 하나 생겼다고 가정해보자.
수익(income)이 1만원이 넘을 경우에만 동업자들에게 기존의 배당률대로 수익을 배당하고,
수익이 1만원 이하일 경우에는 1번 동업자에게만 모든 수익을 배당하게 되었다.
우리가 배운 내용만으로 문제를 해결하려면 ,
이렇게 두개의 프로그램을 만들어야 할것이다.
이런 경우 조건문을 사용하면 하나의 프로그램으로 모든 문제를 해결할 수 있다.
if(income > 10000.0) { dividend1 = income * 0.5; dividend2 = income * 0.3; dividend3 = income * 0.2; } else { dividend1 = income * 1.0; dividend2 = income * 0; dividend3 = income * 0; } }
- 위 코드는 수입이 1만원을 넘을 경우 기존 배당률대로 수익을 배당하고,
- 수익이 1만원 이하일 겅우에는 1번 동업자에게만 모든 수익을 배당하게 하는 코드이다.
main 메소드의 args 파라미터는 String 자료를 여러개 담을 수 있는 문자열 배열이다.
배열은 같은 자료형을 여러 개 담을 수 있는 객체이다.
public class AccountingArrayApp {
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[] dividendRates = new double[3];
dividendRates[0] = 0.5;
dividendRates[1] = 0.3;
dividendRates[2] = 0.2;
double dividend1 = income * dividendRates[0];
double dividend2 = income * dividendRates[1];
double dividend3 = income * dividendRates[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);
}
}
double rate1 = 0.5; double rate2 = 0.3; double rate3 = 0.2; double dividend1 = income * rate1; double dividend2 = income * rate2; double dividend3 = income * rate3;
- 배당률에 해당하는 부분을 변수화 하였다.
- 이런 경우 수익을 배당할 동업자가 점점 늘어나게 되면 배당률 변수를 계속 추가해 줘야 한다.
배당률 변수를 하나로 묶어서 표현하면, 계속 추가할 필요가 없을 것이다.
배열을 사용해보자.
double[] dividendRates = new double[3];
- 배열은 데이터 타입 옆에 대괄호[] 를 붙여서 표현한다.
- 인스턴스를 만들 때는 배열의 길이를 지정하여 생성해야 한다.
dividendRates[0] = 0.5; dividendRates[1] = 0.3; dividendRates[2] = 0.2; double dividend1 = income * dividendRates[0]; double dividend2 = income * dividendRates[1]; double dividend3 = income * dividendRates[2];
- 배열 내의 데이터는 인덱스를 이용해 접근할 수 있다.
- 배열의 인덱스는 0부터 시작한다.
프로그램의 기능은 변하지 않았지만, 배당률을 배열로 묶어서 표현함으로써 각 배당률이 서로 연관된 정보라는 것을 분명히 할 수 있게 되었고, 변수의 개수도 줄어들게 되었다.
반복문은 조건이 참일때, 해당되는 구간을 계속 반복한다. 배열과 반복문을 이용하면 프로그램을 훨씬 간결하게 만들 수 있다.
public class AccountingArrayLoopApp {
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;
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);
double[] dividendRates = new double[3];
dividendRates[0] = 0.5;
dividendRates[1] = 0.3;
dividendRates[2] = 0.2;
int i = 0;
while(i < dividendRates.length) {
System.out.println("Dividend : " + (income*dividendRates[i]) );
i = i + 1;
}
}
}
int i = 0; while(i < dividendRates.length) { System.out.println("Dividend : " + (income*dividendRates[i]) ); i = i + 1; }
- while 문은 괄호안의 조건이 참이면 블록 내의 작업을 계속 반복한다.
- i 변수는 반복하는 횟수를 의미하고, 0으로 초기화 하여 사용한다.
- 배열의 길이만큼 반복하여 동업자에게 배당 금액을 계산하는 반복문이다.
배열만을 사용했을 때
double dividend1 = income * dividendRates[0]; double dividend2 = income * dividendRates[1]; double dividend3 = income * dividendRates[2]; System.out.println("Dividend 1 : " + dividend1); System.out.println("Dividend 2 : " + dividend2); System.out.println("Dividend 3 : " + dividend3);
- 위 코드는 동업자에게 배당하는 금액을 수익*배당률 로 3번씩 반복하고 있다.
- 배당금액을 출력하는 작업 또한 3번씩 반복하고 있다.
반복문을 함께 사용했을 때
double[] dividendRates = new double[3]; dividendRates[0] = 0.5; dividendRates[1] = 0.3; dividendRates[2] = 0.2; int i = 0; while (i < dividendRates.length) { System.out.println("Dividend : " + income * dividendRates[i]); i = i + 1; }
- while 문을 사용해 3번씩 반복하던 작업을 간결하게 수정하였다.
- 만약 동업자가 백만명으로 늘어난다면 이전 방식에서는 2억줄이 넘는 코드가 늘어져 있었을텐데, 반복문을 사용하면 3명이든, 백만명이든 언제나 5줄의 코드이다.
부스트코스 쉽게 배우는 자바 1
https://www.boostcourse.org/cs126