Notice
Recent Posts
Recent Comments
Link
Tags
more
«   2024/11   »
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 28 29 30
Archives
Today
Total
관리 메뉴

JongDDA의 한걸음 한걸음씩

[Java] 메서드(Method) 본문

개발/Java

[Java] 메서드(Method)

종따 2021. 7. 7. 21:51
728x90

메서드(Method)란?

메서드(Method)는  특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. 기본적으로 수학의 함수와 유사하며, 어떤 값을 입력하면 이 값으로 작업을 수행해서 결과를 반환한다.

 

메서드(Method)는 크게 선언부와 구현부로 이루어져 있으며 다음과 같은 형식으로 메서드를 정의한다.

반환타입 메서드이름 {타입 변수명, 타입 변수명, ...}  // 선언부
{
	// 매서드 호출시 수행될 코드                     // 구현부
}

ex)

int add(int a, int b){      // 선언부
	int result = a + b;
    return result; // 호출된 메서드로 결과를 반환한다.  // 구현부
}

 

메서드의 선언부

메서드 선언부는 '매서드의 이름''매개변수 선언', 그리고 '반환타입'으로 구성되어 있으며, 메서드가 작업을 수행하기 위해 어떤 값들을 필요로 하고 작업의 결과로 어떤 타입의 값을 반환하는지에 대한 정보를 제공한다.

 

매개변수 선언(parameter declaration)

매개변수는 매서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 위한 것이며, 필요한 값의 개수만큼 변수를 선언하며 각 변수간의 구분은 쉼표( , )를 사용한다. 선언할 수 있는 매개변수의 개수는 거의 제한이 없지만, 만일 입력해야할 값의 개수가 많은 경우에는 배열이나 참조변수를 사용하면 된다. 만일 값을 전혀 입력받을 필요가 없다면 괄호 안에 아무 것도 적지 않는다.

 

반환타입(return type)

메서드의 작업수행 결과(출력)인 '반환값(return value)'의 타입을 적는다. 단, 반환값이 없는 경우 반환타입으로 'void'를 적어야 한다.

 

메서드의 선언 방법

리턴타입 메서드명(자료형 매개변수1. ......){
                 실행할 문장
                 return 리턴값; 
}
void 매서드명(자료형 매개변수1. ......){
          실행할 문장
}
void 매서드명(){
          실행할 문장
}

 

메서드의 구현부

메서드의 선언부 다음에 오는 괄호{ }를 '메서드의 구현부'라고 하는데, 여기에 메서드를 호출 했을 때 수행될 문장들을 넣는다. 

 

return 문

메서드의 반환타입이 'void'가 아닌 경우, 구현부 { } 안에 'return 반환값;'이 반드시 포함되어 있어야 한다. 이 문장은 작업을 수행한 결과인 반환값을 호출한 메서드로 전달하는데, 이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다. 여러 개의 변수를 선언할 수 있는 매개변수와 달리 return문은 단 하나의 값만 반환할 수 있는데, 메서드로의 입력(매개변수)는 여러 개일 수 있어도 출력(반환값)은 최대 하나만 허용한다.

 

int add(int a, int b){
	int result = a + b;
    return result;  // 타입이 일치해야 한다.
}

 

반환값

return문의 반환값으로 주로 변수가 오지만 항상 그런 것은 아니다. return문 뒤에는 다른 메서드를 호출할 수도 있고 조건연산자를 사용하여 조건에 따라 다른 값을 호출할 수도 있다.

 

int result(int x) {
		return x>=0 ? x : -x;
}

 

지역변수(local variable)

메서드 내에 선언된 변수들은 그 메서드 내에서만 사용할 수 있으므로 서로 다른 메소드라면 같은 이름의 변수를 선언해도 된다. 이처럼 메서드 내에 선언된 변수를 '지역변수(local variable)'라고 한다.

 

int add(int x, int y){
	int result = x + y;
    return result;
}

int sub(int x, int y){
	int result = x - y;
    return result;
}

위에 정의된 메서드 add와 sub은 각기 선언된 변수 x,y,result는 이름만 같을 뿐 서로 다른 변수이다.

 

메서드의 호출

