Java 기초문법 활용

2020-08-30

.

JAVA_TIL(20200830)

study program : youtube 생활코딩 채널 ‘JAVA1’

[실습목표]

Java 기초문법을 이용하여 아래와 같은 어플리케이션을 만들어보자

우리가 물건을 판매하는 사업자라고 가정하자. 물건을 팔게되면 세금도 내야하고, 인건비도 내야하고, 기타 비용이 발생한다.

이런 비용들을 공제하고, 또한 같이 일하는 동업자들에게 배당을 하는 작업을 물건을 하나 팔때마다 이런 작업을 해줘야 한다.

이런작업을 하려고 하니까 손이 너무많이 간다. 전문적인 프로그램을 사용하기에는 불필요하다. 그래서 자바로 프로그램을 개발한다고 가정하자

가장 먼저해야할 일은 현실을 분석해야 한다.

먼저 소비자에게 물건을 판매할때의 가격을 공급가라고 한다. 여기에 추가로 국세청에서 소비자에게 세금을 가저간다. 이것을 부가가치세라고 한다. 일반적으로 물건가격의 10%를 가져간다.

image

일반적으로는 소비자가 직접 국세청에 세금을 내는것이 아니라 판매자가 물건을 팔때 세금까지 같이 가져가고, 그 세금을 국세청에 대신 납부하는 형태이다.

image

그리고 판매자는 물건 하나를 만들때 물건값의 30%는 비용으로 나간다고 가정하자. 그러면 판매자에게 돌아오는 수익은 7000원이다.

image

물건하나를 판매할때 수익을 위와 같이 계산하는 것은 번거로운일이다. 또한 이 물건이 100개, 1000개, 10000개 이상 판매될 경우 이를 수작업으로 일일히 해줄수도 없다. 그래서 자바를 이용해서 이 수익을 계산해주는 어플리케이션을 만들어보려고 한다.

[실습내용]

  • 실습환경

Amazon Linux AMI2 (ec2)

  • 실습 사전준비
[ec2-user@ip-10-1-10-131 ~]$ sudo yum update -y

[ec2-user@ip-10-1-10-131 ~]$ sudo yum install tree -y

[ec2-user@ip-10-1-10-131 ~]$ sudo yum install -y java-1.8.0-openjdk-devel.x86_64

[ec2-user@ip-10-1-10-131 ~]$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

[ec2-user@ip-10-1-10-131 ~]$ mkdir MyApp

[ec2-user@ip-10-1-10-131 ~]$ cd MyApp
  • 실습

물건하나가 만원이라고 했을때 위와 같이 수익을 계산하는 과정을 하드코딩해서 구현해보자.

[ec2-user@ip-10-1-10-131 MyApp]$ sudo vim AccountingApp.java
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("Divided 1 : " + (10000.0 - 10000.0 * 0.3) * 0.5);
        System.out.println("Divided 2 : " + (10000.0 - 10000.0 * 0.3) * 0.3);
        System.out.println("Divided 3 : " + (10000.0 - 10000.0 * 0.3) * 0.2);

        }

}


[ec2-user@ip-10-1-10-131 MyApp]$ javac AccountingApp.java

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp
Value of supply : 10000.0
VAT : 1000.0
Total : 11000.0
Expense : 3000.0
Income : 7000.0
Divided 1 : 3500.0
Divided 2 : 2100.0
Divided 3 : 1400.0

물건값 만원만 경우에따라 바꿔주면 어떤 물건이던지 수익을 계산할 수 있는 프로그램이 완성이 된 것이다.

그러면 이 물건의 값을 일일히 손으로 넣지말고 변수를 활용해서 프로그램을 보완해보자.

[ec2-user@ip-10-1-10-131 MyApp]$ sudo vim AccountingApp.java
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 divided1 = income * 0.5;           
        double divided2 = income * 0.3;   
        double divided3 = 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("divided1 : " + divided1);
        System.out.println("divided2 : " + divided2);            
        System.out.println("divided3 : " + divided3);            
             
        }

}

