함수 function과 같은 개념메소드 method라 부름 double x = 3, y = 4;
System.out.printf("%f + %f = %f%n", x, y, x + y);
System.out.printf("%f - %f = %f%n", x, y, x - y);
System.out.printf("%f * %f = %f%n", x, y, x * y);
System.out.printf("%f / %f = %f%n", x, y, x / y);
x = 10; y = 2;
System.out.printf("%f + %f = %f%n", x, y, x + y);
System.out.printf("%f - %f = %f%n", x, y, x - y);
System.out.printf("%f * %f = %f%n", x, y, x * y);
System.out.printf("%f / %f = %f%n", x, y, x / y);
x = 7; y = 5;
System.out.printf("%f + %f = %f%n", x, y, x + y);
System.out.printf("%f - %f = %f%n", x, y, x - y);
System.out.printf("%f * %f = %f%n", x, y, x * y);
System.out.printf("%f / %f = %f%n", x, y, x / y);
위의 코드를 보면 변수의 값만 바뀔 뿐 코드들이 반복되는 것을 볼 수 있다.
// ⭐️ 메인 메소드 외부에 선언할 것
static void addSubtMultDiv (double a, double b) {
System.out.printf("%f + %f = %f%n", a, b, a + b);
System.out.printf("%f - %f = %f%n", a, b, a - b);
System.out.printf("%f * %f = %f%n", a, b, a * b);
System.out.printf("%f / %f = %f%n", a, b, a / b);
}
이런식으로 메소드를 만들어 반복되는 코드를 줄일 수 있다.
// 메인 메소드 내에서 외부에 선언한 메소드를 호출
double xx = 3, yy = 4;
addSubtMultDiv(xx, yy);
xx = 10; yy = 2;
addSubtMultDiv(xx, yy);
xx = 7; yy = 5;
addSubtMultDiv(xx, yy);
static int add (int num1, int num2) {
return num1 + num2;
}
// ⭐️ 반환한다는 것: 바꿔 쓸 수 있다는 것
// 메서드 실행문을 메서드의 반환값으로 치환
int int1 = add(2, 3);
System.out.println(int1);
System.out.println(add(4, 5));
int int2 = add(add(6, 7), add(8, 9));
System.out.println(int2);
결과적으로 위의 두 코드를 합치면
public class Ex02 {
public static void main(String[] args) {
int int1 = add(2,3);
System.out.println(int1);
int int2 = add(add(6,7), add(8,9));
System.out.println(int2);
}
static int add(int num1, int num2) {
return num1 + num2;
}
}
이런식으로 메소드가 쓰이는 것을 알 수 있다.
static boolean checkIfContain (String text, String token) {
return text.toLowerCase().contains(token.toLowerCase());
}
// 메인메소드에서 호출
System.out.println("\n- - - - -\n");
if (
checkIfContain(
"Hello World",
"hello"
)
) {
System.out.println("포함됨");
} else {
System.out.println("포함 안 됨");
}
위의 코드를 아래처럼 삼항연산자로 조금 더 간단하게 표현할 수 있다.
System.out.println(
checkIfContain(
"Hello World",
"hello"
) ? "포함됨" : "포함 안 됨"
);

static : 정적 메소드(클래스 메소드)에서 호출하려면(main등) 붙어야 함
정적이 아닌 메소드(인스턴스 메소드)는 객체지향 섹션에서 배울 것매개변수 parameter: 각각 자료형 변수명을 적음. 없을 시 빈 괄호
인자 argument라고 함return : 반환하는 값이 있을 때, 맨 마지막에 붙임
메소드의 이름은 최대한 메소드의 역할대로, 직관적으로 붙이면 좋음
// 매개변수도, 반환값도 없는 메소드
static void sayHello () {
System.out.println("안녕하세요!");
}
sayHello();
static int count = 0;
// 매개변수 없이 값만 반환하는 메소드
// 외부 변수 값을 변화시킴 (static이므로 static 변수만 가능)
static int getCount () {
System.out.println("카운트 증가");
return ++count;
}
int count1 = getCount();
int count2 = getCount();
int count3 = getCount();
int count4 = getCount();
return 은 블록을 종료하므로 이후의 코드 무효화 - 컴파일 에러 발생인자로 배열을 넘겨주는 경우도 보자.
public class Ex04 {
public static void main(String[] args){
double avg = getAverage(new int[] {3,5,4,13,7} );
// avg : 6.4
}
static double getAverage (int[] nums) {
double sum = 0;
for(int num: nums) {
sum +=num;
}
return sum / nums.length;
}
}
하나의 값만 반환 가능 // 자바의 메소드는 하나의 값만 반환 가능
// 여러 값을 반환하려면 배열 또는 이후 배울 객체를 활용
static int[] getMaxAndMin (int[] nums) {
int max = nums[0];
int min = nums[0];
for (int num : nums) {
max = max > num ? max : num;
min = min < num ? min : num;
}
return new int[] {max, min};
}
int[] numbers = {3, 5, 9, 2, 8, 1, 4};
// 변수에 담아 보다 효율적으로 바꿔볼 것
int maxOfNumbers = getMaxAndMin(numbers)[0];
int minOfNumbers = getMaxAndMin(numbers)[1];
디버그시 기존에 step over를 사용하게 되면 메소드 안에서 변수의 값이 변하는 것을 보지 못하는 경우가 있다. 따라서 step into 와 step out 을 사용해 디버그를 꼭 해보자. step into 는 진행상황에서 메소드가 존재하면 해당 메소드 안으로 들어갈 수 있다. 따라서 그 메소드의 과정에서 변수의 값이 어떻게 변하는지 알 수 있다. 그러다가 step out 을 누르면 다시 원래 step into 를 눌렀던 코드로 돌아오게 된다.
public claa Ex05 {
public static void main(String[] args) {
double avg = getAverage(3,91,14,27,4); // avg: 27.8
}
// 💡 ... 연산자 : 해당 위치 뒤로 오는 연산자들을 배열로 묶음
// int[] (배열 자체를 받음)과는 다름!
static double getAverage(int... nums) { //nums:[3,91,14,27,4]
double result = 0.0;
for (int num : nums) {
result += num;
}
return result / nums.length;
}
}
아래처럼 배열을 넣으면 자동으로 펼쳐져 인식된다.
// 💡 배열을 넣으면 자동으로 펼쳐져 인식됨
int[] numbers = {3, 91, 14, 27, 4};
double avgOfArr = getAverage(numbers);
아래와 같이 제약조건도 존재한다. 다른 인자들과 사용 시 맨 마지막에 넣어야한다.
// ⭐️ 다른(정해진) 인자들과 사용시 맨 마지막에 놓을 것
static String descClass (int classNo, String teacher, String... kids) {
return "%d반의 담임은 %s 선생님, 원생들은 %s 입니다."
.formatted(classNo, teacher, String.join(", ", kids));
}
String class3Desc = descClass(3, "목아진", "짱구", "철수", "훈이");
String[] kids = {"짱구", "철수", "훈이"};
String class3DescByArr = descClass(3, "목아진", kids);