*참고
Ctrl+D : 해당줄의 코드를 지우고싶은 경우
Ctrl+Alt+방향키 아래 : 해당 줄의 코드를 아래로 똑같이 복사하여 붙이고 싶은경우
Alt + 옮기고 싶은 방향 방향키 : 해당코드를 이동
- 14.2. 기본 기능 구현
※알고 있는 것만으로 해결하자!!!!!
- 변수를 사용하지 않고 판매자의 입장에서 수입, 세금, 비용, 이익, 분배 등을 계산하기
1. 새 프로젝트 생성 (MyApp)
2. 클래스 생성 (AccountingApp)
10000.0원이라는 가격을 바꾸기
10000.0 을 잡아서 edit → find/replace → 바꾸고 싶은 숫자를 find → replace with 로 바꿈 → relace all → 변수를 사용하지 않아도 바로 바뀜!
public class AccountingApp {
public static void main(String[] args) {
System.out.println("Value of supply : "+12345.0); //공급가액
System.out.println("VAT :"+ (12345.0*0.1)); //부가가치세
System.out.println("Total :"+ (12345.0 + 12345.0*0.1)); //소비자가 지불해야 하는 합계
System.out.println("Expense : "+ (12345.0*0.3)); // 30% 비용 발생 시
System.out.println("Income : "+ (12345.0-12345.0*0.3)); // 공급가액-비용=공급자의 순수입
System.out.println("Dividend 1 : "+ (12345.0-12345.0*0.3) * 0.5); // 수입*0.5 배당
System.out.println("Dividend 2 : "+ (12345.0-12345.0*0.3) * 0.3); // 수입*0.3 배당
System.out.println("Dividend 3 : "+ (12345.0-12345.0*0.3) * 0.2); // 수입*0.2 배당
}
}
14.3. 변수도입
저기서 변수를 도입할 때
12345.0이라는 데이터타입이 double 이기 때문에
double valueOfSupply = 12345.0;
를 삽입하고 12345.0 이라는 숫자를 valueOfSupply 로 바꿔줘야 함.
근데 여기서 저런 거 없이 한 번에 변수화 시키는 방법
12345.0 잡아서 오른쪽 버튼 → refactor → extract local variable → valueOfSupply 입력하면
모든 변수가 한방에 바뀌고
double valueOfSupply = 12345.0;
얘도 저절로 생김 ;;;
부가가치세 0.1도 잡아서 변수화
vatRate
비용 30%도 0.3 잡아서 변수화
expenseRate 해야하는데
그렇게 하면 비용 30% 뿐만 아니라 배분할 때 5:3:2 중 3의 비율 0.3도 바뀌어버림.
바뀌면 안되는 것까지 바뀌어버림
그래서 일일이 바꿔줌
double valueOfSupply = 12345.0;
double vatRate = 0.1;
double expenseRate = 0.3;
System.out.println("Value of supply : "+valueOfSupply);
System.out.println("VAT :"+ (valueOfSupply*vatRate));
System.out.println("Total :"+ (valueOfSupply + valueOfSupply*vatRate));
System.out.println("Expense : "+ (valueOfSupply*expenseRate));
System.out.println("Income : "+ (valueOfSupply-valueOfSupply*expenseRate));
System.out.println("Dividend 1 : "+ (valueOfSupply-valueOfSupply*0.3) * 0.5);
System.out.println("Dividend 2 : "+ (valueOfSupply-valueOfSupply*0.3) * 0.3);
System.out.println("Dividend 3 : "+ (valueOfSupply-valueOfSupply*0.3) * 0.2);
(valueOfSupply*vatRate)
얘도 vat 로 변수화
(valueOfSupply + valueOfSupply*vatRate)
얘도 total 로 변수화
expense, income,dividend 도 변수화
double dividend1 = (valueOfSupply-valueOfSupply*0.3) * 0.5;
에서
valueOfSupply*0.3 이 부분은
공급가액*0.3 = 비용 30%
→ expense 로 일일이 바꿔줌
double dividend1 = (valueOfSupply-expense) * 0.5;
또 여기서
공급가액-비용 = income
→ income 으로 일일이 바꿔줌
변수를 이용해서 깔끔+편리하게 코드 정리
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);
}
}
- 14.4. 입력값 도입
run configurations → accountingapp → arguments → 20000.0 입력 → name: AccountingApp - 20000.0 수정 후 적용
일단 닫고
double valueOfSupply = 10000.0; 를
double valueOfSupply = args[0]; 로 수정하면 오류
(args 값이 string인데 double 로 바꿔야 함 -> 구글링)
double valueOfSupply = Double.parseDouble(args[0]);
이클립스 없이 자바 어플리케이션 실행하고 싶을 때
1. 프로젝트 경로 찾기: 프로젝트(MyApp) -> properties -> location 경로 복사
2. cmd 실행
3. 경로 붙여넣기: cd C:\Users\wnnns\Desktop\java 1\MyApp
4. AccountingApp.java 있는지 확인
5. 실행시키기: java AccountingApp 3333.0 (-> 입력값)
- 14.6. 조건문
income < 10000원 일 때는, 배분 비율 5의 사람이 수익을 다 가져가고
income > 10000원 일 때만, 5:3:2의 수익으로 나누게 하고 싶을 때
방법1)
1. AccountingApp.java를 복붙해서 AccountingIFAPP.java 만듦
2. AccountingIFUnder10000App.java 를 또 복사
3. 로직을 변경
double dividend1 = income * 1;
double dividend2 = income * 0;
double dividend3 = income * 0;
근데 이걸 자동(조건문)으로 해주면?
방법2)
if(income > 10000.0) {
double dividend1 = income * 0.5;
double dividend2 = income * 0.3;
double dividend3 = income * 0.2;
} else {
double dividend1 = income * 1;
double dividend2 = income * 0;
double dividend3 = income * 0;
}
이건데
double에 대한 선언을 위에다가 미리 해줌
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;
dividend2 = income * 0;
divedend3 = income * 0;
}
근데 실행시키면 오류가 나는 이유는 입력값이 없기 때문
run configurations → arguments → 하나는 50000.0 입력 → name: ~ - 50000.0 → 적용
→ duplicate (복제) → 또 하나는 5000.0 입력 → name: ~ - 5000.0 → 적용 → run
두 개 적용 후 배분값 비교하기
- 14.7. 배열
AccountingIFApp 가 아닌 AccountingApp를 복사한 자바 클래스 생성 (배열은 조건문을 한 뒤에 해야되는게 아니기 때문)
→ AccountingArrayApp (array: 배열)
double dividend1 = income * 0.5;
double dividend2 = income * 0.3;
double dividend3 = income * 0.2;
여기에 이름을 붙이면 저 0.5의 의미가 더 분명해질 것
방법 1)
double rate1 = 0.5;
double rate2 = 0.3;
double rate3 = 0.2;
double dividend1 = income * rate1;
double dividend2 = income * rate2;
double dividend3 = income * rate3;
근데 만약 이렇게 간단한 코드가 아니라
엄청나게 많은 코드이고 심지어 비슷한 성질도 아니라면 엄청 복잡하고 더러워질 것
그 때 배열을 만듦
방법 2)
double[] dividendRates
: dividendRates라는 이름의 더블형 데이터로 이루어져있는 배열이다
new double[3] : 더블형의 데이터 3개를 담을 수 있는 수납상자
더블 데이터로 이루어져 있는 배열에서 연관된 값들을 그룹핑하고 거기다가 dividendrates라는 이름을 붙인 거
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];
여기다가 입력값 주기
run configuration → arguments (10000.0 입력해보기)
∴이전과 똑같이 동작하는 코드이지만 이 배열을 도입하면
dividend 값들이 서로 연관된 값이라는 것을 분명히 할 수 가 있게 됨 (0.5, 0.3, 0.2 이렇게 해놓은 것보다)
그리고 변수가 이전에는 3개 였는데 지금은 하나의 변수가 존재하기 때문에
변수가 오염될 가능성이 현저히 줄어듦
※배열: 서로 연관된 데이터를 정리정돈하는 수단
- 14.8. 반복문
반복문은 배열이랑 많이 쓰임
"배열"이 반복문이 연속적으로 처리해야 할 데이터들을 가져오기 좋게 차곡차곡 저장해 놓았기 때문
AccountingArrayApp.java 복붙하기
AccountingArrayLoopApp.java (loop: 반복)
지금은 수익을 분배해야 할 동업자가 3명이기 때문에
dividend 가 3까지만 있지만, 동업자가 만 명인 경우를 생각하면 코드를 만 개를 짤 수 없음
while이라는 반복문
int i = 0; ( i라는 변수에 기록하고 )
i = i + 1; (반복할 때마다 i의 값을 1씩 증가시킴 )
이걸 몇번 반복하냐
while(i < dividendRates.length) (i의 값이 dividendRates의 개수보다 작은 동안 반복)
실행시키면 오류 -> 입력값
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 1 : "+ (income*dividendRates[i]));
i = i + 1 ;
}
}
}
- 14.9. 메소드(너무 어려운 내용이므로 보기만 할 것)
메소드: 서로 연관된 코드를 그룹핑해서 이름을 붙인 정리정돈의 상자. 깔끔하게 정리할 수 있다.
valueOfSupply*vatRate;
를 잡아서 오른쪽 버튼 -> refactor -> extract method -> 메소드 이름: getVAT -> 체크박스 해제 => 메소드 생성 완
맨 밑에 생긴
private static double getVAT(double valueOfSupply, double vatRate) {
return valueOfSupply*vatRate;
얘는 메소드를 만드는 코드
double vat = getVAT(valueOfSupply, vatRate);
얘는 만들어진 메소드를 호출하여 실행하는 코드
( ) 는 입력값
얘를 더 깔끔하게 하고 싶으면
getVAT(); 로 괄호 안을 비워놓고, 밑에 있는 getVAT() 도 비움
그럼 오류가 남
지역변수를 전역변수로 바꿔줘야 함. (refactor -> convert local variable to field)
public class AccountingMethodApp {
public static double valueOfSupply;
public static double vatRate;
public static double expenseRate;
public static void main(String[] args) {
valueOfSupply = 10000.0;
vatRate = 0.1;
expenseRate = 0.3;
print();
}
public static void print() {
System.out.println("Value of supply : " + valueOfSupply);
System.out.println("VAT : " + getVAT());
System.out.println("Total : " + getTotal());
System.out.println("Expense : " + getExpense());
System.out.println("Income : " + getIncome());
System.out.println("Dividend 1 : " + getDiviend1());
System.out.println("Dividend 2 : " + getDiviend2());
System.out.println("Dividend 3 : " + getDiviend3());
}
public static double getDiviend1() {
return getIncome() * 0.5;
}
public static double getDiviend2() {
return getIncome() * 0.3;
}
public static double getDiviend3() {
return getIncome() * 0.2;
}
public static double getIncome() {
return valueOfSupply - getExpense();
}
public static double getExpense() {
return valueOfSupply * expenseRate;
}
public static double getTotal() {
return valueOfSupply + getVAT();
}
public static double getVAT() {
return valueOfSupply * vatRate;
}
}
- 14.10. 클래스
객체(클래스): 서로 연관된 변수와 메소드를 그룹핑해서 이름을 붙인 것. 얘네가 구조를 결정하기 때문에 중요함.
AccountingMethodApp 를 복사해서 AccountingClassApp 만들기
저기에다가
다른 변수와 메소드들이 무수히 많을 수 있음. 그러면 코드가 너무 지저분해짐.
이 때 필요한 것이 클래스
public static double valueOfSupply;
public static double vatRate;
public static double expenseRate;
이 변수(필드)들은 AccountingClassApp의 소속인데 얘네를 잘라내서 클래스밑에 붙임 → 멤버가 된 것
나머지도 컷해서 멤버로 바꿈
Accounting 이라는 클래스 이름을 앞에 붙이면
이전과 똑같이 동작하는 코드
accounting 클래스에 속해있는 것들임을 분명히 함으로써 다른 변수, 메소드들과 섞여도 구분할 수 있고, 중복오류없이 쓰일 수 있음
class Accounting{
public static double valueOfSupply;
public static double vatRate;
public static double expenseRate;
public static void print() {
System.out.println("Value of supply : " + valueOfSupply);
System.out.println("VAT : " + getVAT());
System.out.println("Total : " + getTotal());
System.out.println("Expense : " + getExpense());
System.out.println("Income : " + getIncome());
System.out.println("Dividend 1 : " + getDiviend1());
System.out.println("Dividend 2 : " + getDiviend2());
System.out.println("Dividend 3 : " + getDiviend3());
}
public static double getDiviend1() {
return getIncome() * 0.5;
}
public static double getDiviend2() {
return getIncome() * 0.3;
}
public static double getDiviend3() {
return getIncome() * 0.2;
}
public static double getIncome() {
return valueOfSupply - getExpense();
}
public static double getExpense() {
return valueOfSupply * expenseRate;
}
public static double getTotal() {
return valueOfSupply + getVAT();
}
public static double getVAT() {
return valueOfSupply * vatRate;
}
}
public class AccountingClassApp {
public static void main(String[] args) {
Accounting.valueOfSupply = 10000.0;
Accounting.vatRate = 0.1;
Accounting.expenseRate = 0.3;
Accounting.print();
// anotherVariable = ...;
// anotherMethod = ...;
}
}
- 14.11. 인스턴스
- 객체지향의 양대산맥 : 클래스 / 인스턴스
- 인스턴스: 하나의 클래스를 복제해서 서로 다른 데이터의 값과 서로 같은 메소드를 가진 복제본을 만드는 것.
Accounting.valueOfSupply = 10000.0;
Accounting.vatRate = 0.1;
Accounting.expenseRate = 0.3;
Accounting.print();
얘네가 만약에 값만 다르고 여러번 반복된다고 치면, 오류가 발생할 가능성이 높아짐
클래스 복제 = 인스턴스
new Accounting();
a1이라는 변수값에는 반드시 accounting이라는 클래스 복제본만 들어올 수 있다.
Accounting a1 = new Accounting();
a1.valueOfSupply = 10000.0;
a1.vatRate = 0.1;
a1.expenseRate = 0.3;
a1.print();
이 인스턴스가 작동되기 위해서는 static 을 지워줘야 함
class Accounting{
public double valueOfSupply;
public double vatRate;
public double expenseRate;
public void print() {
System.out.println("Value of supply : " + valueOfSupply);
System.out.println("VAT : " + getVAT());
System.out.println("Total : " + getTotal());
System.out.println("Expense : " + getExpense());
System.out.println("Income : " + getIncome());
System.out.println("Dividend 1 : " + getDiviend1());
System.out.println("Dividend 2 : " + getDiviend2());
System.out.println("Dividend 3 : " + getDiviend3());
}
public double getDiviend1() {
return getIncome() * 0.5;
}
public double getDiviend2() {
return getIncome() * 0.3;
}
public double getDiviend3() {
return getIncome() * 0.2;
}
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) {
// instance
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();
a1.print();
}
}
'생활코딩' 카테고리의 다른 글
[생활코딩] 13. 자바문서 보는 법 (0) | 2022.08.08 |
---|---|
[생활코딩] 12. 직접 컴파일하고 실행하기 (0) | 2022.08.08 |
[생활코딩] 11. 입력과 출력 (0) | 2022.08.08 |
[생활코딩] 10. 디버거 (0) | 2022.08.08 |
[생활코딩] 9. 프로그래밍 (0) | 2022.08.08 |