코드가 길어지거나, 같은 코드를 반복해야 할 때, 코드를 부품화하여 분리해 보기 좋은 코드로 만들 수 있다.
코드의 부품화(코드의 모듈화) 하는 방법 중 한가지가 메서드이다.
소괄호가 있고 어떤 데이터타입을 받을 수 있다는 정의를 할 수 있다.
✔️ Argument (아규먼트)
- console의 입력 값.
- 해당 parameter에 적합한 실제 데이터를 나타낸다.
✔️ parameter (파라미터)
- 그 입력값을 받는 매개 변수.
- 어떤 함수(또는 클래스)가 받아들이는 어떤 타입을 가지는 데이터를 대표하는 이름을 나타낸 것.
Human이라는 클래스에 이름과 나이가 필요하다면 Human(String name, int age)에서
name과 age는 각각 parameter이다.
Human 클래스를 사용해서 아바타 하나를 만든다고 한다면 Human("ZZeong",25)이라고 작성해서 만들텐데, 이때, "ZZeong"과 25는 arguments이다.
클래스 안에서 여러가지의 메서드를 만들 수 있다.
public class Main {
public static void main(String[] args) { // main 메서드
}
public static void hello() { // hello 메서드
System.out.println("Hello"); // 안에다 코드 작성 가능
}
}
public class Main {
public static void main(String[] args) {
System.out.println("안녕하세요");
hello(); // = System.out.println("Hello"); 메서드를 호출할 수 있음.
}
public static void hello() {
System.out.println("Hello"); // 여기서 가져옴.
}
}
메서드끼리는 서로서로 호출이 가능하다. 하지만, 시작점은 main메서드!
위치는 상관없다.
public class Main {
public static void methodA() {
System.out.println("methodA");
methodB(); // = System.out.println("methodB");
}
private static void methodB() {
System.out.println("methodB");
}
public static void main(String[] args) {
methodA; // methodA와 methodB가 쫘르륵 나온다.
} // System.out.println("methodA"); System.out.println("methodB");
}
public class Main {
public static void main(String[] args) { // main 메서드
System.out.println("메소드를 호출합니다");
hello("Jeong"); // 값들을 넘겨줌.
hello("제임스 고슬링");
hello("Jenny");
System.out.println("메소드 호출을 종료합니다");
}
public static void hello(String name) { // hello 메서드
System.out.println(name + "씨 안녕하세요");
}
}
[결과값]
메소드를 호출합니다
Jeong씨 안녕하세요
제임스 고슬링씨 안녕하세요
Jenny씨 안녕하세요
메소드 호출을 종료합니다
public static void hello(String name)
- 어떤 데이터 타입을 얻을 수 있다는 정의를 할 수 있다.
- main안의 값들이 hello의 name이라는 파라미터로 값이 들어온다.
public class Main {
public static void main(String[] args) { // main 메서드
add(100, 20); // 두개씩 넘길 수 있음.
add(200, 50);
}
public static void add(int x, int y) { //파라미터가 2개, 메인메소드에서 여기로 대입
int ans = x + y;
System.out.println(x + "+" + y + "=" + ans );
}
}
[결과값]
100+20=120
200+50=250
할 수 없다.
둘 사이의 연결고리가 없어서 값을 받아오지 못하기 때문에 컴파일이 되지 않는다.
public class Main {
public static void main(String[] args) {
int x = 100;
int y = 10;
add(x, y);
}
private static void add(int a, int b) { //add(x, y);이 여기로 대입. 두가지 통로를 뚫어주는 것.
int ans = a + b;
}
}
x와 y의 인자를 불러오기 위해서 둘의 연결고리가 필요하다.
그것이 파라미터의 역할이다.
private static void add(int a, int b)
- main 메서드 내의 add(x, y);가 고대로 대입되어 값이 나온다.
메소드 호출 시 결과 값을 돌려주는 것을 값을 돌려준다.
이 값을 반환 값 (return) 이라고 한다.
public class Main {
public static void main(String[] args) {
// add메서드는 ans로 결과를 반환한다. 변수에 값을 대입할 수 있다.
int ans = add(100, 10);
System.out.println("100 + 10 = " + ans);
}
// int = 반환타입
private static int add(int x, int y) {
int ans = x + y;
return ans; // ans로 결과를 반환한다. 계산 결과 반환
}
}
private static int add(int x, int y)
- 단순히 실행만 한다면 void를 쓴다.
- 반환 즉 계산 결과를 돌려줘야한다고 하면 그 앞에 반환 타입을 쓰면 된다.
public class Main {
public static void main(String[] args) {
int x = 100;
int y = 10;
//int result = add(x, y);
//System.out.println(result);
System.out.println(Main.add(x, y)); // Math.max(a, b) 비슷.
}
private static int add(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
int x = 100;
int y = 10;
//int result = add(x, y);
System.out.println(max(100, 10));
}
// 인수 덧셈
private static int add(int a, int b) {
return a + b;
}
// 최대값 구하기
public static int max (int a, int b) {
if (a > b) {
return a;
} else if (a < b) {
return b;
} else {
return -1;
}
}
}
최대값 구하는 것을 Math 함수로 간단하게 나타낼 수 있다.
하지만, int max 것이 아니라 함수 Math를 쓰는 것.
public static int max (int a, int b) {
return Math.max(a, b);
}
}
public class Main {
private static int add(int x, int y) {
int ans = x + y;
return ans;
}
public static void main(String[] args) {
System.out.println(add(add(10, 20), add(30, 40)));
} // 30 + 70 = 100, 결과값: 100
}
public static int sample() {
return 1; //에러
int x = 10;
}
return은 항상 블럭의 마지막에 있어야 한다.
✔️ 같은 이름의 메서드를 여러개 정의 하는 것 (기능 확장)
public class Main {
// 첫 번째 add 메서드
public static int add(int x, int y) {
return x + y;
}
// 두 번째 add 메서드
public static double add(double x, double y) {
return x + y;
}
// 세 번째 add 메서드
public static String add(String x, String y) {
return x + y;
}
public static void main(String[] args) {
System.out.println(add(10, 20));
System.out.println(add(3.5, 2.7));
System.out.println(add("Hello", "Java"));
// 결과값 : 30 6.2 HelloJava
}
}
public class Main {
// 첫 번째 add 메서드
public static int add(int x, int y) {
return x + y;
}
// 두 번째 add 메서드
public static int add(int x, int y, int z) {
return x + y + z;
}
public static void main(String[] args) {
System.out.println(add(10, 20));
System.out.println(add(10, 20, 30));
//결과값: 30 60
}
}
public class Main {
//int 형 배열을 받아 모든 요소를 출력 = printArray
public static void printArray(int[] array) {
for (int element: array) {
System.out.println(element);
}
}
public static void main(String[] args) {
int[] array = {1, 2, 3};
printArray(array);
}
} // 결과값: 1 2 3
import java.lang.reflect.Array;
public class Main {
// int형 배열을 받아 배열내의 요소 전부에 1을 더하는 메서드
public static void incArray(int[] array) { // 2.
for (int i = 0; i < array.length; i++) {
array[i]++; // 3. / 1부터 ++를 했기 때문에 첫 시작이 2로 바뀜
}
} // 계산 결과를 리턴하지 않음
public static void main(String[] args) {
int[] array = {1, 2, 3};
incArray(array); // 1.
for (int i : array) { // 4.
System.out.println(i); // 5.
}
} // 결과값: 2, 3, 4
}
public class Main {
public static int[] makeArray(int size) {
int[] newArray = new int[size];
for (int i = 0; i < newArray.length; i++) {
newArray[i] = i;
}
return newArray;
}
public static void main(String[] args) {
int[] array = makeArray(3);
for (int i : array) {
System.out.println(i);
}
}
}
✔️ 메서드를 사용할 때 배열같은 경우는 신경을 써야한다.
public static void main(String[] args) {}
main을 실행할 때, args에다가 String으로 배열, 배열타입의 파라미터를 받는다.
커맨드 라인 인수를 이런식으로 전달하는구나 정도만 알아두자.