JAVA1 - 16.1 나의 앱 만들기 (메소드)

2022. 1. 24. 19:19·youtube.com|user|egoing2/JAVA1
728x90


메소드
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
'youtube.com|user|egoing2/JAVA1' 카테고리의 다른 글
  • JAVA1 - 16.2 나의 앱 만들기 (클래스)
  • JAVA1 - 15.3 나의 앱 만들기 (반복문)
  • JAVA1 - 15.2 나의 앱 만들기 (배열)
  • JAVA1 - 15.1 나의 앱 만들기 (조건문)
ro117youshin
ro117youshin
코딩 / 외국어공부 (영어, 중국어) / 독서 등 자기계발을 기록합니다.
  • ro117youshin
    Taking an extra step
    ro117youshin
  • 전체
    오늘
    어제
    • 분류 전체보기 (153)
      • DDD (5)
      • JAVA (13)
      • Spring Boot (2)
      • Spring (4)
      • MySQL (1)
      • C (1)
      • Algorithm & Data Structure (34)
        • study (15)
        • programmers (0)
        • boj (18)
        • assignments (1)
      • CS: Computer Science (6)
        • CS50 2019 (4)
        • Network (2)
        • Database (0)
      • Git (3)
      • foreign language (16)
        • English (0)
        • Chinese (16)
      • BOOK (2)
      • ETC (2)
      • youtube.com|user|egoing2 (64)
        • WEB1 - HTML & Internet (5)
        • WEB2 - CSS (9)
        • WEB2 - JavaScript (18)
        • JavaScript Immutability (0)
        • DATABASE1 (4)
        • DATABASE2 MySQL (12)
        • JAVA1 (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    variable
    baekjoon
    알고리즘문제
    나의 앱 만들기
    JAVA1
    HSK6급모의고사
    DATABASE2
    중국어공부
    mysql
    HTML
    생활코딩
    HSK6급공부
    Domain Driven Design
    HSK6급필수어휘
    Java자료구조
    js
    최범균
    개발공부
    HSK6급
    도메인 주도 설계
    css
    백준
    조건문
    Java
    javascript
    자바
    객체
    BOJ
    ddd
    코딩공부
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
ro117youshin
JAVA1 - 16.1 나의 앱 만들기 (메소드)
상단으로

티스토리툴바