메서드를 호출할 때 괄호() 안에 지정해준 값들 '인수(argument)' 또는 '인자' 라고 하는데, 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다.

인수는 메서드가 호출되면서 매개변수에 대입되므로, 인자의 타입은 매개변수의 타입과 일치하거나 자동 형변환이 가능한 것이어야 한다.

 

public class MethodEx {
	public static void main(String[] args) {
		int result = add(1,2);
		System.out.println(result);
	}
	static int add(int x, int y) {
		return x + y;
	}
}

-> 메서드에 선언된 매개변수의 개수보다 많은 값을 괄호 안에 넣거나 타입이 다른 값을 넣으면 컴파일러가 애러를 발생시킨다.

 

매서드 주의사항
  1. 매개변수가 없는 매서드는 외부에서 값을 전달 받을 수 없다.
  2. 리턴값이 있는 매서드는 사용시 전체를 리턴값으로 보자
  3. 매서드 내부에 다른 매서드를 선언할 수 없다.(단, 사용은 가능하다.)
  4. 매서드 선언시 매개변수는 저장공간이고, 사용시에는 값을 그 자리 순서에 맞게 넣어준다.

 

static 메서드와 인스턴스 메서드

메서드 앞에 static이 붙어 있으면 클래스 메서드이고 붙어 있지 않으면 인스턴스 메서드이다.

클래스메서드는 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)' 와 같은 형태로 호출이 가능하지만 인스턴스 메서드의 경우 반드시 객체를 생성해야만 한다.

그러면 언제 static을 붙여 사용해야 할까

 

클레스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다. 생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스와 변수는 서로 다른 값을 유지한다. 그러나 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서 클래스 변수로 정의해야 한다.

 

클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해햐하는 것이 있는지 살펴보고 있으면 static을 붙여준다.

클래스 변수는  클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문에 인스턴스를 생성하지 않아도 사용할 수 있게된다.  

 

오버로딩(overloading)

자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 매서드가 있더라고 매개변수의 개수 또는 타입이 다르면 같은 이름을 사용해서 메서드를 정의할 수 있다. 이처럼 한 클래스 내에 같은 이름의 매서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 이라고 한다.

 

오버로딩이 성립하기 위해선 다음과 같은 조건을 만족해야 한다.

  1. 메서드의 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 반환 타입은 관계 없다.

EX)

public class MethodEx {
	// 오버로딩(타입 다르게)
	static int plus(int a, int b) {
		return a+b;
	}
	static float plus(float a, float b) {
		return a+b;
	}
	static String plus(String a, String b) {
		return a + b;
	}
	public static void main(String[] args) {
		int a = 100;
		int b = 200;
	
		int result1 = plus(a,b);
		
		float result2 = plus(100.0f, b);
		String result3 = plus("오늘은 ","일요일");
		
		System.out.println("result1 : " + result1);
		System.out.println("result2 : " + result2);
		System.out.println("result2 : " + result3);
	
	}
}

EX2)

public class MethodEx9 {
	// 오버로딩 (매개변수 개수 다르게)
	static int avg(int a, int b) {
		return (a+b)/2;
	}
	static int avg(int a, int b, int c) {
		return (a+b+c)/3;
	}
	static int avg(int a, int b, int c, int d) {
		return (a+b+c+d)/4;
	}

	public static void main(String[] args) {
		int result = avg(100,200);
		int result2 = avg(100,200,300);
		int result3 = avg(100,200,300,400);
		System.out.println("result : " + result);
		System.out.println("result : " + result2);
		System.out.println("result : " + result3);
	}
}

 

EX2 코드와 같이 오버로딩을 사용하여 매개변수가 여러개인 메서드를 여러개 만드는 경우 아래 코드와 같이 간단히 표현할 수 있다.

public class MethodEx9 {
	
	static int avg(int ... data) { // int 값 여러개
		int sum = 0;
		for(int i =0; i<data.length; i++) {
			sum += data[i]; // 배열로 받는다.
		}
		return sum/data.length;
	}
}

-> 매개변수가 몇 개가 되든 조건에 맞는 출력을 할 수 있다.

 

 

 

 

 

 

 

728x90
반응형
Comments