[Java]OOP - 메소드(Method)
⚫메소드(Method) : 클래스 내부에 선언한 함수 - 멤버함수
=> 필드(멤버변수)를 사용하여 필요한 기능을 제공하기 위한 명령의 모임
=> 메소드 내부에서만 Java 명령을 작성하여 실행(외부에는 절대 작성할 수 없음!)
*함수(Function) : 매개변수로 값을 제공받아 연산 처리하여 반환하는 명령의 모임
🔘메소드 선언 방법
형식) 반환형 메소드명(자료형 변수명, 자료형 변수명...) {
명령;
...
}
🔸 메소드를 호출(Invoke)해야 메소드 내부에 작성된 명령 실행 - 기능 구현
🔸 반환형(ReturnType) : 메소드를 호출하여 얻을 수 있는 결과값에 대한 자료형
=> void 자료형(무반환형) : 메소드를 호출하여 얻을 수 있는 결과값이 없는 경우에 사용하는 자료형
🔸 메소드명은 식별자로 카멜 표기법을 사용하여 작성
🔸 메소드의 () 기호 안에는 변수를, 기호로 나열 선언 - 매개변수(Parameter - Argument)
=> 메소드 내부에 작성된 명령을 실행하기 위해 필요한 값을 메소드 호출 시, 전달받아 저장하기 위한 변수
=> 메소드 내부에 작성된 명령을 실행하기 위한 값이 필요없는 경우 매개변수 작성 생략
🔘 메소드 호출(Invoke) : 메소드에 작성된 명령을 실행하여 필요한 기능 구현
형식) 객체.메소드명(값, 값, ...);
🔸 참조변수로 객체를 참조하여 객체의 메소드 호출
🔸 메소드 호출시 매개변수에 차례대로 값을 전달하여 저장해야만 메소드 호출
🔸 매개변수에 값이 정상적으로 전달되지 않은 경우 메소드 호출이 불가능 - 에러 발생
🔶return: 메소드를 강제로 종료하여 프로그램의 흐름(스레드)를 메소드를 호출한 위치로 되돌리는 키워드
=> 일반적으로 if 구문과 같이 사용
형식) if(조건식) return;
=> 메소드의 반환형을 [void]로 작성
🔶 return 키워드를 사용하여 메소드의 처리 결과값을 메소드를 호출한 위치로 반환하는 기능을 제공
형식) return 반환값;
=> 메소드의 반환형은 반환되는 값의 자료형으로 작성
실습예제👩💻
package oop;
//객체 생성을 목적으로 작성된 클래스
public class Method {
// 기본생성자(default constructor)가 만들어져 있음.
void displayOne() {
System.out.println("Method 클래스에 선언된 displayOne() 메소드 호출");
}
void displayTwo() {
System.out.println("Method 클래스에 선언된 displayTwo() 메소드 호출");
}
void printOne() {
int total = 0;
for (int i = 1; i <= 100; i++) {
total += i;
}
System.out.println("1~100 범위의 정수들의 합계 = " + total);
}
void printTwo(int number) {
// 매개변수에 저장된 값에 대한 검증
if (number <= 0) {
System.out.println("[에러]매개변수에는 0보다 큰 값이 저장되어야 됩니다.");
return;// 메소드 강제 종료
}
int total = 0;
for (int i = 1; i <= number; i++) {
total += i;
}
System.out.println("1~" + number + "범위의 정수들의 합계 = " + total);
}
void printThree(int start, int end) {
if (start > end) {
int temp = start;
start = end;
end = temp;
}
int total = 0;
for (int i = start; i <= end; i++) {
total += i;
}
System.out.println(start + "~" + end + "범위의 정수들의 합계 = " + total);
}
int returnTotal(int start, int end) {
if (start > end) {
int temp = start;
start = end;
end = temp;
}
int total = 0;
for (int i = start; i <= end; i++) {
total += i;
}
return total;
}
// 매개 변수로 전달받은 정수값을 홀수와 짝수로 구분하여 반환하는 메소드
// => false 반환: 홀수, true 반환 : 짝수
boolean isOddEven(int number){// is로 시작하는 메소드는 '대체로' boolean 반환함(100%는 아님~ )
if(number % 2!= 0){
return false;
} else {
return true;
}
}
//배열을 반환하는 메소드
int[] returnArray() {
/*
int[] array={10, 20, 30, 40, 50};
return array;//참조변수에 저장된 배열의 메모리 주소 반환 - 배열 반환
*/
//배열을 참조변수에 저장하지 않고 배열을 생성하여 반환
//return {10, 20, 30, 40, 50};//엄밀히 말하면 배열이 아니고 상수임(=자료형 아님)
//=> heap 영역이 아닌 메소드 영역에 만들어짐, 에러가 발생
return new int[]{10, 20, 30, 40, 50};
}
//매개변수로 배열을 전달받아 모든 배열 요소값의 합계를 계산하여 반환하는 메소드
int sumOne(int[] array) {//배열의 메모리 주소를 전달받아 매개변수(참조변수)에 저장
int total=0;
for(int su : array) {
total += su;
}
return total;
}
//매개변수 생략 기호(...)를 이용하여 매개변수를 작성하여
//0개 이상의 값을 전달받아 합계를 계산하여 반환하는 메소드'
// =>0개 이상의 값을 전달받아 저장한 매개변수는 메소드 내부에서는 배열과 동일하게 처리
int sumTwo(int... number) {
int total=0;
for(int su : number) {
total += su;
}
return total;
}
}
위 Method 클래스에 작성된 메서드들을 실행하기 위해 작성된 클래스⬇️
(*검정색 배경 부분이 콘솔에 출력된 실행 결과)
package oop;
//실행의 목적으로 작성된 클래스
public class MethodApp {
//Main Method
//JVM(Java Virtual Machine)에 의해 자동으로 호출되는 메소드
// => 프로그램이 시작되는 위치
public static void main(String[] args) {
//클래스로 객체를 생성하여 객체의 메모리 주소를 참조변수에 저장
// => 같은 패키지에 작성된 클래스는 패키지를 표현하지 않아도 클래스 사용 가능
Method method=new Method();
//참조변수를 출력할 경우 "자료형@메모리주소" 형식의 문자열을 제공받아 출력
System.out.println("method = "+method);
System.out.println("=======================================================");
method = oop.Method@2f92e0f4
=======================================================
//참조변수에 저장된 메모리 주소로 객체를 참조하여 객체의 메소드 호출
// => 메소드를 호출하면 프로그램의 흐름(스레드)이 객체의 메소드로 이동하여 메소드의
//명령을 실행하고 메소드가 종료되면 다시 되돌아와 다음 명령을 실행
method.displayOne();
method.displayTwo();
method.displayOne();
System.out.println("=======================================================");
method.printOne();
System.out.println("=======================================================");
Method 클래스에 선언된 displayOne() 메소드 호출
Method 클래스에 선언된 displayTwo() 메소드 호출
Method 클래스에 선언된 displayOne() 메소드 호출
=======================================================
1~100 범위의 정수들의 합계 = 5050
=======================================================
method.printTwo(50);
method.printTwo(-30);
System.out.println("=======================================================");
1~50범위의 정수들의 합계 = 1275
[에러]매개변수에는 0보다 큰 값이 저장되어야 됩니다.
=======================================================
method.printThree(35, 79);
method.printThree(19, 99);
method.printThree(67, 12);
System.out.println("=======================================================");
35~79범위의 정수들의 합계 = 2565
19~99범위의 정수들의 합계 = 4779
12~67범위의 정수들의 합계 = 2212
=======================================================
//객체의 메소드를 호출하여 반환되는 값을 제공받아 변수에 저장
int sum=method.returnTotal(30, 70);
System.out.println("합계 ="+sum);
//객체의 메소드를 호출하여 반환되는 값을 제공받아 출력 처리
System.out.println("합계 ="+method.returnTotal(20, 80));
System.out.println("=======================================================");
합계 =2050
합계 =3050
=======================================================
boolean result=method.isOddEven(10);
//조건식 대신 boolean 변수에 저장된 논리값을 사용하여 명령 선택 실행
if(result) {
System.out.println("매개변수로 전달된 값은 [짝수]입니다.");
} else {
System.out.println("매개변수로 전달된 값은 [홀수]입니다.");
}
//조건식 대신 메소드의 반환값(논리값)을 사용하여 명령 선택 실행
if (method.isOddEven(11)) {
System.out.println("매개변수로 전달된 값은 [짝수]입니다.");
} else {
System.out.println("매개변수로 전달된 값은 [홀수]입니다.");
}
System.out.println("=======================================================");
매개변수로 전달된 값은 [짝수]입니다.
매개변수로 전달된 값은 [홀수]입니다.
=======================================================
//메소드를 호출하여 반환되는 배열의 메모리 주소를 참조에 저장
// => 참조변수에 저장된 메모리 주소를 이용하여 배열 참조
int[] numArray=method.returnArray(); //배열을 반환받아 저장
for(int number : numArray) {
System.out.print(number+" ");
}
System.out.println();
System.out.println("=======================================================");
10 20 30 40 50
=======================================================
//매개 변수에 배열을 전달하여 메소드 호출 - 반환값(모든 요소값의 합계)을 제공받아 출력
//int[] suArray= {10,20,30};
//배열을 생성하여 매개변수에 배열을 전달하여 메소드 호출
//System.out.println("합계 = "+method.sumOne(suArray));//에러 발생
System.out.println("합계 = "+method.sumOne(new int[] {10,20,30}));
//배열에는 요소값을 0개 이상 저장하여 전달해 메소드 호출 가능
System.out.println("합계 = "+method.sumOne(new int[] {}));
System.out.println("합계 = "+method.sumOne(new int[] {10,20}));
System.out.println("합계 = "+method.sumOne(new int[] {10,20,30,40,50}));
System.out.println("=======================================================");
합계 = 60
합계 = 0
합계 = 30
합계 = 150
=======================================================
//메소드 호출시 모든 전달값이 매개변수에 전달되어 저장
System.out.println("합계 = "+method.sumTwo(10,20,30));
System.out.println("합계 = "+method.sumTwo());
System.out.println("합계 = "+method.sumTwo(10,20));
}
}
합계 = 60
합계 = 0
합계 = 30