기존 AccountingApp.java 파일 복사 및 rename paste.
1. 조건문 (AccountingIFApp)
public class AccountingIFApp {
public static void main(String[] args) {
double valueOfSupply =Double.parseDouble(args[0]); //args는 string 형식의 배열이기 때문에 숫자 형식(double)은 에러남.
double vatRate = 0.1;
double expenseRate = 0.3;
double VAT = valueOfSupply*vatRate;
double total = valueOfSupply + VAT;
double expense = valueOfSupply*expenseRate;
double income = valueOfSupply - expense; //10,000원보다 작으면 1이 다 가져감, 크면 5:3:2 배당
double dividend1; //dividend 변수 : double 형식 선
double dividend2;
double dividend3;
if(income > 10000.0) { //10000.0보다 크면 5:3:2
dividend1 = (income)*0.5;
dividend2 = (income)*0.3;
dividend3 = (income)*0.2;
} else { //10000.0보다 작거나 같다면 1이 독
dividend1 = income * 1.0;
dividend2 = income * 0;
dividend3 = income * 0;
}
System.out.println("Value of supply : "+valueOfSupply);
System.out.println("VAT : "+VAT); //VAT 10%
System.out.println("Total : "+total); //소비자가 판매자에게 지불해야 하는 값
System.out.println("Expense : "+expense); //물건 원가
System.out.println("Income : "+income); //순익
System.out.println("Dividend 1 : "+dividend1); // 1 배당금
//배당금 -> 5 : 3 : 2 비율로 나눠갖기로 합의.
System.out.println("Dividend 2 : "+dividend2); // 2 배당금
System.out.println("Dividend 3 : "+dividend3); // 3 배당금
}
}
실행
에러난 원인은 입력 값이 부재하기 때문이다.
따라서 run configurations - Arguments 에서 값을 입력해야 할 필요가 있다.
값을 50000.0을 취하고 실행시키면
5:3:2로 배당이 되었다.
그렇다면 9000.0의 값을 취하면 dividend 1이 독식을 하는지 살펴볼 필요도 있다.
dividend 1이 혼자 모든 배당금을 할당받은 것을 알 수 있다.
2. 배열
//서로 연관된 데이터를 정리정돈하는 수단 : 배열
public class AccountingArrayApp {
public static void main(String[] args) { //String : 문자열로 이루어져있는 배열
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];//double형 배열
//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); //VAT 10%
System.out.println("Total : "+total); //소비자가 판매자에게 지불해야 하는 값
System.out.println("Expense : "+expense); //물건 원가
System.out.println("Income : "+income); //순익
System.out.println("Dividend 1 : "+dividend1); // 1 배당금
//배당금 -> 5 : 3 : 2 비율로 나눠갖기로 합의.
System.out.println("Dividend 2 : "+dividend2); // 2 배당금
System.out.println("Dividend 3 : "+dividend3); // 3 배당금
}
}
코드가 복잡할 수록 정리정돈이 잘 되어 있어야 한다.
서로 연관된 여러 변수들이 존재한다고 가정하면, 다른 사람이 변수를 건드렸을 때는 걷잡을 수 없이 복잡해진다.
이를 해결하기 위해, 더 잘 알아볼 수 있게 하기 위해 배열을 쓴다.
변수 세개를 입력해야 하는 것과는 달리,
배열에서는 변수 하나만 가지고도 변수 세개를 입력한 것과 같은 결과를 낼 수 있다.
참고로 배열과 반복문이 같이 사용된다면 엄청난 시너지를 낼 수 있다.
코드에서 에러가 났을 때 해당 줄만 에러 해결 처리를 하면 바로 에러 해결이 되기 때문.
3. 반복문
현재는 dividend가 3명이지만, 동업자가 10,000명이라고 가정한다면 굉장히 복잡해진다.
이런 상황에서 반복문을 쓴다.
(똑같은 구조 - 데이터만 다른 상황) : 하나의 코드로 표현
public class AccountingArrayLoopApp {
public static void main(String[] args) { //String : 문자열로 이루어져있는 배열
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); //VAT 10%
System.out.println("Total : "+total); //소비자가 판매자에게 지불해야 하는 값
System.out.println("Expense : "+expense); //물건 원가
System.out.println("Income : "+income); //순익
double[] dividendRates = new double[3];//double형 배열
dividendRates[0] = 0.5;
dividendRates[1] = 0.3;
dividendRates[2] = 0.2;
int i = 0;
while(i < dividendRates.length) { //3번 반복되어야 한다. (dividend1~3)
//dividendRates.length : dividendRates는 총 3개이기 때문에 3이 된다.
System.out.println("Dividend 1 : "+ (income * dividendRates[i])); // 1 배당금
i = i + 1;
}
}
}
4. 메소드
서로 연관된 코드를 그룹핑하여 이름을 붙인 정리정돈의 상자다.
9번 코드 중 valueOfSupply*vatRate 해당 부분 드래그 후 option - Refactor - Extract Method
위 메소드 이름 설정 후 OK
아래 코드에서 getVAT 메소드 뒤 ( ) 안 내용 없애고 싶을 때,
double VAT = getVAT(); 으로 바꾸려면
밑의 숨겨진 getVAT 메소드 부분에서
public static double getVAT() {
이렇게 바꿔야 한다.
그러나 해당 코드로 변환 시 에러가 뜬다.
return 뒤 valueOfSupply와 vatRated의 변수가 정의되지 않았기 때문이다.
main 함수에서 다 정의를 해줬어도 main { } 안에서만 효과를 보일 뿐,
중괄호 안을 벗어나면 정의를 해주지 않은 것이 된다.
해결)
alueOfSupply와 vatRated를 AccountingMethodApp 전역변수로 지정해서
모든 메소드에서 접근할 수 있도록 해야 한다.
public class AccountingMethodApp {
public static void main(String[] args) {
double valueOfSupply =Double.parseDouble(args[0]); //args는 string 형식의 배열이기 때문에 숫자 형식(double)은 에러남.
double vatRate = 0.1;
double expenseRate = 0.3;
double VAT = getVAT(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); //VAT 10%
System.out.println("Total : "+total); //소비자가 판매자에게 지불해야 하는 값
System.out.println("Expense : "+expense); //물건 원가
System.out.println("Income : "+income); //순익
System.out.println("Dividend 1 : "+dividend1); // 1 배당금
//배당금 -> 5 : 3 : 2 비율로 나눠갖기로 합의.
System.out.println("Dividend 2 : "+dividend2); // 2 배당금
System.out.println("Dividend 3 : "+dividend3); // 3 배당금
}
private static double getVAT(double valueOfSupply, double vatRate) {
return valueOfSupply*vatRate;
}
}
valueOfSupply와 vatRate를 전역변수로 지정하려면,
valueOfSupply 변수 지정을 main 메소드 위에 전역변수로 지정해줘야 한다.
전역 변수로 쉽게 지정하는 방법은 해당 변수 - Refactor - Convert Local Varable to Field
public click
변수의 선언은 바깥 쪽에서 진행하고, 변수 값의 선언은 main 함수 안에서 진행한다.
double total도 메소드 처리 진행한다.
getTotal 메소드 다음 () 내용 없애려면 밑에 숨겨져 있는 메소드에서도 똑같이 ()를 없애야 한다.
그러면 return 쪽에 VAT부분에 에러가 뜨는데, 이를 전역변수 처리해도 상관없지만
어차피 VAT을 전역함수 처리하나, getVAT() 메소드를 호출하거나 결과는 같아서
getVAT() 메소드를 호출하는 것이 더 정리가 잘 된 느낌의 코드로 보여질 수 있다.
expense의 메소드 처리도 진행 방식이 비슷하다.
double expense = ( 이 부분);
이 부분 드래그 후 메소드 만들어주고, 메소드 () 중 괄호 안 내용 삭제,
밑 숨겨져 있는 메소드 옆 괄호 안 내용 삭제.
숨김 메소드 안 expenseRate 부분의 정의되지 않아 에러가 나는데,
지역변수로 바꿔주면 된다.
다음 코드는 메소드를 이용하여 모두 정리한 코드다.
public class AccountingMethodApp {
public static double valueOfSupply = 10000.0; //전역변수 지
public static double vatRate;
public static double expenseRate;
public static void main(String[] args) {
valueOfSupply = 10000.0;
vatRate = 0.1;
expenseRate = 0.3;
double VAT = getVAT(); //만들어진 메소드를 호출/실행하는 코드이다.
double total = getTotal();
double expense = getExpense();
double income = getincome();
double dividend1 = getdividend1();
double dividend2 = getdividend2();
double dividend3 = getdividend3();
print();
}
private static void print() {
System.out.println("Value of supply : "+valueOfSupply);
System.out.println("VAT : "+getVAT()); //VAT 10%
System.out.println("Total : "+getTotal()); //소비자가 판매자에게 지불해야 하는 값
System.out.println("Expense : "+getExpense()); //물건 원가
System.out.println("Income : "+getincome()); //순익
System.out.println("Dividend 1 : "+getdividend1()); // 1 배당금
//배당금 -> 5 : 3 : 2 비율로 나눠갖기로 합의.
System.out.println("Dividend 2 : "+getdividend2()); // 2 배당금
System.out.println("Dividend 3 : "+getdividend3()); // 3 배당금
}
private static double getdividend3() {
return getincome()*0.2;
}
private static double getdividend2() {
return getincome()*0.3;
}
private static double getdividend1() {
return getincome()*0.5;
}
private static double getincome() {
return valueOfSupply - getExpense();
}
private static double getExpense() {
return valueOfSupply*expenseRate;
}
private static double getTotal() {
return valueOfSupply + getVAT();
}
private static double getVAT() {
return valueOfSupply*vatRate;
}
}
그러나 12 - 18번 줄은 밑에 위치한 메소드에서 다 정의가 되어 있기 때문에 필요 없으므로
제거해주면 된다.
public class AccountingMethodApp {
public static double valueOfSupply = 10000.0; //전역변수 지정
public static double vatRate;
public static double expenseRate;
public static void main(String[] args) {
valueOfSupply = 10000.0;
vatRate = 0.1;
expenseRate = 0.3;
print();
}
private static void print() {
System.out.println("Value of supply : "+valueOfSupply);
System.out.println("VAT : "+getVAT()); //VAT 10%
System.out.println("Total : "+getTotal()); //소비자가 판매자에게 지불해야 하는 값
System.out.println("Expense : "+getExpense()); //물건 원가
System.out.println("Income : "+getincome()); //순익
System.out.println("Dividend 1 : "+getdividend1()); // 1 배당금
//배당금 -> 5 : 3 : 2 비율로 나눠갖기로 합의.
System.out.println("Dividend 2 : "+getdividend2()); // 2 배당금
System.out.println("Dividend 3 : "+getdividend3()); // 3 배당금
}
private static double getdividend3() {
return getincome()*0.2;
}
private static double getdividend2() {
return getincome()*0.3;
}
private static double getdividend1() {
return getincome()*0.5;
}
private static double getincome() {
return valueOfSupply - getExpense();
}
private static double getExpense() {
return valueOfSupply*expenseRate;
}
private static double getTotal() {
return valueOfSupply + getVAT();
}
private static double getVAT() {
return valueOfSupply*vatRate;
}
}
훨씬 더 단정한 코드를 만들 수 있다.
5. 클래스
서로 연관된 변수와 메소드를 그룹핑한 것에 이름을 붙인 것. (정리정돈의 상자)
-> 소프트웨어를 만들어가는 것에 있어서 구조를 만들어 가는 것이기 때문에 중요한 내용이다.
-> 클래스 소속 변수&메소드의 리스트를 보여준다.
class Accounting {
public static double valueOfSupply = 10000.0; //AccountingClassApp에 선언된 전역변수들을 class의 맴버로 바꾸
public static double vatRate;
public static double expenseRate;
//메소드들도 class로 이동시킨다.
static void print() {
System.out.println("Value of supply : "+valueOfSupply);
System.out.println("VAT : "+getVAT()); //VAT 10%
System.out.println("Total : "+getTotal()); //소비자가 판매자에게 지불해야 하는 값
System.out.println("Expense : "+getExpense()); //물건 원가
System.out.println("Income : "+getincome()); //순익
System.out.println("Dividend 1 : "+getdividend1()); // 1 배당금
//배당금 -> 5 : 3 : 2 비율로 나눠갖기로 합의.
System.out.println("Dividend 2 : "+getdividend2()); // 2 배당금
System.out.println("Dividend 3 : "+getdividend3()); // 3 배당금
}
private static double getdividend3() {
return getincome()*0.2;
}
private static double getdividend2() {
return getincome()*0.3;
}
private static double getdividend1() {
return getincome()*0.5;
}
private static double getincome() {
return valueOfSupply - getExpense();
}
private static double getExpense() {
return valueOfSupply*expenseRate;
}
private static double getTotal() {
return valueOfSupply + getVAT();
}
private static double getVAT() {
return valueOfSupply*vatRate;
}
}
public class AccountingClassApp {
public static void main(String[] args) {
Accounting.valueOfSupply = 10000.0; //Accounting. 앞에 추가 -> 결과는 같
Accounting.vatRate = 0.1;
Accounting.expenseRate = 0.3;
Accounting.print();
}
}
class라는 소속감을 부여함으로써 다른 취지의 코드들이 섞여있어도 상관 없게 된다.
소속관계를 명확히 했기 때문이다.
같은 이름의 메소드들이 (ex. print) 공존해도 상관없다.
위 print는 그냥 print가 아니라 Accounting.print이기 때문이다.
(Accounting에 소속된 print 메소드)
-> 코드의 구조를 더 쉽고 튼튼하게 만든다.
6. 인스턴스
하나의 클래스를 복제해서 서로 다른 데이터의 값과 서로 같은 메소드를 가진 복제본을 만드는 것.
어쩌다가 Accounting.valueOfSupply가 초기에 지정한 10000.0값이 아닌 20000.0과 같은
다른 값이 온다면?
Accounting1과 Accounting2로 나눠서 세팅할 수도 있다.
복제된 클래스를 이용한다는 뜻이다.
그러나 코드가 또 길어질 수도 있고, 복잡해진다.
클래스의 내부적인 구조를 바꾼다면 복제한 모든 클래스의 내부 구조를 바꿔야 할 것이다.
클래스를 생성할 때마다 정의를 추가하는 것도 복잡해진다.
class Accounting {
public double valueOfSupply = 10000.0; //AccountingClassApp에 선언된 전역변수들을 class의 맴버로 바꾸
public double vatRate;
public double expenseRate; //(new)인스턴스 사용 시 Accounting 내 static 변수 사용 금지
//메소드들도 class로 이동시킨다.
public void print() {
System.out.println("Value of supply : "+valueOfSupply);
System.out.println("VAT : "+getVAT()); //VAT 10%
System.out.println("Total : "+getTotal()); //소비자가 판매자에게 지불해야 하는 값
System.out.println("Expense : "+getExpense()); //물건 원가
System.out.println("Income : "+getincome()); //순익
System.out.println("Dividend 1 : "+getdividend1()); // 1 배당금
//배당금 -> 5 : 3 : 2 비율로 나눠갖기로 합의.
System.out.println("Dividend 2 : "+getdividend2()); // 2 배당금
System.out.println("Dividend 3 : "+getdividend3()); // 3 배당금
}
public double getdividend3() {
return getincome()*0.2;
}
public double getdividend2() {
return getincome()*0.3;
}
public double getdividend1() {
return getincome()*0.5;
}
public double getincome() {
return valueOfSupply - getExpense();
}
public double getExpense() {
return valueOfSupply*expenseRate;
}
public double getTotal() {
return valueOfSupply + getVAT();
}
public double getVAT() {
return valueOfSupply*vatRate;
}
}
public class AccountingClassApp {
public static void main(String[] args) {
//new : Accounting class를 복제하는 명령 (인스턴)
//a1 변수의 값은 Accounting의 복제본만 들어올 수 있다는 표시를 해줘야 한다. (a1 앞 Accounting)
Accounting a1 = new Accounting();
a1.valueOfSupply = 10000.0;
a1.vatRate = 0.1;
a1.expenseRate = 0.3;
a1.print();
Accounting a2 = new Accounting();
a2.valueOfSupply = 20000.0;
a2.vatRate = 0.05;
a2.expenseRate = 0.2;
a2.print();
//class를 복제하지 않아도 됨.
}
}
자바에서는 메소드로 구조를 잡고,
메소드와 변수를 그룹핑해서 클래스로 구조를 잡고,
클래스를 복제한 인스턴스를 통해서 또 다른 구조를 만드는 것이 특징이다.
'[Language] > Java | Spring | JSP' 카테고리의 다른 글
[백준]1001: A-B (0) | 2022.04.14 |
---|---|
[백준]1000: A+B (0) | 2022.04.14 |
[백준]10172: 개 (0) | 2022.04.14 |
[백준]10171: 고양이 (0) | 2022.04.13 |
[백준]10718:We love kriii (0) | 2022.04.13 |