본문 바로가기
입문/생활코딩

JAVA - method

by 코디드 2022. 12. 8.

<method 함수>

 

복잡한 것을 정리해서 다시 단순하게 만드는 도구

연관된 코드를 모아서 그룹핑하고 이름을 붙인것

 

 

<익숙한 method>

public class FirstMethod {

	public static void main(String[] args) {
		System.out.println("Hello Method");
                System.out.println(Math.floor(1.1));
	}
}

println은 입력값을 모니터에 출력해주는 method

math 라는 class 안에 소속되어있는 floor()는 입력값을 받아 내림해서 출력해주는 method

main 이라는 이름의 method

java 앱을 만들때는 class를 만들고 그것을 실행시킬때는 main이라는 method를 사용함 

 

 

<Method의 기본 형식>

public class WhyMethod {

	public static void main(String[] args) {
    
		// 코드 100000000줄
		System.out.println("-");
		System.out.println("A");
		System.out.println("A");
		// 100000000
		System.out.println("-");
		System.out.println("A");
		System.out.println("A");
	}
}

원래 이렇게 1억줄을 써야되는 코드인데

public class WhyMethod {
	public static void printTwoTimesA() {
		System.out.println("-");
		System.out.println("A");
		System.out.println("A");

이렇게 method를 정의를 해주면

public class WhyMethod {
	public static void printTwoTimesA() {
		System.out.println("-");
		System.out.println("A");
		System.out.println("A");
	}
	public static void main(String[] args) {
		// 코드 100000000줄
		printTwoTimesA();
		// 코드 100000000줄
		printTwoTimesA();
		// 100000000
		printTwoTimesA();
	}
}

이렇게 간단하게 정리할 수 있다

public class WhyMethod {

	public static void main(String[] args) {

		// 코드 100000000줄
		System.out.println("-");
		System.out.println("A");
		System.out.println("A");;
		// 코드 100000000줄
		System.out.println("-");
		System.out.println("A");
		System.out.println("A");
		// 100000000
		System.out.println("-");
		System.out.println("A");
		System.out.println("A");
	}
}

더 빠르게 하려면 이 상태에서 반복되는 코드를 refactor>extract Method (Alt+Shift+M) 를 통해

public class WhyMethod {

	public static void main(String[] args) {

		// 코드 100000000줄
		printTwoTimesA();
		// 코드 100000000줄
		printTwoTimesA();
		// 코드 100000000줄
		printTwoTimesA();
	}

	public static void printTwoTimesA() {
		System.out.println("-");
		System.out.println("A");
		System.out.println("A");
	}
}

이렇게 똑같은 결과를 만들어줄 수 있다


<Method의 입력값>

public class WhyMethod {
	
	public static void main(String[] args) {

		// 코드 100000000줄
		printTwoTimesA();
		// 코드 100000000줄
		printTwoTimesA();
		// 코드 100000000줄
		printTwoTimesA();
		printTwoTimesB();

	}
	
	public static void printTwoTimesA() {
		System.out.println("-");
		System.out.println("a");
		System.out.println("a");
	}
	public static void printTwoTimesB() {
		System.out.println("-");
		System.out.println("b");
		System.out.println("b");
	}
}

이렇게 비효율적으로 하려면 시간이 많이 드니

 

public class WhyMethod {
	
	public static void main(String[] args) {

		// 코드 100000000줄
		printTwoTimes("A");
		// 코드 100000000줄
		printTwoTimes("a");
		// 코드 100000000줄
		printTwoTimes("a");
		printTwoTimes("b");
	}
	public static void printTwoTimes(String text) {
		System.out.println("-");
		System.out.println(text);
		System.out.println(text);
	}
	
}

아예 method 를 만들때 data type이 문자열(String)이고 text 라는 변수값이 들어가면 된다고 정의하면 훨씬 간편한 코드를 짤수 있다

 

public class WhyMethod {
	
	public static void main(String[] args) {

		              //인자(arguments) e.g.)"a", "b", "-"
		printTwoTimes("a","-");
		// 코드 100000000줄
		printTwoTimes("a","*");
		// 코드 100000000줄
		printTwoTimes("a","&");
		printTwoTimes("b","!");
	}
	                                //매개변수(parameter) e.g.)text, delimiter
	public static void printTwoTimes(String text, String delimiter) {
		System.out.println(delimiter);
		System.out.println(text);
		System.out.println(text);
	}

}

이렇게 하면 구분자(delimiter) 도 동시에 처리 가능

 

*매개변수(parameter): method를 밖에서 주입한 것을 method 안으로 보내주는 매개자 e.g.)text, delimiter

*인자(arguments): 함수 안으로 넣은 구체적인 값 e.g.)"a", "b", "-"

 

 

<method의 출력>

public class OutputMethod {

	public static String a() {
		//...
		return "a";
	}
	public static int one() {
		//...
		return 1;
	}
	public static void main(String[] args) {
		
		System.out.println(a());
		System.out.println(one());
	}

}

1. method의 return 값 뒤에 있는 값이 실행결과다.

2. return 값은 method를 종료시킨다.

3. return 값의 data type 이 뭔지 정의해줘야 한다. *void-리턴 값이 없음

 

public class WhyMethod {
	
