🍏 개발일기

함수

보배 진 2025. 10. 13. 15:59

< 함수의 3요소 >
1. input : 매개변수, 파라미터, arguments, 인자, 인수, 입력값
2. output : 출력값, 결과값, return, 반환값, 리턴값
3. 기능 : 함수명은 기능을 유추할 수 있어야 한다

 

 

< 함수의 구조 >

접근제어자 static 반환 함수명(인자) {

        // 함수

}

static : 객체와 무관하게

 

 

 

< 접근제어자의 종류 >

public

private

protected

 

 

< 함수의 종류 >

1형, 2형, 3형, 4형

 

1형

inputX, outputX이 없다

입력과 출력이 없으므로 인자도 없다

그래도 반환이 없다는 의미로 void를 사용한다

import java.util.Scanner;
// 함수
public class Test01 {
	public static void main(String[] args) {
		System.out.println("출력내용");		
		hello(); // 호출
		hello();
		hello();
	}
	// 1형 : input X, output X
	public static void hello() {
		System.out.println("안녕하세요!~~");
	}
}

 

함수는 호출하지 않으면 출력되지 않는다

 

 

 

 

 

 

 

2형

input O, output X

// 2형 : input O, output X
public static void checkNum(int num) {
    if(num%2 == 0) {
        System.out.println("짝수입니다");
    } else {
        System.out.println("홀수입니다");
    }
}

 

 

3형

input X, output O

import java.util.Random;
import java.util.Scanner;

public class Test02 {
	public static void main(String[] args) {
		//makeMsg();
		System.out.println(makeMsg());
		System.out.println(makeRandNum());
	}
	
	// 3형 : input X, output O
	public static String makeMsg() {
		Scanner sc = new Scanner(System.in);
		String msg;
		
		// 사용자가 메세지를 입력하면,
		System.out.print(">> ");
		msg = sc.next();
		
		// [사용자가 입력한 문구]를 "반환"할 예정
		msg = "[" + msg + "]";
		return msg; // 나를 호출한 곳으로 값을 반환
	}
	public static int makeRandNum() {
		// 1~10 사이의 정수를 랜덤으로 반환
		Random rand = new Random();
		int randNum = rand.nextInt(10)+1;
		return randNum;
	}
}

 

입력한 msg를 출력하기 위해서는 main에서 print를 해줘야한다

단순히 makeMsg() 호출하는 건 출력이 되지 않는다

System.out.print(makeMsg());로 작성해줘야 한다

 

 

 

4형

input O, output O

public class Test01 {
	public static void main(String args[]) {
		System.out.println(checkPrime(4));
		System.out.println(checkPrime(4));
		System.out.println(checkPrime(7));
		
		// 2. 변수에 저장
		boolean flag = checkPrime(2);
		System.out.println(flag? "소수" : "소수아님");
		System.out.println(checkPrime(4));
	}
	
	 // 4형 : input O, output O
	public static boolean checkPrime(int num) {
		int cnt = 0;
		for(int i=1; i<=num; i++) {
			if(num%i == 0) {
				cnt++;
			}
		}
		
		// 어떤 정수가 소수인지 아닌지를 반환
		if(cnt == 2) {
			return true;
		}
		return false;
	}
}

 

output은 오직 하나

 

 

 

< 함수의 장점 >

1. 코드 재사용이 가능하게 함

2. 개발시간/비용이 단축된다

3. 오류의 파급효과 절감

4. 코드 결합도가 낮아짐 (수정은 함수만)

5. 유지보수 용이

 

 

 


 

 

call by value : 값에 의한 호출

package class07;

// call by reference : 참조에 의한 호출
public class Test01 {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		func01(a, b);
		System.out.println("메인 함수");
		System.out.println("a = " + a);
		System.out.println("b = " + b);		
	}
	public static void func01(int a, int b) {
		int tmp = a;
		a = b;
		b = tmp;
		System.out.println("func01 함수");
		System.out.println("a = " + a);
		System.out.println("b = " + b);
	}
}

값만 이동을 한다

 

 

 


call by reference : 참조에 의한 호출

import java.util.Iterator;

// call by reference : 참조에 의한 호출
public class Test02 {
	public static void main(String[] args) {
		int[] datas = {1, 2, 3, 4, 5}; // 개발자 공간(Heap 메모리)에 저장되어 있음
		// datas는 그 공간의 주소를 가지고 있음
		
		func02(datas); // func02에 그 주소를 보냄
		System.out.println("main 함수");
		for(int data:datas) {
			System.out.print(data + " ");
		}
		System.out.println();
	}
	public static void func02(int[] datas) { // 주소가 이동함
		datas[0] = 100;
		System.out.println("func02 힘수");
		for(int data:datas) {
			System.out.println(data + " ");
		}
		System.out.println();
	}
}

 

내가 보낸 값이 배열인데 그 배열명은 주소를 함께 나타내기 때문에 인자에 보낼 경우

값만 이동하지 않고 주소가 함께 이동을 한다 (원본이 이동한다)