메소드
Method
메소드(Method)는 서로 연관된 코드들을 그룹핑해서 이름을 붙힌 정리 정돈의 상자이다.
기존 예제.
public class AccountingMethodApp {
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 = 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);
}
}
예제가 복잡한 코드가 아니기 때문에 메소드를 적용하더라도 드라마틱한 결과를 얻지 못할 수도 있다.
위의 코드블럭에서 부가가치세를 나타내는 코드를 보자.
double vat = valueOfSupply * vatRate;
// 1억줄 이상의 코드이거나 1억개 이상의 사칙연산으로 이루어진 수식일 경우로 상상하자
그런데 이 코드가 한 줄이 아니라 1억줄 짜리 코드라고 생각해보자. 아니면 사칙연산이 1억개가 결합되어 있는 코드라고 상상해보자. 엄청나게 복잡한 수식이라고...
이럴 경우 복잡한 코드를
double vat = getVAT();
getVAT( ); 로 바꾼다면 얼마나 좋을까, 그리고 원래 getVAT( ); 자리에 있던 코드들은 숨겨논다면 우리의 App가 훨씬 더 단순해질 것이다.
먼저
double vat = valueOfSupply * vatRate;
valueOfSupply * vatRate; 를 블럭설정 후에 오른쪽 클릭,
Refactor 에서 Extrect Method... (단축키 Alt + Shift + M)
Extract Method 창에서,
Method name : getVAT
Access modifier : public
Replace 1 additional occurrence of statements with method - 해제
OK를 누르면,
eclipse가 자동으로 메소드를 만들어준다.
public class AccountingMethodApp {
public static void main(String[] args) {
double valueOfSupply = Double.parseDouble(args[0]);
double vatRate = 0.1;
double expenseRate = 0.3;
double vat = getVAT(valueOfSupply, vatRate);
double total = valueOfSupply + vat;
double expense = getVAT(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);
}
public static double getVAT(double valueOfSupply, double vatRate) {
return valueOfSupply*vatRate;
}
}
여기서 기억해야 할 것은
public static double getVAT(double valueOfSupply, double vatRate) {
return valueOfSupply*vatRate;
위의 코드는 메소드를 만드는 코드이다.
아래의 코드는 만들어진 메소드를 호출하는, 실행하는 코드이다.
double vat = getVAT(valueOfSupply, vatRate);
그리고 getVAT 괄호 안에 들어가는 값은 입력값이라서
입력값 10000.0으로 설정하면
valuesOfSupply = 10000.0, vatRate = 0.1로
double vat = getVAT(valueOfSupply, vatRate); 를 통해서
메소드의
public static double getVAT(double valueOfSupply, double vatRate) {
return valueOfSupply * vatRate;
}
의 값이 된다.
그래서 10000.0 과 0.1 의 값이 return 이 되면서 위 코드의 double vat 변수값이 1000원이 되는 것이다.
부가가치세를 구하는 코드가 1억줄이었다면 코드 한 줄로 숨긴 것이다.
더욱 깔끔하게 하기 위해 getVAT 괄호 안의 입력값을 없애보자.
public class AccountingMethodApp {
public static void main(String[] args) {
double valueOfSupply = Double.parseDouble(args[0]);
double vatRate = 0.1;
double expenseRate = 0.3;
double vat = getVAT();
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);
}
public static double getVAT() {
return valueOfSupply*vatRate;
}
}
이렇게 하면 valueOfSupply 와 vatRate에 빨간색 밑줄이 생긴다.
valueOfSupply는 현재 어디에서 선언 되었나?
main 메소드의 중괄호 안에서 선언 되었다. main 메소드 지역 안에서만 사용될 수 있는 지역의 변수(Local variable)에 선언되었다.
어떻게 해야 하는가?
valueOfSupply 와 vatRate를 AccountingMethodApp 클래스의 전역변수로 지정해서 모든 메소드에서 접근할 수 있도록 해야 한다. (JAVA에서는 전역변수를 Field 라고 한다.)
valueOfSupply와 vatRate를 전역변수로 바꿔보자.
valueOfSupply와 vatRate 위에서 오른쪽 클릭, Refactor > Convert Local Variable to Field...
public class AccountingMethodApp {
public static double valueOfSupply;
public static double vatRate;
public static void main(String[] args) {
valueOfSupply = Double.parseDouble(args[0]);
vatRate = 0.1;
double expenseRate = 0.3;
double vat = getVAT();
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);
}
public static double getVAT() {
return valueOfSupply*vatRate;
}
}
변수의 선언은 바깥 쪽에서 하고 그 변수의 값은 main 메소드 안에서 세팅했다.
total 에 대한 코드가 1억줄이라고 가정하고 위의 과정과 같이 메소드화 시키자.
double total = valueOfSupply + vat;
메소드화 시키면
double total = getTotal(vat);
여기서 입력값 vat를 제거해보자면
public class AccountingMethodApp {
public static double valueOfSupply;
public static double vatRate;
public static void main(String[] args) {
valueOfSupply = Double.parseDouble(args[0]);
vatRate = 0.1;
double expenseRate = 0.3;
double vat = getVAT();
double total = getTotal();
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);
}
public static double getTotal() {
return valueOfSupply + vat;
}
public static double getVAT() {
return valueOfSupply*vatRate;
}
}
vat에 빨간색 밑줄이 생긴다.
그럼 위의 예제와 같이 vat가 지역변수(Local variable) 이기 때문에 전역변수(Field)로 Convert 해야 한다.
그러나 그렇게 하지 않고 메소드를 만든 코드에서 vat 지역 변수 대신에 getVAT( );를 호출하는 것으로 동일한 목적을 달성할 수 있다.
public static double getTotal() {
return valueOfSupply + getVAT();
}
다음의 코드들도 마찬가지로 메소드화 시켜보자.
expense 메소드화 후에( getExpense ) expenseRate 지역변수를 전역변수로 Convert
income 메소드화 후에( getIncome ) 메소드를 만든 코드에서 expense 변수 대신에 getExpense( ); 메소드를 호출
dividend 1,2,3 메소드화 후에 ( getDividend1,2,3 ) income 변수 대신에 getIncome( ); 메소드를 호출
나머지 코드를 print로 메소드화
print 메소드를 만든 코드에서 valueOfSupply 는 전역변수라 사용가능하기 때문에 유지하고
나머지 각각의 변수값을 메소드값으로 변경하기
vat > getVAT( )
total > getTotal( )
expense > getExpense( )
income > getIncome( )
Dividend1,2,3 > getDividend1,2,3( )
이제 수익을 얻고 싶다면 getIncome( ); 메소드를 호출하는 것을 통해서 언제든지 값을 얻을 수 있게 됐다.
(70000.0 입력.)
public class AccountingMethodApp {
public static double valueOfSupply;
public static double vatRate;
public static double expenseRate;
public static void main(String[] args) {
valueOfSupply = 70000.0;
vatRate = 0.1;
expenseRate = 0.3;
print();
getIncome();
}
public static void print() {
System.out.println("Value of supply : "+valueOfSupply);
System.out.println("VAT : "+getIncome());
System.out.println("Total : "+getTotal());
System.out.println("Expense : "+getExpense());
System.out.println("Income : "+getIncome());
System.out.println("Dividend 1 : "+getDividend1());
System.out.println("Dividend 2 : "+getDividend2());
System.out.println("Dividend 3 : "+getDividend3());
}
public static double getDividend1() {
return getIncome()*0.5;
}
public static double getDividend2() {
return getIncome()*0.3;
}
public static double getDividend3() {
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;
}
}
이전의 코드보다 사용하는 측면에서 더 단정한 코드가 되었다.
'youtube.com|user|egoing2 > JAVA1' 카테고리의 다른 글
JAVA1 - 16.2 나의 앱 만들기 (클래스) (1) | 2022.01.25 |
---|---|
JAVA1 - 15.3 나의 앱 만들기 (반복문) (4) | 2022.01.24 |
JAVA1 - 15.2 나의 앱 만들기 (배열) (2) | 2022.01.23 |
JAVA1 - 15.1 나의 앱 만들기 (조건문) (2) | 2022.01.22 |
JAVA1 - 14.3 나의 앱 만들기 (입력값 도입) (2) | 2022.01.22 |