[ec2-user@ip-10-1-10-131 MyApp]$ javac AccountingApp.java

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp
Value of supply : 10000.0
VAT : 1000.0
Total : 11000.0
expense : 3000.0
Income : 7000.0
divided1 : 3500.0
divided2 : 2100.0
divided3 : 1400.0

물건 공급가격등을 input 값으로 줘서 인풋값에 따라 결과가 다르게 나올 수 있도록 프로그램으로 보완해보자.

[ec2-user@ip-10-1-10-131 MyApp]$ sudo vim AccountingApp.java
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 divided1 = income * 0.5;           
        double divided2 = income * 0.3;   
        double divided3 = 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("divided1 : " + divided1);
        System.out.println("divided2 : " + divided2);            
        System.out.println("divided3 : " + divided3);            
             
        }

}

[ec2-user@ip-10-1-10-131 MyApp]$ javac AccountingApp.java

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "10000.0"
Value of supply : 10000.0
VAT : 1000.0
Total : 11000.0
expense : 3000.0
Income : 7000.0
divided1 : 3500.0
divided2 : 2100.0
divided3 : 1400.0
    
[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "33333.0"
Value of supply : 33333.0
VAT : 3333.3
Total : 36666.3
expense : 9999.9
Income : 23333.1
divided1 : 11666.55
divided2 : 6999.929999999999
divided3 : 4666.62

참고로 이렇게 자바를 실행한 것은 사전에 java를 리눅스에 설치를 했기 때문에 가능한데 만약에 어떤 컴퓨터에 자바 버츄얼머신이 설치 안되어 있는데 자바 파일을 실행하고 싶다면 launch4j 라는 솔루션을 이용해서 내가 짠 자바파일을 감싸고 그 솔루션 안에 자바 버츄얼머신이 있기 때문에 자바가 없어도 실행할 수 있도록 자바 실행파일을 만들어준다.

그러면 조건문을 이용해서 위에서 짠 프로그램을 좀더 개선해보자.

물건의 가격이 만원이하면 income을 첫번째 주주가 돈을 다 가져가고, 물건의 가격이 만원이 넘어가면 세명의 주주가 5:3:2로 가져가는 것을 계산하는 프로그램을 짜보자.

[ec2-user@ip-10-1-10-131 MyApp]$ sudo vim AccountingApp.java
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 divided1;
        double divided2;
        double divided3;  
            
        if(income > 10000.0){
            divided1 = income * 0.5;           
            divided2 = income * 0.3;   
            divided3 = income * 0.2;            
        } else {
            divided1 = income * 1.0;           
            divided2 = income * 0;   
            divided3 = 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("divided1 : " + divided1);
        System.out.println("divided2 : " + divided2);            
        System.out.println("divided3 : " + divided3);            
             
        }

}

[ec2-user@ip-10-1-10-131 MyApp]$ javac AccountingApp.java

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "5000.0"
Value of supply : 5000.0
VAT : 500.0
Total : 5500.0
expense : 1500.0
Income : 3500.0
divided1 : 3500.0
divided2 : 0.0
divided3 : 0.0
    
