본문 바로가기
Web

[Java] 사용자 정의 함수

by DuncanKim 2022. 6. 13.
728x90

[Java] 사용자 정의 함수

객체 지향에서 개발자가 정의하는 메소드는 아주 기본 중에 기본이다.

메소드를 활용해서 데이터를 통제할 수 있기 때문이다.

 

그렇게 해서 사용자가 어떤 데이터를 집어 넣으면 메소드를 통해서 정보가 저장이 되고

기존에 있는 데이터를 불러와서 매치 시켜보고, 맞으면 돈을 인출해준다던지

(볼드체가 메소드를 통해 이루어지는 행위들이다.)

 

아무튼 가장 기본중에 기본이다.

 


그럼 사용자 정의 함수가 있으면, 사용자가 정의하지 않는 함수도 있다?

그렇다. 기본으로 내장되어 있는 함수가 그러하다.

앞서 봤던 substring();이라던지, 제일 처음 자바를 마주할 때 쓰는 System.out.println();

이것들이 사용자가 정의하지 않는 기본 함수 즉, 내장함수이다.


 

세 가지의 활동을 통해 사용자 정의 함수에 대해서 알아보았다.

 

 

1-(1). 최대공약수를 구하는 함수(if문 활용) 

public class Main {
	// 반환형, 함수 이름, 매개변수
	public static int function(int a, int b, int c) {
		int min;
		if(a > b) {
			if(b > c) {
				min = c;
			}else
				min = b;
		}else {
			if(a > c) {
				min = c;
			}else {
				min = a;
			}
		}
		for(int i = min; i > 0; i--) {
			if(a % i == 0 && b % i == 0 && c % i == 0) {
				return i;
			}
		}
		return -1;
	}
	public static void main(String[] args) {
		System.out.println(function(400, 300, 750));
	}
}

// 결과 : 50

최대공약수를 구하는 것은 알고리즘을 공부할 때 해본 적이 있었다.

 

a, b, c 세 개의 정수가 주어졌을 때, 그것의 최대공약수를 찾기 위해서는

가장 작은 값을 찾아서 그 값이 세 개의 정수를 나누었을 때, 나머지가 모두 0이면 그것이 최대공약수이다.

 

그렇기 때문에 for문을 i가 세 개의 값 중 최소값 -> 1까지 가게 하면서 역으로 루프를 돌면서 찾아주면 된다.

return i를 해주면 그것이 최대공약수이다.

 

 

void 함수와 void가 없는 함수의 차이점을 중요하게 생각해야 하는데,

위의 function은 void 함수가 아니기 때문에 

return 값이 for문 안에만 있으면 되는 것이 아니다.

바깥에도 만약 값이 반환이 안되는 경우를 대비해서 return -1;을 해주어야 함수가 완성된다.

 

void 함수는 리턴값이 없이 종료되는 함수이고, void가 아닌 함수는 리턴값이 꼭 있어야 한다.


어떤 값을 반환해줘야 하는 함수 vs 어떤 값을 반환하지 않고 실행만 하는 함수


이 차이가 있다.

 

 

2. 최대값 구하는 함수(삼항 연산자) 

public static int max(int a, int b) {
		return (a > b) ? a : b;
}
	
public static int function(int a, int b, int c) {
    int result = max(a, b);
    result = max(result, c);
    return result;
}

public static void main(String[] args) {
    System.out.println(function(345, 568, 232));
}

// 결과 : 568

클래스 안의 메소드 (1)를 활용해서 또 하나의 메소드 (2)를 만들어 함수를 만드는 것이다.

function 함수를 호출했을 때, function 함수는 내부에서 max 함수를 또 호출한다.

사용자 정의 함수에서도 이런 식의 설계가 가능하다는 것을 알고 가는 부분이었다.

 

3. 마지막 단어를 반환하는 함수

public class 마지막단어반환 {
	public static char function(String input) {
		return input.charAt(input.length() - 1);
	}
    
	public static void main(String[] args) {
		System.out.println("Hello Wolrd의 마지막 단어는 " + function("Hello World"));
	}
}
// 결과 : Hello Wolrd의 마지막 단어는 d

파이썬이 부러워지는 순간이었다.

[-1]이면 끝날 것을 length() - 1을 해야 마지막 단어를 반환할 수 있다니....

아무튼 몇 자 늘지는 않았지만, 손가락을 더 튕겨야 하는 것은 사실이다.

charAt()은 문자열의 '한 개'의 글자만 추출해주는 함수이다.

인덱스로 접근할 수 있다.

 

내장 함수를 활용해서 사용자 정의 함수를 만들 수 있다는 것을 알고 가면 되는 부분이었다.

 

 

4. 주어진 수에서 k번째로 작은 수를 찾는 함수

public class 약수중k번째작은수 {
	public static int function(int number, int k) {
		for(int i = 1; i <= number; i++) {
			if(number % i == 0) {
				k--;
				if(k == 0) {
					return i;
				}
			}
		}
		return -1;
	}
	
	public static void main(String[] args) {	
		int result = function(3050, 10);
		if(result == -1) {
			System.out.println("없음");
		}else {
			System.out.println(result);
		}		
	}
}
// 결과 : 610

어떤 숫자가 주어졌을 때, 그의 약수 중에서 k번째로 작은 수를 찾고 싶을 때 구현하는 함수이다.

function은 매개변수로 number와 k를 받고 있는데,

약수라 함은 어떤 수 n이 있다고 하자. 그 수를 어떤 수로 나누었을 때, 나누어 떨어지는 것 즉, 나머지를 0으로 만드는 수를 의미한다.

function 함수는 그것을 구현한 것이다. 

 

for문 안의 첫번째 if는 약수를 먼저 구해주는 것이고, k--를 시켜주어 찾고 싶은 위치의 약수에 하나씩 다가가게 한다.

만약 k가 0이 된다면, 그것은 k번째의 약수라는 뜻이고, return i를 시켜준다.

그런데, k번째 약수가 없다면? (ex. number = 6, k = 6) 아무 값도 리턴하지 않고 for문을 빠져나올 것이고,

이때 return값으로 -1을 배출한다.

728x90

댓글