메서드 (method)
반복적으로 수행되는 여러 문장을 메서드로 작성
- 반복되는 코드 블록에 이름을 붙여 놓은 것
- 장정: 코드의 중복을 줄임 / 관리 용이 / 재사용 가능 / 간결해서 이해하기 쉬워짐
- 하나의 메서드는 한 가지 기능만 수행하도록 작성
- 메서드의 이름 뒤에는 반드시 소괄호 ( )
- return은 반드시 1개
- 메서드는 메서드 내부에 생성할 수 X
- 절차지향인 C언어, 파이썬은 위 / 자바는 위, 아래 상관없음 (class 내부에만 있으면 됨)
좌측의 중복되는 코드 2개
↓
우측의 메서드 1개로 만듦
선언 방법 (암기 필수)
< 반환 타입 > < 메서드 이름> (매개 변수1, 매개 변수2 ...)
{
// 메서드 호출시 수행될 코드;
}
// 예시
int add (int a, int b)
{
int result = a + b;
return result; // 호출한 메서드로 결과를 반환한다.
}
선언부
반환 유형 (return type) - 출력
- 메서드가 실행 후 메서드를 호출한 곳에 반환하는 값의 데이터 타입
- 0 ~ 1개 , 없는 경우에는 반환 유형에 void 작성
- 반환값이 있는 메서드를 호출할 때는 해당 반환 유형에 맞는 변수에 반환값을 저장해야 함
- 실행의 결과값을 반환할 때는 return이라는 키워드를 사용 → return 다음 타입의 값을 적어줘야 함
매개 변수 (parameter) - 입력
- 메서드가 실행될 때 필요한 데이터를 외부로부터 받기 위해 사용
- 매개 변수도 일종의 변수이기 때문에 소괄호( ) 부분에 데이터 타입과 함께 선언, 초기화 X
- 0 ~ N개: 여러개 가능 (int a, int b...), 외부로부터 받을 데이터가 없어서 선언하지 않으면 소괄호() 안을 비움
구현부
지역변수(Iv)
- 메서드 영역 내에 선언된 변수
호출
(객체(인스턴스)이름.)메서드 이름 (값1, 값2 ...);
// ex1) return 값이 String str에 저장되고, str출력
String str = method06(arr);
System.out.println(str); => System.our.println(method06(arr));
// ex2) 그냥 구구단 전체 출력, 입력값 필요 X
print99danaAll();
// ex3) add 메서드 입장에서는 2개의 입력값이 필요해
int result = add (3, 5);
# 헷갈리지 말자
결과 변수 = 메서드 이름 (변수명);
결과 변수에 굳이 return한 값 아니어도 됨. 새로운 변수 이름으로 적고, 그거 출력 가능.
𖤐 Ex6_4
1. MyMath 클래스 작성 (메서드 작성)
2. MyMath 객체 생성
3. MyMath 객체 사용 (객체의 메서드 호출)
4. 작업을 마치면 다시 호출한 곳으로 돌아감 (return)
5. 메서드 호출 부분이 return result값으로 바뀜
6. result값이 result1에 저장 (오→왼)
𖤐 메서드의 실행흐름
return 의미
실행중인 메서드 종료 & 호출한 곳으로 되돌아감
1. return 값 = 값의 반환
2. 종료 return; (종료되니까 return 아래에 다른 구문을 넣을 수 X)
1. void형 메서드
return은 메서드의 종료를 의미
return 생략 가능 (컴파일러가 자동추가)
2. 반환 유형이 있는 메서드
반드시 return문 필요
int multiply(int x, int y) {
int result = x * y;
return result;
} // 반환 타입이 void가 아니므로 생략불가
int max(int a, int b) {
if(a > b)
return a; // 조건식이 참일때만 실행되므로 거짓일때는 ????
▼ 변경
if(a > b)
return a; // 조건식이 참일 때 실행
} else {
return b; // 조건식이 거짓일 때 실행
}
메서드 유형 예제
MethodEx01
class MethodEx01
package dayo4;
public class MethodEx01 {
// 반환은 O, 매개값 X - 1부터 10까지 합
static int calSum() {
int sum = 0;
for(int i = 1; i <= 10; i++) {
sum += i;
}
return sum;
}
// 반환은 O, 매개값 X - 문자열의 결과 반환
static String ranStr() { // 반환이 문자열이니까 최종적으로 str 문자열
String str = ""; // A + B + C.... + Z
for(char c = 'A'; c <= 'Z'; c++) {
str += c; // String + char = String 이므로 str 옆으로 A,B,C,D..가 붙으면 String이 반환됨
}
return str; // String의 기본값 null
}
// 반환은 O, 매개값 X - return 키워드의 활용
static String ranStr2() {
double d = Math.random();
if(d > 0.66) { // return을 사용하여 바로 원하는 메세지 출력하는 방법과
return "가위";
} else if(d > 0.33) {
return "바위";
} else {
return "보";
}
/*
String str;
if(d > 0.66) { // 마지막에만 return을 사용하여 한번만 호출하는 방법
str = "가위";
} else if(d > 0.33) {
str = "바위";
} else {
str = "보";
}
return str;
*/
}
}
class MethodEx01 - Main (호출하기)
package dayo4;
public class MethodEx01 {
public static void main(String[] args) {
// 메서드는 메서드 내부에 생성 할 수 없습니다.
// main밖에, 클래스 안에 어디서든 선언 할 수 있습니다.
// 메서드의 호출 - 이름()
// calSum();
// System.out.println( calSum() );
int result = calSum(); // return된 값:sum이 매개변수명 calSum()으로 return되어서 int형 result에 넣음(왼→오)
System.out.println(result); //55, result값 출력
int result2 = calSum(); // 결국 int형 result, result2는 호출을 하기 위해 임의로 만든 변수여서 이름은 딱히 상관 없음.
System.out.println(result2); //55
String result3 = ranStr();
System.out.println(result3); // ABCDEFGHIJKLMNOPQRSTUVWXYZ
String result4 = ranStr2(); // 조건문에 맞는 return값: 가위, 바위, 보가 ranStr2()으로 return되어서 String형 result4에 넣음(왼→오)
System.out.println(result4); // 랜덤으로 가위, 바위, 보 생성
// 1~10까지 합
// int sum = 0;
// for(int i = 1; i <= 10; i++) {
// sum += i;
// } 지금까지 main에서 쓰였던 함수, 조건들이 그대로 class로 들어감
} // main 끝
MethodEx02
class MethodEx02
package dayo4;
public class MethodEx02 {
// 반환 O, 매개변수 O
static int calSum(int end) { // 선언만 함(타입 이름) 나중에 호출할때 넣어줘야함 = 10
int sum = 0;
for(int i = 1; i <= end; i++) {
sum += i;
}
return sum;
}
// 반환 O, 매개변수 O - 매개변수가 여러개
static int calSum2(int start, int end) {
int sum = 0;
for(int i = start; i <= end; i++) {
sum += i;
}
return sum;
}
}
class MethodEx02 - Main (호출하기)
package dayo4;
public class MethodEx02 {
public static void main(String[] args) {
/*
* 매개변수 (parameter)
* 1. 매개변수는 메서드를 호출할 때 필요한 값을 전달하는 매개체
* 2. 매개변수는 몇 개 받을지 메서드를 선언할 때 결정해 줍니다.
*/
// int sum = 0;
// int end = 10;
// for(int i = 1; i <= end; i++) {
// sum += i;
// } 이 부분이 지금까지 하던 함수식
int result = calSum(10); // class에서 return된 sum이 claSum(10)으로 return되서 result에 저장됨
System.out.println("1~10까지 합: " + result); // 55
int result2 = calSum(100);
System.out.println("1~100까지 합: " + result2); // 5050
//calSum2();
int result3 = calSum2(10, 20);
System.out.println("10~20까지 합: " + result3);
} // main 끝
MethodEx03 - return
class MethodEx03
package dayo4;
public class MethodEx03 {
public static void main(String[] args) {
/*
* 반환유형 (return type)
* 1. 반환유형은 메서드가 돌려주는 값에 대한 타입
* 2. 반환유형이 있는 메서드는 호출 구문이 값이 되기 때문에 메서드의 매개값으로 사용될 수 있다.
* ex) println( 메서드 호출 )
* 3. 모든 메서드를 return을 만나면 강제종료 됩니다.
* 4. 리턴문 아래에는 코드를 작성할 수 없습니다.
*/
// 반환 O, 매개변수 O
static int add(int a, int b) {
int result = a + b;
return result; // 혹은 return a + b;
}
// 반환 X, 매개변수 O - 리턴이 없음, 단순 실행, 단순 부르기
static void sub(int a, int b) {
System.out.println("a-b= " + (a-b));
}
// void형에서 return - 종료
static void noReturn(String s) {
if(s.equals("hello")) {
System.out.println("실행종료");
return; // 종료
}
System.out.println(s);
}
}
class MethodEx03 - Main (호출하기)
package dayo4;
public class MethodEx03 {
public static void main(String[] args) {
/*
* 반환유형 (return type)
* 1. 반환유형은 메서드가 돌려주는 값에 대한 타입
* 2. 반환유형이 있는 메서드는 호출 구문이 값이 되기 때문에 메서드의 매개값으로 사용될 수 있다.
* ex) println( 메서드 호출 )
* 3. 모든 메서드를 return을 만나ㅏ면 강제종료 됩니다.
* 4. 리턴문 아래에는 코드를 작성할 수 없습니다.
*/
// result = add(3,5);
// System.out.println("결과: " + result);
// System.out.println( add(3,5) ); // 8()소괄호가 있으면 다 메서드
int result = add( add(1,2), add(2,3) ); // 안에서부터 생각하면 됨
System.out.println(result); // 8
// int r = sub(1, 2); // 틀림, void형으로부터 int를 받을 수 없음
// System.out.println( sub(1, 2) ); // 틀림
sub(1,2); // a-b= -1, 단순 부르기만 가능
noReturn("hello"); // 실행종료
noReturn("bbye"); // bbye
} // main 끝
Quiz - 메서드 유형 예제 업그레이드 ver.
Quiz21
class Quiz21
- 하나의 메서드에서는 하나의 값만 return가능
두번의 결과를 입력받을 때 2번 호출하면 됨
import java.util.Scanner;
public class Quiz21 {
// 메서드 3개
static int input() {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
// int b = scan.nextInt();
return a; // 결과 두개를 다 return 할 수 없음, 그냥 2번 호출해라
}
static int add(int a, int b){
return a + b;
}
static void show(int result) {
System.out.println("두 수의 합: " + result);
}
}
class Quiz21 - Main (호출하기)
import java.util.Scanner;
public class Quiz21 {
public static void main(String[] args) {
// 메서드로 변환, 호출
// // 1 - 입력받은 값을 반환시키고 (재활용)
// Scanner scan = new Scanner(System.in);
// int a = scan.nextInt();
// int b = scan.nextInt();
//
// // 2
// int result = a + b ;
//
// //3
// System.out.println("두 수의 합: " + result);
System.out.println("--------------------------------");
System.out.println("두 수 입력> ");
int a = input();
int b = input(); // 재활용
int result = add(a, b);
show(result);
} // end main
- input()으로 입력받은 a를 각각 int a, int b에 저장
- add(a, b)를 사용하여 더한값을 result에 저장
- show(int result)값으로 두 수의 합: result 결과를 출력
Quiz22
class Quiz22
- String str = null; // String str; 초기값 안줘도 둘중에 무조건 하나 실행
- static int maxNum(int c, int d) { // 3항 연산자로 최대값 구하는 공식
return c > d ? c : d ;
} - 잘 모르면 초기값 하나 만들어 놓고 그 친구에 대해서 return 건다.
- 받은 숫자값 % i == 0 ) { // 약수 구하는 공식
public class Quiz22 {
// method1 / x / x / "안녕"출력
static void method1() {
System.out.println("안녕");
}
// method2 / String / String / "전달 받은 매개 변수 리턴"
static String method2(String s) {
return s;
}
// method3 / ? / int, int, double / "세 매개 변수 리턴"
static double method3(double a) {
return a;
} // double로 a를 3번 호출해도 되는데 아래처럼 한꺼번에 써도됨
static double method3(int a, int b, double c) {
double d = a + b + c;
return d;
}
// method4 / String / int / 매개 변수가 짝수면 "짝수", 홀수면 "홀수" 리턴
static String method4(int num) {
String str = null; // String str; 초기값 안줘도 둘중에 무조건 하나 실행
if(num % 2 == 0) {
str = "짝수";
} else if (num % 2 == 1) {
str = "홀수";
}
return str;
}
// static String method4(int num) {
// if(num % 2 == 0) {
// return "짝수";
// } else {
// return "홀수";
// }
// }
// method5 / x / String, int / "매개 변수 int 만큼 String 반복 출력"
static void method5(int count, String text) {
for(int i = 1; i <= count; i++) {
}
System.out.println(text);
}
// maxNum / ? / ? / "매개변수 2개를 입력받아 큰 수 리턴"
static int maxNum(int c, int d) {
int max = 0;
if(c > d) {
max = c;
} else if ( c < d) {
max = d;
}
return max;
}
// static int maxNum(int c, int d) {
// return c > d ? c : d ;
// }
// abs / ? / int / "절대값 리턴"
static int abs(int e) {
if(e < 0) {
return -e;
} else {
return e;
}
}
// 홀수 - "자", 짝수 - "바"
static String java(int num) { // 숫자 → 문자열로 출력하는 방법 "" += 붙이기
String s = ""; // 잘 모르면 초기값 하나 만들어 놓고 그 친구에 대해서 return 건다.
for(int i = 1; i <= num; i++) {
if(i % 2 == 1) { // i = 1, 3, 5, 7...
s += "자"; // s 옆에 "자"를 붙임
} else { // i = 2, 4, 6, 8...
s += "바"; // s 옆에 "바"를 붙임
}
}
// return을 for문 안에서 쓰는 경우도 있음. 단, 여기서는 넣으면 시작하자마자 종료임.
return s;
}
// 자연수 n을 입력받아 n의 약수를 모두 더한 것을 리턴하는 함수를 완성하세요.
static int sum(int n) {
int sum = 0;
for(int i = 1; i <= n; i++) {
if( n % i == 0 ) { // 약수 구하는 공식
sum += i;
}
}
return sum;
}
}
class Quiz22 - Main (호출하기)
public class Quiz22 {
public static void main(String[] args) {
method1();
String result = method2("hello");
System.out.println(result);
int a = (int)method3(1);
int b = (int)method3(2);
double c = method3(3.5);
System.out.println(a);
System.out.println(b);
System.out.println(c);
method3(1, 2, 3.5);
String str = method4(2); // str, 여기서는 2가 매개 변수
System.out.println(str); // 정수를 입력했는데 반환이 String이니까 이렇게 해줌
method5(3, "라"); // void형이니까 단순 실행
int max = maxNum(10, 6);
System.out.println(max);
result = abs(-5);
System.out.println(result);
String s = java(5);
System.out.println(s);
int n = sum(5);
System.out.println(n);
} // end main
오늘 하루
기억에 남는 부분
- 하나의 메서드를 하나의 기능을 수행
- 메서드 뒤에는 ()붙음
- 매개변수, 반환값 형식 확인 중요하다
어려운 부분
- 메서드에서 어떤 것을 return해야할지 모르겠음
- 메서드 클래스를 만들어서 출력하는 로직이 잘 이해가 안감
문제 해결 부분
- 매개변수 만큼 문자 반복 출력 가능
- 절대값 리턴할 때 새로운 a라는 변수를 만들었는데 그럴필요 없었음
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] object(객체), class(클래스), 변수(멤버/지역), 생성자(constructor) (0) | 2022.10.05 |
---|---|
[Java] 객체 배열(Array of Objects), 메서드 실행, 피보나치 수열 (0) | 2022.10.05 |
[Java] String 클래스, 문자열 자르기(subString, split, toCharArray) (0) | 2022.09.30 |
[Java] Array insert, update, delete (배열의 삽입, 수정, 삭제) (0) | 2022.09.29 |
[Java] 탈출문(break, continue, return), 무한루프 while(for), array (0) | 2022.09.28 |