[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "50000.0"
Value of supply : 50000.0
VAT : 5000.0
Total : 55000.0
expense : 15000.0
Income : 35000.0
divided1 : 17500.0
divided2 : 10500.0
divided3 : 7000.0

그러면 세명 주주의 배당률을 배열을 이용해서 처리할 수 있도록 코드를 보완해보자.

일반적으로 변수를 쓸때없이 늘리는 것보다 가능하면 줄이는 것이 좋다.

(rate1 = 0.5, rate2 = 0.3, rate3 = 0.2 이런식으로 변수를 세개로 나누는 것보다 변수를 dividedRates라는 변수 하나에서 관리하도로고 수정하고자 한다.)

[ec2-user@ip-10-1-10-131 MyApp]$ sudo vim AccountingApp.java
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 divided1;
        double divided2;
        double divided3;
        
        // array of double type variables which have three datas
        double[] dividedRates = new double[3];
                    
        if(income > 10000.0){
            dividedRates[0] = 0.5;
            dividedRates[1] = 0.3;
            dividedRates[2] = 0.2;
            divided1 = income * dividedRates[0];           
            divided2 = income * dividedRates[1];   
            divided3 = income * dividedRates[2];            
        } else {
            dividedRates[0] = 1.0;
            dividedRates[1] = 0;
            dividedRates[2] = 0;
            divided1 = income * dividedRates[0];           
            divided2 = income * dividedRates[1];   
            divided3 = income * dividedRates[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("divided1 : " + divided1);
        System.out.println("divided2 : " + divided2);            
        System.out.println("divided3 : " + divided3);            
             
        }

}

[ec2-user@ip-10-1-10-131 MyApp]$ javac AccountingApp.java

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "5000.0"
Value of supply : 5000.0
VAT : 500.0
Total : 5500.0
expense : 1500.0
Income : 3500.0
divided1 : 3500.0
divided2 : 0.0
divided3 : 0.0
    
[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "50000.0"
Value of supply : 50000.0
VAT : 5000.0
Total : 55000.0
expense : 15000.0
Income : 35000.0
divided1 : 17500.0
divided2 : 10500.0
divided3 : 7000.0

배열과 반복문을 이용하여 아래와 같이 코드를 개선해보자.

[ec2-user@ip-10-1-10-131 MyApp]$ sudo vim AccountingApp.java
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;
        
        // array of double type variables which have three datas
        double[] dividedRates = new double[3];
            
        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);
            
        if(income > 10000.0){
            dividedRates[0] = 0.5;
            dividedRates[1] = 0.3;
            dividedRates[2] = 0.2;
            
            int i = 0;
            while(i < dividedRates.length) {
                System.out.println("divided"+ (i+1)  + " : " + (income * dividedRates[i]));
                i = i + 1;
            }          
        } else {
            dividedRates[0] = 1.0;
            dividedRates[1] = 0;
            dividedRates[2] = 0;
            
            int i = 0;
            while(i < dividedRates.length) {
                System.out.println("divided"+ (i+1)  + " : " + (income * dividedRates[i]));
                i = i + 1;
            }                       
        }
          
             
        }

}

[ec2-user@ip-10-1-10-131 MyApp]$ javac AccountingApp.java

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "5000.0"
Value of supply : 5000.0
VAT : 500.0
Total : 5500.0
expense : 1500.0
Income : 3500.0
divided1 : 3500.0
divided2 : 0.0
divided3 : 0.0
    
