생활코딩

[생활코딩] 14. 나의 앱 만들기

주니어주니 2022. 8. 8. 22:39

*참고

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 variablevalueOfSupply 입력하면

모든 변수가 한방에 바뀌고

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();
    }
}