메소드
는 다른 컴퓨터 언어에서는 함수(function)
이라고 부르는 것이다.
메소드는 정리정돈의 도구이다!
서로 연관된 코드를 모아서 그룹핑하고 이름을 붙이면 메소드이다.
복잡한 소스코드도 깔끔하게 정리할 수 있다.
floor
도 메소드이고,
println
도 메소드이다.
그리고.. main
도 메소드다!
즉, 자바는 클래스를 만들고, 클래스를 실행시키기 위해서는 반드시 약속된 이름의 main 메소드를 정의해 놓으면, 자바는 클래스 실행 시 main을 실행하도록 약속되어있다.
public class WhyMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("-");
System.out.println("B");
System.out.println("B");
System.out.println("-");
System.out.println("B");
System.out.println("B");
}
}
코드와 코드 사이에 1억줄의 소스코드가 있는데, 이 중 "B"를 "A"로
바꿔야 한다고 생각해보자.
너무 번거롭고 1억줄이 있다면, 찾기도 어려울 것이다.
여기서, 메소드
가 우리를 살려준다.
연관된 코드를 그룹핑해서 이름을 붙일 것이다.
public class WhyMethod {
public static void printTwoTimesA() { //메소드
System.out.println("-");
System.out.println("A");
System.out.println("A");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
printTwoTimesA();
System.out.println("-");
System.out.println("A");
System.out.println("A");
System.out.println("-");
System.out.println("A");
System.out.println("A");
}
}
결과는 똑같으나, 코드는 훨씬 간단해졌다.
여기서, 이전에 배웠던 Shift+Alt+M
을 누르면 이클립스가 알아서 메소드로 만들어준다.
만약, A가 아니라 B를 출력하고 싶다면 위의 메소드를 어떻게 수정해야할까?
public class WhyMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
printTwoTimes("a");
printTwoTimes("a");
printTwoTimes("a");
printTwoTimes("b");
}
public static void printTwoTimes(String text) {
System.out.println("-");
System.out.println(text);
System.out.println(text);
}
}
실행결과는 이렇다.
여기서, -
가 아니라 구분자를 다른 것으로 변경하고 싶을때는 어떻게 해야 할까?
public class WhyMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
printTwoTimes("a","-");
printTwoTimes("a","*");
printTwoTimes("a","&");
printTwoTimes("b","!");
}
public static void printTwoTimes(String text,String delimiter) {
System.out.println(delimiter);
System.out.println(text);
System.out.println(text);
}
}
main이란 메소드 뒤의 (String[] args)
에 대해 알아보자.
String[]
은 문자열 배열
이고, args
는 main이라는 메소드를 자바가 실행해줄 때 입력값
을 뜻한다.
즉, 사용자가 실행할 때 주입해준 변수를 메소드 안에서 사용할 수 있게 되는 것이다.
public static void printTwoTimes(String text,String delimiter)
여기서 text, delimiter와 같은 변수를 매개변수(parameter)
라 부른다.
printTwoTimes("a","-");
여기서 "a"와 같은 실제 값을 인자(argument)
라고 한다.
System.out.println();
화면에 출력하고 싶을 땐 println
을 사용하면 된다
Email.send("hopang016@naver.com","Math floor",Math.floor(1.1));
만약, 이메일로 Math floor라는 제목과, 실행결과를 내용으로 담고 싶다면
(실제로는 없는 메소드) 아래와 같이 하면 된다.
하지만 우리가 이전에 작성했던 printTwoTimes
메소드를 살펴보자.
메소드 안에는 println 구문까지 들어있어 파일이나 다른곳에 출력할 수 없다.
import java.io.FileWriter;
import java.io.IOException;
public class WhyMethod {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
printTwoTimes("a","-");
printTwoTimes("a","*");
printTwoTimes("a","&");
printTwoTimes("b","!");
}
public static void printTwoTimes(String text,String delimiter) {
System.out.println(delimiter);
System.out.println(text);
System.out.println(text);
}
public static void writeFileTwoTimes(String text,String delimiter) throws IOException{
FileWriter fWriter=new FileWriter("output.txt");
fWriter.write(delimiter+"\n");
fWriter.write(text+"\n");
fWriter.write(text+"\n");
fWriter.close();
}
}
이렇게 따로 메소드를 작성해줘야하는 번거로움이 생긴다.
그러므로 메소드의 return값을 값이 되도록 해보자.
public class OutputMethod {
public static String a() {
//..
return "a";
}
public static int one() {
return 1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(a());
System.out.println(one());
}
}
return 값 뒤의 값이 메소드의 실행 결과가 된다.
또한 return
은 메소드를 종료시키는 코드이기도 하다.
return값의 데이터 타입도 꼭 지정해줘야한다.
void
는 return값이 없는 것이다.
이전 WhyMethod.java를 개선해보자.
import java.io.FileWriter;
import java.io.IOException;
public class WhyMethod {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
System.out.println(twoTimes("a", "-"));
FileWriter fw=new FileWriter("out.txt");
fw.write(twoTimes("a", "*"));
fw.close();
// Email.send("hopang016@naver.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;
}
}
이렇게 수정하면, 하나의 메소드를 다같이 쓸 수 있다!