(Tutorial8)

사용자 정의 함수는 정해진 특정한 기능을 수행하는 모듈(작은 기능을 수행하는 장치)을 의미한다. 함수를 활용하여 하나의 문제를 잘게 분해할 수 있다.

메인함수에서 모든 알고리즘을 처리하면 매우 비효율적이다. 사용자 정의 함수를 통해 각각의 모듈로서 쉽게 수정되고 보완되는 장점이 있다.



1. 사용자 정의 함수를 만들어보자. ( Main 클래스 안 <-> Main함수 밖)

(1) public static 이후에 함수는 [반환형]을 먼저 써주어야한다.  그 다음 [함수명],  [매개변수] 순이다.

- 매개변수는 함수가 처리할 값을 사전적으로 주어주는 것이다.


// 반환형, 함수명, 매개변수

public static int function(int a, int b, int c) {

return 0;

}


2. 3개의 수 최대 공약수를 찾는 프로그램을 만들어보자.

[ 3개의 수 중 가장 작은 수 찾기 -> 찾은 가장 작은 수를 1씩 줄여가면서(줄여나가다가 나타나면 종료되니 최대가 됨) 

  -> 3개 모두 나눈 나머지가 0인 공약수 찾고 바로 반환하여 함수 종료시키기]


(1) 최대공약수를 찾을 때는 먼저 3개의 값 중 가장 작은 수를 먼저 찾아내야한다.

 - if a와 b를 먼저 비교한 뒤 -> b가 더 작은 경우, if  b와c를 비교해서 둘 중 더 작은 값을 min에 넣어준다.

             -> a가 더 작은 경우, if a와 c를 비교해서 더 작은 값을 min에 넣어준다.


int min;

if(a>b) {

if(b >c ) {

min =c;

} else {

min = b;

}

}else {

if(a>c) {

min = c;

}else {

min = a;

}

}


(2) 가장 작은 수를 for문을 통해, 1이 될 때까지  줄여주면서 그 안에 포함된 모든 수(약수 포함)를 돌면서, 

    if문을 통해 [ 3개의 수를 나눈 나머지가 모두 0이 되는, 공통약수]들을 찾아준다.

     만약 i가 반환되면 바로 [return i;를 통해 값을 반환하면서, 함수를 바로 종료] 시킨다. 그러면 더 최대공약수가 나오자마자 바로 함수가 종료되므로, 2번째 큰 공약수는 무시된다.


for(int i = min; i>0; i--) {

if( a%i==0 && b%i==0 && c%i==0) {

return i;

}

}


(3) 만약 최대공약수가 없는 경우에 -1값을 반환하도록 return -1;을 함수 맨 마지막에 준다.

return -1;


(4) 메인함수에서 사용자정의함수 function()을 사용하여, 문자를 출력해주자.


public static void main(String[] args) {


System.out.println("(400, 300, 750);의 최대공약수 : " + function(400, 300, 750) ); 

}


(5) 출력값 

(400, 300, 750);의 최대공약수 : 50



(Tutorial9)


3. 약수중 K번째로 작은 수를 찾는 프로그램을 작성해보자.

 [ 1부터 숫자까지 증가시키면서, 숫자로 나누어 떨어지는 약수가 k번 발견될 때, 반환한다. 이 때 몇번인지는 k--;로 센다]

(1) 매개변수는 2개를 받자, 약수를 찾을 수number k번째를 의미하는 k이다.


(2) 1부터 약수를 찾을 숫자 number까지 1씩 증가시키면서, 약수를 의미하는 [number % i ==0] 을 찾을 때마다, k를 1씩 뺀다

    그러다가 k가 0이 되는 순간에 그 약수 i를 return시킨다.

    ex> 만약 10번째 약수를 찾기위해, k에 10을 집어 넣었다면, 처음 찾았을 때는 9, 2번째찾으면 8, ... , 10번째 찾으면 0이 된다. 

     이 때, 약수를 찾은 횟수가 k만큼 돌아서 0이 되는 순간에 return시켜서 해당 약수를 반환시키는 것이다. 


(3) for문을 통해 1부터 숫자까지 돌았는데, k번째 약수가 안나타난다면, for문을 빠져나와서 -1을 return하도록 한다.

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;

}


(4) 메인매쏘드에서 함수를 사용해보자. 3050의 10번째 약수를 받아와 result에 넣어주고, 출력하자.

public static void main(String[] args) {

 

int result = function(3050, 10);

if(result == -1) {

System.out.println("3050의 10번째 약수는 없습니다.");

}else {

System.out.println("3050의 10번째 약수는 "+result+"입니다");


}


}


(5) 출력값

3050의 10번째 약수는 610입니다



4. 문자열의 마지막 단어를 반환하는 함수를 작성해보자.

(1) 문자열 하나를 입력 받아,  문자열의 단어 하나를 반환하는 public static char function(String input) {} 매쏘드를 만들자.

(2) input.charAt()을 이용해서, 문자열 중 하나의 단어만 가져올 수 있다. 이때, 파라미터에 문자열변수.length() -1 을 넣으면 가장 마지막 단어의 index를 의미하게 된다.

    (charAt()의 index는 0부터 세고, length는 1부터 세니까.. length-1하면 마지막 index값을 가져올 수 있다)

     

public static char function(String input) {

return input.charAt(input.length()-1);

}


(3) 매인매쏘드에서 사용해본다.

public static void main(String[] args) {

 

System.out.println("Hellow World의 마지막 단어는 "+function("Hello World") +" 입니다.");


}


(4) 출력값 

Hellow World의 마지막 단어는 d 입니다.


5. max()를 활용해서 최대값을 저장하는 함수를 작성해보자. 

[ 2개 중 최대값삼항연사자로 만든 함수를 만들고, 3개 중 최대값은 2개 최대값 함수를 이용해서, 

  최대값을 뽑아 낸 것을 담아 놓고, 그것을 다시 2개 최대값 함수로 비교하자]


(1) 2개의 정수를 받아 삼항 연산자를 이용해서 큰놈을 return하자.


public static int max(int a, int b) {

return (a>b)? a:b;

}


(2) 3개의 정수를 받아, (1)에서 만든 매쏘드를 활용해서 최대값을 뽑아내자. 

public static int function(int a, int b, int c) {

int result = max(a,b);

result = max(result, c);

return result;

}


(3) 메인매쏘드에서 출력해보자.


  public static void main(String[] args) {

System.out.println("(345, 567, 789)중 가장 큰 값 : "+function(345,567,789));

 

}



+ Recent posts