본문 바로가기

생활코딩/JAVA1

생활코딩) JAVA - 14.9. 나의 앱 만들기 - 메소드

https://youtu.be/XXFaCUcwWIk

 

3번 시간에는 메쏘드 라고 하는 굉장히 중요한 주제를 우리의 프로젝트에 도입해보는 모습을 구경시켜 드리겠습니다. 미리 말씀드리지만 엄청 어려워요. 그리고 이거는 충분히 시간에 들여서 스터디를 해야 되는 것이기 때문에 문법이 이해가지 않을 수 있습니다 하지만 중요한 컨셉만 이해하시면 돼요. 메쏘드는 서로 연관된 코드를 그룹핑 해서 이름을 붙인 정리정돈의 상자다. 

자 살펴봅시다 자 메소드는 AccountingApp.java를 복사해서 저기에서 작업을 할 겁니다. 여러분이 조건문 반복문 배열 몰라도 메쏘드 공부하는 데 아무 지장이 없거든요. 자 그런데 지금 우리의 코드가 복잡한 코드가 아니라서 메소드를 도입하는 게 별로 드라마틱하지 않을 수 있어요.  그래서 여러분이 상상력을 저한테 빌려주셔야 됩니다.

자 여기 보시면 vat 즉 부가가치세를 계산하는 방법이 이렇게 나와 있습니다. 자 그런데 여기 있는 이 코드가 뭐 한 줄짜리 코든데 저게 한 줄이 아니라 1억 줄짜리 코드 라고 생각해보세요. 아니면 곱하기 더하기 나누기 뭐 이런게 이렇게 감아 결합되어 있는 엄청나게 복잡한 수식이라고 상상해 보시라는 말이에요. 그런 상황에서 여러분이 여기 있는 이 코드를

 


이렇게 생긴 코드로(getVAT) 바꿀 수 있다면 얼마나 좋을까요. 그리고 저 들어갈 요기 있었던 이 코드는 다른 곳에다가 숨겨놓는다면 
우리의 애플리케이션이 훨씬 더 단순해 지지 않을까요. 자 그걸 하는 방법을 앱 설명 드릴 것이고 그것이 바로 메소드입니다. 자 이렇게 제가 요 두개의 곱하기를 내려 만큼의 제가 이렇게 블럭 설정을 했거든요. 그리고 오른쪽 클릭을 하면 Refactor라는 것이 있습니다. 그중에서 Extract Method 라고 하는 것을 클릭하면 단축키는 이래요. 자 제가 만들려는 메소드의 이름을 이클립스가 물어보죠 저는 getVAT 라고 하고요. 그리고 밑에 있는 요건은 체크를 해제하겠습니다 자 그리고 ok 를

 

getVAT(valueofSupply, vatRate);


