메소드(method)
쉽게 말해 입력에 따른 결과를 반환하는 것
1. c언어에서의 함수(function)와 같음
2. 기능을 정의하는 단위(예. 덧셈 기능, 뺄셈 기능 등등)
3. 하나의 기능만을 정의하는 것이 좋음
4. 자주 반복되는 내용을 정의해 놓고, 필요할 때 호출하여 사용함
형식)
[접근 제한] 반한형(=리턴 타입) 메서드 이름(매개변수 혹은 인자) {
메서드 호출 시 실행될 문장;
return; // 리턴 타입이 void일 경우 return 없음
}
그럼 하나하나 뜯어보자 !
접근 제한
https://jinnnkcoding.tistory.com/32
접근제어자만 따로 포스팅을 해두었다!
public > protected > defaulf > private (클래스, 메서드, 변수 앞에 사용됨)
- public : 누구나 다, 아무나 접근 가능 (*보통 이걸 제일 많이 씀!)
- protected : 같은 패키지에서 접근 가능
다른 패키지는 상속 관계만 접근 가능
- default : 같은 패키지에서만 접근 가능
상속관계라도 접근 안됨
- private : 외부에서 접근 불가
반환형(=리턴 타입)
https://jinnnkcoding.tistory.com/37
- 자료형 혹은 void로 작성
- 메서드를 실행하고 특정 타입의 결과를 반환해 주겠다고 선언한 것
- 메서드에서 실행된 결과 값을 돌려주는 자료형으로, 생략이 불가능함
- 해당 메서드가 어떤 동작이나 기능을 실행한 후 결과를 알려주는 자료형
- 메서드를 호출한 곳으로 결과를 되돌려줄 때 사용하는 자료형
- 만약 결과를 되돌려줄 필요가 없는 경우에는 void 라는 키워드를 작성함
- 반황형이 void인 경우를 제외하고 결과를 되돌려 주어야 할 때는 메서드 명령문 맨 마지막에 return이라는 키워드를 작성 후, 앞에서 선언한 반환형과 같은 자료형으로 결과를 되돌려준다.
※ 반환타입이 void인 경우, return문 없이도 아무런 문제가 없었던 이유는 컴파일러가 메서드 마지막에 return; 을 자동적으로 추가해주었기 때문이다.
메서드 이름
식별자, 소문자로 시작, 두 개의 단어가 결합된 경우에는 두번째 글자의 첫 글자는 대문자로 작성하는 것이 관례
매개 변수
- 외부에서 값을 넘겨 받는 변수, 생략 가능
- 메서드 호출 시 전달되는 값의 저장을 위한 용도로 사용이 됨
- 메서드 호출 시 전달되는 값의 자료형과 매개변수의 자료형은 반드시 일치해야 함
메서드 실행문
해당 메서드가 호출된 경우에만 실행이 됨
그럼, main 메소드는 뭘까?
main 메소드
프로그램의 시작점 역할을 하는 JAVA의 약속된 내용이다.
즉, main 메소드가 없는 프로그램은 별도로 동작할 수가 없다.
컴퓨터가 소스 코드를 읽을 때 main 메소드를 실행하고 거기에 정의된 로직에 따라 프로그램이 동작하게 된다.
메서드 호출 방식
1. call by value(값에 의한 호출)
- 값을 전달하여 호출하는 방식
- 매개변수가 기본자료형(int, double) 사용
- 장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다
- 단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.
예문을 통해 알아보자.
package Method;
public class Ex05 {
public static void call(int num) {
num=100;
}
public static void main(String[] args) {
// call by value 방식
int num=200;
System.out.println("메소드 호출 전....");
System.out.println("num >>> " + num);
call(num);
System.out.println("call() 메소드 호출 후....");
System.out.println("num >>> " + num);
}
}
메인 메소드에서 call()메소드를 호출하여 num값을 넘겼으니
당연히 num값이 200에서 100으로 되어야 하는거 아니야? 싶었지만
결과는~
메소드 호출 전....
num >>> 200
call() 메소드 호출 후....
num >>> 200
메소드 호출 후에도 메인 메소드에 있는 num 인자의 값은 변하지 않는다는 걸 볼 수 있다.
2. call by reference(참조에 의한 호출)
- 주소값을 전달하여 호출하는 방식
- 매개변수가 참조자료형(배열, 클래스명) 사용
- 장점 : 복사하지 않고 직접 참조를 하기에 빠르다.
- 단점 : 직접 참조를 하기에 원래 값이 영향을 받는다.(리스크)
예문
package Method;
public class Ex06 {
public static void change(int[] array) {
System.out.println("array >>> " + array); // array의 주소값 출력
array[0]=100;
array[1]=200;
array[2]=300;
}
public static void main(String[] args) {
int[] arr=new int[3]; // 배열 설정
arr[0]=10; arr[1]=20; arr[2]=30;
System.out.println("change() 메소드 호출 전...");
System.out.println("arr >>> " + arr); // arr의 주소값 출력
for(int i=0; i<arr.length; i++) {
System.out.printf("arr[%d] >>> %d\n", i, arr[i]);
}
System.out.println();
change(arr);
System.out.println("change() 메소드 호출 후...");
for(int i=0; i<arr.length; i++) {
System.out.printf("arr[%d] >>> %d\n", i, arr[i]);
}
}
}
결과
change() 메소드 호출 전...
arr >>> [I@15db9742
arr[0] >>> 10
arr[1] >>> 20
arr[2] >>> 30
array >>> [I@15db9742
change() 메소드 호출 후...
arr[0] >>> 100
arr[1] >>> 200
arr[2] >>> 300
Call by reference는 메서드 호출 시
사용되는 인자 값의 메모리에 저장되어있는 주소(Address)를 복사하여 보낸다.
https://re-build.tistory.com/3
어떤 분이 둘 차이점을 아주 잘 설명해주셨다.
매개변수가 있는 메소드 정의
형식
[접근제한] 반환형 메서드이름 (type 변수1, type 변수2) {
메서드 호출 시 실행 문장;
}
* 실인수와 가인수
실인수 : 매개변수에 전달할 실제 값 ==> 메서드를 호출할 때 사용함.
가인수 : 매개변수 ==> 메서드에 정의.
실인수와 가인수는 반드시 type, 순서, 갯수가 일치해야 함(중요한 내용).
https://jinnnkcoding.tistory.com/23
메소드 다중정의(overloading)에 대한 부분은 따로 포스팅 했다.
아래부터는 예제
4칙연산과 나머지를 구하는 계산기 메소드를 각각 생성하고,
키보드로부터 값과 연산자를 입력받아 실행해보자
package Method;
import java.util.Scanner; // 스캐너 클래스 호출
public class EX04 {
// 덧셈 메소드
public static void plus(int num1, int num2) {
System.out.println("덧셈 >>>" + (num1+num2));
}
// 뺄셈 메소드
public static void minus(int num1, int num2) {
System.out.println("뺄셈 >>>" + (num1-num2));
}
// 곱셈 메소드
public static void mul(int num1, int num2) {
System.out.println("곱셈 >>>" + (num1*num2));
}
// 나눗셈 메소드
public static void divide(int num1, int num2) {
System.out.println("나눗셈 >>>" + (num1/num2));
}
// 나머지 메소드
public static void mod(int num1, int num2) {
System.out.println("나머지>>>" + (num1%num2));
}
// 메인 메소드
public static void main(String[] args) {
// 1. 키보드로부터 두개의 정수를 입력받는다.
Scanner sc=new Scanner(System.in);
System.out.print("첫번째 정수 입력 : ");
int su1=sc.nextInt();
System.out.print("두번째 정수 입력 : ");
int su2=sc.nextInt();
// 2. 연산자를 입력받는다.
System.out.print("연산자(+, -, *, /, % ) 중 하나를 입력하세요 : ");
String op=sc.next();
// 3. 연산자 변수에 입력된 연산기호를 가지고 해당 기호에 맞는 메소드를 호출해주자.
switch(op) {
case "+" :
plus(su1, su2);
break;
case "-" :
minus(su1, su2);
break;
case "*" :
mul(su1, su2);
break;
case "/" :
divide(su1, su2);
break;
case "%" :
mod(su1, su2);
break;
}
}
}
실행창
첫번째 정수 입력 : 3
두번째 정수 입력 : 4
연산자(+, -, *, / ) 중 하나를 입력하세요 : +
덧셈 >>>7
'Back-End > Java' 카테고리의 다른 글
[Java] 객체(Object), 클래스(Class) (0) | 2021.08.16 |
---|---|
[Java] 메소드 다중정의(method overloading) (0) | 2021.08.16 |
[Java] 다차원 배열과 가변 배열 (0) | 2021.08.16 |
[Java] 배열 공유 (0) | 2021.08.16 |
[Java] 단축 for문(개선된 for문, for each문) (0) | 2021.08.11 |
댓글