[03]함수

함수

  • 특별한 기능을 가지고 있다.
  • method , function , procedure
  • 형식 : 리턴형 함수명()
  • maker가 제공하는 함수도 있고, 사용자가 정의(user defined)할 수도 있다.
  • 식별자
    • 프로젝트명
    • 패키지명
    • 클래스명
    • 변수명
    • 함수
  • 만들었는데 호출 안하면 정상, 호출했는데 없으면 에러.

함수를 작성 시 고려사항

  • 매개변수(parameter,전달값)가 있는지?
  • return 값이 있는지?
  • 함수 정의(작성)를 하고 호출해야 사용할 수 있다.

매개변수 없는 함수

함수작성

1
2
3
4
5
6
7
public static void test1(){//함수정의
		System.out.println("JAVA");
		//test1(함수명) 함수의 기능은
		//콘솔창에 JAVA 를 띄우는 것.
		//호출해야 실행 가능. 
		//이게 가장 기본형태
	}

메인함수에서 함수 호출

1
2
3
public static void main(String[] args) {
  test1();  
}
  • 함수 안에 함수를 작성할 수 없지만 호출할 수 있다.
  • test1인 함수명만 쓰면 그냥 변수.
  • test1() 함수호출

매개변수 있는 함수

  • 전달값 argument value
1
2
3
4
5
6
7
8
9
10
11
public static void test3(int a){//여기서의 a를 매개변수(parameter)라고한다.
                                //자료형과 같이 써줘야 한다. 
                                //안써주는것이 자바스크립트문법.
    System.out.println(a);
}

public static void test4(int a,int b){//test3과 test4의 a변수는 다름. 
									  //{}기준으로 지역변수 내에서만 사용가능하기 때문이다.
		System.out.println(a+","+b);
		return;//생략가능.
	}

메소드 호출

1
2
3
4
5
6
7
8
//전달값이 1개 경우
test3(5); //전달값 5,  자료형이 없으면 정수는 기본형이 int , 실수에서는 기본이 double  
test3(7); //전달값 7
test3(9);

//전달값이 2개 이상인 경우
test4(6,8); //,로 구분.
test4(9,7)

리턴값이 있는 경우

  • 함수 정의 > 리턴형 함수명(){}
  • void : 리턴값이 없다.
  • 값을 가져가서 계산 후 다시 돌려준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
public static int test1(int a,int b){ //return값이 있으니 void를 빼고 sum의 자료형이 int를 사용.
		int sum=a+b;
		return sum; //나를 부른 곳으로 돌아갈때 sum값을 가져간다는 의미.
		            //return은 없거나 1개만 가능.
	}

public static void main(String[] args) {
	
		int result=test1(3,5);	//test1(3,5);은 sum인 8을 가지고 있음
    							//test1(3,5); 값을 result 변수에 저장
    
    System.out.println(result);  //8
}

전달값이 1차원 배열인 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void test1(int a,int b){//int a=su[0] , int b=su[2]
		System.out.println(a+b);
	}

public static void test2(int[] a){//배열로 받기때문에 int[] 함수명으로 받기.
		
		for(int idx=0;idx<a.length;idx++){
			System.out.println(a[idx]);
		}

public static void main(String[] args) {
    int[] su={2,4,6};
	test1(su[0],su[2]); //test1(2,6)
    
    test2(su); //su배열을 다 받는다는 말.
}

전달값이 2차원 배열인 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public static void test5(int a,int b){
    	System.out.println(a);
    	System.out.println(b);
    }
    
    public static void test6(int[][] su){
    	int row=su.length; //전체 행의 길이
    	for(int a=0;a<row;a++){
    		int col=su[a].length; 
    		for(int b=0;b<col;b++){
    			System.out.print(su[a][b]+" ");
    		}
    	}
    }


public static void main(String[] args) {
    int[][] su2={
				{1,2,3},
				{6,5,4} //2행3열
		};
    
    test5(su2[0][0],su2[1][2]); //1,4
	test6(su2);
    
}

재귀적 함수 호출

  • 자신의 함수를 호출
1
2
3
public static void test(){ //함수정의
		test(); //자신의 함수를 호출(재귀적 함수 호출)	
	}
1
2
3
4
5
6
7
public static long fact(int a){
		if(a==0){
			return 1;
		}else{
			return a*fact(a-1);
		}
	}

재귀적 함수 관계 분석

1
2
3
4
5
6
7
8
 a=3   if(3==0) >아님
    else return 3*fact(3-1); >함수를 계속 부르고 있어서 return 못만남. , 3*살이있음
 a=2   if(2==0) >아님  
	else return 2*fact(2-1); > 2*살아있음
 a=1   if(1==0) > 아님
	else return 1*fact(1-1); >아직도 fact 부르고 있음. 1*살아있음.
 a=0   if(0==0) > 맞음 값은 1
	  > 남아있는 값은 3* , 2* , 1* , 1  남아있다. 그래서 전체 값이 3*2*1*1 > 6      

꼭 main에서만 함수를 부르는 것은 아니다.

1
2
3
public static void test2(){
    fact(4);
}
  • main(); main() 함수는 사용자가 임의의 호출 불가능
    • 클래스가 실행될 때
    • 자바 가상 머신(Java Virtual Machine)이 호출한다
자바 클래스 (.class) 실행 순서
  1. main() 함수 호출 후 .class 실행
  2. JVM > javaw.exe가 실행해줌
  3. 운영체제(Operating System) : Windows , Linux , MacOS

자바 특징

  1. 플랫폼이 독립되어 있다.
  2. OS를 구분하지 않는다.
  3. 가상머신이 깔려있으면 클래스가 실행된다.

메소드 오버로딩 method overloading

함수명 중복정의

  1. 매개변수의 갯수가 달라야 한다.
    1. 하나주면 하나짜리 함수 찾아가고, 두개주면 두개짜리 함수를 찾아간다.
  2. 매개변수의 자료형이 달라야 한다.