누르면 요렇게 생긴 화면이 뜨구요. 이클립스가 자동으로 메소드를 만들어 준 것입니다. 자 여기에서 기억하셔야 할 것은 이 부분은 메소드를 만드는 코드에요. 

	private static double getVAT(double valueofSupply, double vatRate) {
		return valueofSupply*vatRate;


이 부분은 만들어진 메소드를 호출하는 실행하는 코드입니다.

		double vat = getVAT(valueofSupply, vatRate);


자 그리고 이 괄호 안에 들어가는 값은 입력 값이 라서 ValueOfSupply를 제가 만원으로 이렇게 하고 vatRate는 0.1이죠. 그러면 만원 이라고 하는 값이 여기를 통해서 메소드의 ValueOfSupply의 값이 됩니다. 만약에 애가 v였다면 이 중괄호 안에서 v 의 값은 만원이 되는 거예요. 자 되돌리겠습니다. 여기도 마찬가지 vr 이었다면 이 중괄호 안에서 vr 은 0.1이 되는 것입니다. 자 그렇게 해서 만원 곱하기 0.1 를 곱하면 1000원이죠. 1000원 앞에 Return이 있으면 여기 있는 getVAT 의 값은 1000원이 되면서 여기 vat 라는 변수의 값이 천 원이 되는 겁니다. 부가가치세를 계산하는 저 코드가 만약에 1억 줄이었다. 그러면 1억 줄을 우리는 어떻게 한 거예요. 여기에서 숨긴 겁니다 어디 어 저기 어딘가에다가 훨씬 더 단정한 코드가 된 것을 느끼실 수 있으면 좋겠습니다. 구체적인 법들은 몰라도 괜찮아요. 더블이 뭐고, 퍼블릭이 뭔지.

자 그렇구요 그 다음에 이제 전 getVAT라는걸 할 때 ValueOfSupply와 vatRate 라는 저 입력 값을 좀 보기 싫어서 안 보이게 이렇게 깔끔하게 하고 싶어요. 그러면 여기도 없어져야겠죠. 이렇게 되면 에러가 납니다. 제가 예상한 것은 ValueOfSupply는 여기 있으니까 저걸 쓰면 좋겠는데 그렇게는 안됩니다 왜냐하면. ValueOfSupply는 현재 어디에서 선언 됐나요. Main 메소드의 중괄호 안에서 선언 됐습니다. 그렇기 때문에 Main 메쏘드 안에서만 사용할 수 있는 저 지역의 변수, 지역변수 lical variable 입니다. 

이럼 어떻게 해야되냐. ValueOfSupply와 vatRate를 Accounting Method의 이 클래스의 전역변수로 지정해서 모든 메소드에서 접근할 수 있도록 해야 됩니다. 자 그걸 하는 방법은 요걸 ( double valueofSupply = 10000.0;)컷 해서 이 바깥쪽에서 이렇게 선언하는 거예요.

 

public class AccountingMethodApp {
	public static double valueofSupply = 10000.0;
	public static void main(String[] args) {
	
		double vatRate = 0.1;
		double expenseRate = 0.3;
		double vat = getVAT(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: "+ Dividend1);
		System.out.println("Dividend: "+ Dividend2);
		System.out.println("Dividend: "+ Dividend3);



	}

	private static double getVAT(double valueofSupply, double vatRate) {
		return valueofSupply*vatRate;
	}

}


그리고 public static , double 요 두가지는 뭔지 몰라도 돼요. 그럼 어쨌든 간에 메인 바깥쪽에서 선언 됐기 때문에, 이 Main 안에서도 ValueOfSupply에 접근할 수 있구요. 이렇게 vat 안에서도 접근할 수 있게 되는 것입니다.

자 그리고 여기있는 vat rate 도 우리 전역변수 로 바꿔 볼까요. 자바에서는 전역변수를 필드라고 합니다. Refactor에 들어 가면 여기에 다시 Refactor로 가면 Convert Local Variable to Field로 바꾼다 라고 되어 있죠. 자 그렇게 해서 퍼블릭 을 선택하고 엔터를 치면 보시는 것처럼 이렇게 코드가 바뀌는 것을 볼 수가 있습니다. 그런데 이렇게 하는게 좀 더 좋을 것 같네요 음

 

public class AccountingMethodApp {
	public static double valueofSupply;
	public static double vatRate;
	public static void main(String[] args) {
		
		valueofSupply = 10000.0;
		vatRate = 0.1;
		double expenseRate = 0.3;
		double vat = getVAT(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: "+ Dividend1);
		System.out.println("Dividend: "+ Dividend2);
		System.out.println("Dividend: "+ Dividend3);



	}

	private static double getVAT(double valueofSupply, double vatRate) {
		return valueofSupply*vatRate;
	}

}


이렇게 변수의 선언은 바깥쪽에서 하고 그 변수의 값은 Main 안에서 저희가 세팅을 이렇게 했습니다. 자 그럼 여기 Total에 대한 합계를 구하는 코드가 있는데 저게 1억 줄이다. 그걸 메소드화 시켜 볼까요. 자 메소드의 단축키를 이제부터 저는 쓰겠습니다. Refactor. 그리고 ok 버튼을 누르면 보시는 것처럼 getTotal 이라는 메소드가 이렇게 생성이 됐구요. 그리고 그 여기 있네요 getTotal 그리고 저는 이게 Total에 vat 요것도 보기 싫어. 그 다음에 여기 vat 는지역 변수가 되요. 그럼 예를 전역변수로 만들 수도 있지만 그렇게 하지 않고 그냥 getVAT를 호출하는 걸로 똑같은 목적을 달성할 수도 있습니다.
.

.

.

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;
		double vat = getVAT();
		double total = getTotal();
		double expense = getExpense();
		double income = getIncome();
		double Dividend1 = getDividend1();
		double Dividend2 = getDividend2();
		double Dividend3 = getDividend3();

		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: "+ Dividend1);
		System.out.println("Dividend: "+ Dividend2);
		System.out.println("Dividend: "+ Dividend3);



	}
	private static double getDividend3() {
		return getIncome() * 0.2;
	}
	
	private static double getDividend2() {
		return getIncome() * 0.3;
	}
	
	private static double getDividend1() {
		return getIncome() * 0.5;
	}

	private static double getIncome() {
		return valueofSupply - getExpense();
	}

	private static double getExpense() {
		return valueofSupply*expenseRate;
	}

	private static double getTotal() {
		return valueofSupply + getVAT();
	}

	private static double getVAT() {
		return valueofSupply*vatRate;
	}

}


자 그 다음에 이제 여기 프린트를 하는 요 코드도 저는print 란 이름으로 한번에 바꿔 버리겠습니다. 조렇게 선택하고 자 Extract Method를 통해서 print 라는 이름으로 바꾸겠습니다. ok 버튼을 누르면 보시는 것처럼 프린트 라는 메소드로 변형이 됐고 요렇게 됩니다. 자 이 때 저는 이렇게 보기 싫게 입력 값을 주지 않고 싶어요. 요렇게 처리 했고요. 그럼 여기 ValueOfSupply는 뭐 전역변수니까 사용할 수 있을 것이고 얘는 getVAT(), getTotal(), getExpense(), getIncome(), getDividend1() 이렇게 바꾸면 이전과 똑같이 동작하는 코드가 만들어진 거죠.

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();
	}
	
	private 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: "+ getDividend1());
		System.out.println("Dividend: "+ getDividend2());
		System.out.println("Dividend: "+ getDividend3());
	}
	private static double getDividend3() {
		return getIncome() * 0.2;
	}
	
	private static double getDividend2() {
		return getIncome() * 0.3;
	}
	
	private static double getDividend1() {
		return getIncome() * 0.5;
	}

	private static double getIncome() {
		return valueofSupply - getExpense();
	}

	private static double getExpense() {
		return valueofSupply*expenseRate;
	}

	private static double getTotal() {
		return valueofSupply + getVAT();
	}

	private static double getVAT() {
		return valueofSupply*vatRate;
	}

}