[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "50000.0"
Value of supply : 50000.0
VAT : 5000.0
Total : 55000.0
expense : 15000.0
Income : 35000.0
divided1 : 17500.0
divided2 : 10500.0
divided3 : 7000.0

메소드를 이용하여 위의 코드를 개선해보자.

메소드는 서로 연관된 코드를 grouping해서 이름을 붙인 정리정돈의 상자라고 할 수 있다.

[ec2-user@ip-10-1-10-131 MyApp]$ sudo vim AccountingApp.java
public class AccountingApp {
    
        // make global variable
        public static double valueOfSupply;   
        public static double vatRate;
        public static double expenseRate;

        public static void main(String[] args) {
            
            valueOfSupply = Double.parseDouble(args[0]);
            vatRate = 0.1;
            expenseRate = 0.3;
            print_basic_information();

            // array of double type variables which have three datas
            double[] dividedRates = new double[3];
            
            double income = getIncome();

            if(income > 10000.0){
                dividedRates[0] = 0.5;
                dividedRates[1] = 0.3;
                dividedRates[2] = 0.2;

                int i = 0;
                while(i < dividedRates.length) {
                    System.out.println("divided"+ (i+1)  + " : " + getDivided(dividedRates[i]));
                    i = i + 1;
                }          
            } else {
                dividedRates[0] = 1.0;
                dividedRates[1] = 0;
                dividedRates[2] = 0;

                int i = 0;
                while(i < dividedRates.length) {
                    System.out.println("divided"+ (i+1)  + " : " + getDivided(dividedRates[i]));
                    i = i + 1;
                }                       
            }
        
        }
            
        public static double getVET() {
            return valueOfSupply * vatRate;
        }
            
        public static double getTotal() {
            return valueOfSupply + getVET();
        }
            
        public static double getExpense() {
            return valueOfSupply * expenseRate;
        }
            
        public static double getIncome() {
            return valueOfSupply - getExpense();
        }
            
        public static double getDivided(double dividedRate) {
            return getIncome() * dividedRate;
        }
            
        public static void print_basic_information() {
            System.out.println("Value of supply : " + valueOfSupply);
            System.out.println("VAT : " + getVET());
            System.out.println("Total : " + getTotal());        
            System.out.println("expense : " + getExpense());
            System.out.println("Income : " + getIncome());
        }        

}

[ec2-user@ip-10-1-10-131 MyApp]$ javac AccountingApp.java

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "5000"
Value of supply : 5000.0
VAT : 500.0
Total : 5500.0
expense : 1500.0
Income : 3500.0
divided1 : 3500.0
divided2 : 0.0
divided3 : 0.0
    
[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "50000"
Value of supply : 50000.0
VAT : 5000.0
Total : 55000.0
expense : 15000.0
Income : 35000.0
divided1 : 17500.0
divided2 : 10500.0
divided3 : 7000.0

클래스를 이용해서 위의 코드를 개선해보자.

객체(클래스)는 서로 연관된 변수와 메소드를 grouping한 것이다. 그리고 거기에 이름을 붙인것이다.

위의 코드는 회계와 관련된 코드로만 되어있지만 소스중간에 회계가 아닌 다른 주제의 코드내용이 들어오게 된다면 클래스를 이용하면 유용하게 정리할 수 있다.

[ec2-user@ip-10-1-10-131 MyApp]$ sudo vim AccountingApp.java
class Accounting{

    public static double valueOfSupply;   
    public static double vatRate;
    public static double expenseRate;
    
    public static double getVET() {
        return valueOfSupply * vatRate;
    }
            
    public static double getTotal() {
        return valueOfSupply + getVET();
    }
            
    public static double getExpense() {
        return valueOfSupply * expenseRate;
    }
            
    public static double getIncome() {
        return valueOfSupply - getExpense();
    }
            
    public static double getDivided(double dividedRate) {
        return getIncome() * dividedRate;
    }
            
    public static void print_basic_information() {
        System.out.println("Value of supply : " + valueOfSupply);
        System.out.println("VAT : " + getVET());
        System.out.println("Total : " + getTotal());        
        System.out.println("expense : " + getExpense());
        System.out.println("Income : " + getIncome());
    }      
    
}

public class AccountingApp{

    public static void main(String[] args) {

        Accounting.valueOfSupply = Double.parseDouble(args[0]);
        Accounting.vatRate = 0.1;
        Accounting.expenseRate = 0.3;
        Accounting.print_basic_information();

        double[] dividedRates = new double[3];

        double income = Accounting.getIncome();

        if(income > 10000.0){
            dividedRates[0] = 0.5;
            dividedRates[1] = 0.3;
            dividedRates[2] = 0.2;

            int i = 0;
            while(i < dividedRates.length) {
                System.out.println("divided"+ (i+1)  + " : " + Accounting.getDivided(dividedRates[i]));
                i = i + 1;
            }          
        } else {
            dividedRates[0] = 1.0;
            dividedRates[1] = 0;
            dividedRates[2] = 0;

            int i = 0;
            while(i < dividedRates.length) {
                System.out.println("divided"+ (i+1)  + " : " + Accounting.getDivided(dividedRates[i]));
                i = i + 1;
            }                       
        }

    }
}

[ec2-user@ip-10-1-10-131 MyApp]$ javac AccountingApp.java

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "5000"
Value of supply : 5000.0
VAT : 500.0
Total : 5500.0
expense : 1500.0
Income : 3500.0
divided1 : 3500.0
divided2 : 0.0
divided3 : 0.0
    
[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "50000"
Value of supply : 50000.0
VAT : 5000.0
Total : 55000.0
expense : 15000.0
Income : 35000.0
divided1 : 17500.0
divided2 : 10500.0
divided3 : 7000.0

인스턴스를 이용해서 위의 코드를 개선해보자.

인스턴스는 하나의 클래스를 복제해서 서로다른 데이터의 값과 서로 같은 메소드를 가진 복제본을 만드는 것이다.

[ec2-user@ip-10-1-10-131 MyApp]$ sudo vim AccountingApp.java
class Accounting{
    
    public double valueOfSupply;   
    public double vatRate;
    public double expenseRate;
    
    // delete static
    
    public double getVET() {
        return valueOfSupply * vatRate;
    }
            
    public double getTotal() {
        return valueOfSupply + getVET();
    }
            
    public double getExpense() {
        return valueOfSupply * expenseRate;
    }
            
    public double getIncome() {
        return valueOfSupply - getExpense();
    }
            
    public double getDivided(double dividedRate) {
        return getIncome() * dividedRate;
    }
            
    public void print_basic_information() {
        System.out.println("Value of supply : " + valueOfSupply);
        System.out.println("VAT : " + getVET());
        System.out.println("Total : " + getTotal());        
        System.out.println("expense : " + getExpense());
        System.out.println("Income : " + getIncome());
    }      
    
}

public class AccountingApp{

    public static void main(String[] args) {

        // copy Accounting class(make instance)
        Accounting A1 = new Accounting();
        A1.valueOfSupply = Double.parseDouble(args[0]);
        A1.vatRate = 0.1;
        A1.expenseRate = 0.3;
        A1.print_basic_information();

        double[] dividedRates = new double[3];

        double income = A1.getIncome();

        if(income > 10000.0){
            dividedRates[0] = 0.5;
            dividedRates[1] = 0.3;
            dividedRates[2] = 0.2;

            int i = 0;
            while(i < dividedRates.length) {
                System.out.println("divided"+ (i+1)  + " : " + A1.getDivided(dividedRates[i]));
                i = i + 1;
            }          
        } else {
            dividedRates[0] = 1.0;
            dividedRates[1] = 0;
            dividedRates[2] = 0;

            int i = 0;
            while(i < dividedRates.length) {
                System.out.println("divided"+ (i+1)  + " : " + A1.getDivided(dividedRates[i]));
                i = i + 1;
            }                       
        }

        // copy Accounting class(make instance)
        Accounting A2 = new Accounting();
        A2.valueOfSupply = Double.parseDouble(args[1]);
        A2.vatRate = 0.1;
        A2.expenseRate = 0.3;
        A2.print_basic_information();

        dividedRates = new double[3];
        income = A2.getIncome();

        if(income > 10000.0){
            dividedRates[0] = 0.5;
            dividedRates[1] = 0.3;
            dividedRates[2] = 0.2;

            int i = 0;
            while(i < dividedRates.length) {
                System.out.println("divided"+ (i+1)  + " : " + A2.getDivided(dividedRates[i]));
                i = i + 1;
            }          
        } else {
            dividedRates[0] = 1.0;
            dividedRates[1] = 0;
            dividedRates[2] = 0;

            int i = 0;
            while(i < dividedRates.length) {
                System.out.println("divided"+ (i+1)  + " : " + A2.getDivided(dividedRates[i]));
                i = i + 1;
            }                       
        }

    }
    
}

[ec2-user@ip-10-1-10-131 MyApp]$ javac AccountingApp.java

[ec2-user@ip-10-1-10-131 MyApp]$ java AccountingApp "5000" "50000"
Value of supply : 5000.0
VAT : 500.0
Total : 5500.0
expense : 1500.0
Income : 3500.0
divided1 : 3500.0
divided2 : 0.0
divided3 : 0.0
Value of supply : 50000.0
VAT : 5000.0
Total : 55000.0
expense : 15000.0
Income : 35000.0
divided1 : 17500.0
divided2 : 10500.0
divided3 : 7000.0