	public static void main(String[] args) {
				
		              //인자, argument
		printTwoTimes("a","-");
		System.out.println(twoTimes("a", "-"));
		// 코드 100000000줄
		printTwoTimes("a","*");
		// 코드 100000000줄
		printTwoTimes("a","&");
		printTwoTimes("b","!");

	}
	public static String twotimes(String text, String delimiter) {
		String out = "";
		out = out + delimiter + "\n";
		out = out + text + "\n";
		return out;
	}
	                                 //매개변수, parameter
	public static void printTwoTimes(String text, String delimiter) {
		System.out.println(delimiter);
		System.out.println(text);
		System.out.println(text);
	}

}

여기에서

public class WhyMethod {
	
	public static void main(String[] args) {
				
		printTwoTimes("a","-");
		System.out.println(twoTimes("a", "-"));

이 두개는 같은 코드지만

밑에는 출력 기능을 빼고 return 값을 갖기 때문에 아래 예시와 같이 여러곳에서 사용 가능하다

import java.io.FileWriter;
import java.io.IOException;

public class WhyMethod {
	
	public static void main(String[] args) throws IOException {
				
		System.out.println(twoTimes("a", "-"));
		FileWriter fw = new FileWriter("out.txt");
		fw.write(twoTimes("a","*"));
		fw.close();
//		Email.send("eoging@a.com", "two times a", "twotimes("a", "&")); 
//      위는 이메일을 보내는 코드가 있다고 가정할때

	}
	public static String twoTimes(String text, String delimiter) {
		String out = "";
		out = out + delimiter + "\n";
		out = out + text + "\n";
		out = out + text + "\n";
		return out;
	}

}

 

 

<method의 활용>

public class AccountingApp {

	public static void main(String[] args) {
		//공급가액
		double valueOfSupply = 10000.0;
		
		//부가가치세율
		double vatRate = 0.1;
		//부가세
		double vat = valueOfSupply*vatRate;
		//합계
		double total = valueOfSupply + vat;
		
		System.out.println("Value of supply : "+valueOfSupply);
		System.out.println("VAT : "+vat);
		System.out.println("Total : "+total);
	}

}

예시 double vat = valueOfSupply*vatRate; 라는 코드는 간단하지만, 이 코드가 1억 줄이라고 가정을 하면 너무 복잡함.

그리고 이것이 1억군데서 쓰이고 있는데 버그가 생긴다면 쓰이고 있는 부분마다 가서 일일이 수정을 해야됨.

 

이 코드를 method로 지정해주면 어떤 코드인지 명확하게 알려주고 일처리를 쉽고 빠르게 할수 있음.

 

		//부가세
		double vat = valueOfSupply*vatRate;
//		double vat = getVAT();
		
		//합계
		double total = valueOfSupply + vat;
//		double total = getTotal();

이렇게 정의하려고 함

 

public class AccountingApp {
	
	public static void getVAT() {
		return valueOfSupply*vatRate;
	}
	public static void getTotal() {
		return valueOfSupply + vat;
	}

	public static void main(String[] args) {

getVAT()와 getTotal()을 정의해주고

 

public class AccountingApp {
	//공급가액
	public static double valueOfSupply = 10000.0;
	
	//부가가치세율
	public static double vatRate = 0.1;
	
	public static double getVAT() {
		return valueOfSupply*vatRate;
	}
	public static double getTotal() {
		return valueOfSupply + getVAT();
	}

	public static void main(String[] args) {

getVAT()와 getTotal()앞에 있던 void를 double 로 바꿔주면서 출력값의 data type이 double 형임을 알려줌

 

main 안에 있던 지역변수 valueOfSupply 와 vatRate 를 AccountingApp과 main 사이로 가져와 앱 전체에서 쓰일수 있도록 하고 public static을 붙여줌

 

vat를 getVAT()로 바꿔줌

 

public class AccountingApp {
	//공급가액
	public static double valueOfSupply = 10000.0;
	
	//부가가치세율
	public static double vatRate = 0.1;
	
	public static double getVAT() {
		return valueOfSupply*vatRate;
	}
	public static double getTotal() {
		return valueOfSupply + getVAT();
	}

	public static void main(String[] args) {

		//부가세
//		double vat = valueOfSupply*vatRate;
  	        double vat = getVAT();
		
		//합계
//		double total = valueOfSupply + vat;
                double total = getTotal();
		
		System.out.println("Value of supply : "+valueOfSupply);
		System.out.println("VAT : "+vat);
		System.out.println("Total : "+total);
	}

}

이런 결과가 나오고 최종적으로 더 이상 필요없는 부분까지 지워주면

 

public class AccountingApp {
	
	public static double valueOfSupply = 10000.0;
	public static double vatRate = 0.1;
	
	public static double getVAT() {
		return valueOfSupply*vatRate;
	}
	public static double getTotal() {
		return valueOfSupply + getVAT();
	}

	public static void main(String[] args) {

		System.out.println("Value of supply : "+valueOfSupply);
		System.out.println("VAT : "+getVAT());
		System.out.println("Total : "+getTotal());
	}

}

이렇게 나옴.

method를 이용하면

1. 코드의 가독성을 획기적으로 높일수 있고

2. 한번 작성한 코드를 method로 호출하면 되기 때문에 재사용할수 있고

3. 본문에 있는 method를 수정하면 앱 내의 모든 곳에 동시에 적용이 됨

 

'입문 > 생활코딩' 카테고리의 다른 글

JAVA - 제어문  (0) 2022.12.07
JAVA  (0) 2022.11.27
WEB1-HTML & Internet  (0) 2022.11.23