자 위에 있는 것들은 더 이상 필요 없으니까 이렇게 지워버리면 됩니다.  그럼 이제부터 여러분이 만약에 Income이 필요하다 그러면 getIncome이라고 하는 메소드를 호출하는 것을 통해서 수익을 언제든지 가져올 수 있게 되는 것이죠. 자 어때요 우리가 메소드를 도입하는 것을 통해서 이전 코드 보다 훨씬 더 사용하는 쪽에서 단정한 코드를 만들 수 있게 되었다 라는 것이 느껴지시나요.

자 그러면 그래서 마무리하기 전에 한번만 더 얘기합시다. 자 첫번째 메소드문법 몰라도 돼요. 지금 제가 했던 얘기의 80%는 이해가 안갈 겁니다. 나중에 차차 로 배워야 돼요. 두번째로는 메쏘드는 서로 연관된 코드를 모아서 다시 말해서 그룹핑 해서 이름을 붙인 정리정돈의 상자다. 

 

 


------

* 유튜브 강의에서 자막을 추출해 정리했습니다.

-----

 

 

 

* 메소드는 서로 연관된 코드를 그룹핑해서 이름을 붙인 정리정돈의 상자이다. 많은 데이터를 보기 간결하게 처리하기 위해 필요하다.

* 메소드화 방법: Extract Method로 변수를 메소드로 만들고, 입력값을 제거(긴 코드라 뵈기 싫으므로). 지역변수가 포함된 경우에는 전역변수로 만들어준다.(Convert Local Variable to Field)

반응형