[JAVA] JAVA 프로그래밍 기초 교육 : 메소드(Method)
교재 : JAVA 프로그래밍 기초 - 09. 메소드
# 메소드
메소드란? 함수의 한 종류로, 프로그램에 실시하게 하는 동작(처리)의 집합을 기술한 것. 또는, 그 동작의 집합을 호출하는 기술
자바 기존 메소드는 JAVA API라 불리는 문서에 정리되어있음.
Java API(Application Program Interface)
외에는 직접 함수를 정의하고 호출할 수 있다.
· 메소드 정의
메소드를 정의하는 위치는 main메소드 전 후 어디든 상관없이 선언이 가능하다.
단, 클래스 내에 있어야하며 중첩되면 안된다.
static 수식자 리턴형 메소드명(인수) {
처리내용;
return 문;
}
선언된 메소드 호출시 :
메소드명(인수);
① static 변수
위에서는 static 수식자(예약어)로 사용되었다.
static 변수는 클래스 전반에서 공통으로 사용할 수 있는 기준 변수이다.
인스턴스와 상관없이 먼저 생성되고, 그 값을 모든 인스턴스가 공유한다.
클래스에 기반한 변수라 하여 '클래스 변수(class variable)'이라고도 한다.
② 리턴값의 형태
해당 메소드로 처리해 얻어지는 결과값의 형태를 지정한다.
리턴값을 가지는 메소드는 반드시 미리 선언한 리턴형으로 반환값을 돌려주어야 한다.
반환값을 가지지 않는 메소드의 경우에는 리턴형 자리에 'void'라고 기술한다.
(void : 비어있다는 의미로 '반환할 값이 없음'을 뜻함)
③ 메소드명
메소드명은 소문자로 시작하며 2개 이상의 단어를 조합할 때 2번 째 단어의 첫글자를 대문자로 기재한다. (카멜케이스)
④ 인수
실인수 : 메소드를 호출할 때 기술하는 인수.
메소드 선언시에 쓰여진 인수의 형태, 기술한 순서, 개수가 일치하여야 한다.
가인수 : 메소드를 정의할 때 기술하는 인수.
가인수는 {} 블록 내에서만 유효하다.
인수를 받지 않는 경우 : (); 괄호안에 기술하지 않는다.
⑤ 처리 내용
인수와 반환값의 유무에 의해 메소드의 조합은 변화한다.
[4가지 패턴]
· 인수 有 - 리턴 값 有
· 인수 有 - 리턴 값 無
· 인수 無 - 리턴 값 有
· 인수 無 - 리턴 값 無
⑥ return 예약어
메소드의 결과 값을 반환해주는 예약어
return 뒤에 오는 변수를 반환한다. (반환 값의 자료형을 리턴값(반환형)이라 한다)
[예제] 학생 4명의 점수를 합격기준점으로 합격/불합격 여부를 판단하기
package jokun.chap09;
public class Method {
static void checkPass (int point){
if(point >= 50){
System.out.println(point + "점으로 합격!");
}else {
System.out.println(point + "점으로 불합격!");
}
System.out.println("==================");
}
public static void main(String[] args) {
// 점수를 관리하는 변수 및 초기화
int pointA = 85;
int pointB = 32;
int pointC = 60;
int pointD = 40;
System.out.print("A님, ");
checkPass(pointA);
System.out.print("B님, ");
checkPass(pointB);
System.out.print("C님, ");
checkPass(pointC);
System.out.print("D님, ");
checkPass(pointD);
}
}
▽ 실행 화면 ▽
# 메소드 기술
· 인수 활용
[예제] 같은 자료형의 인수를 가진 메소드
package jokun.chap09;
public class TwoArgument {
static void checkPass(int point, int passPoint) {
if (point >= passPoint) {
System.out.println(point + "점 합격!");
} else {
System.out.println(point + "점 불합격!");
}
System.out.println(" ======= ");
}
public static void main(String[] args) {
int pointA = 85;
int pointB = 32;
int pointC = 60;
int pointD = 40;
System.out.print("A님, ");
checkPass(pointA, 50);
System.out.print("B님, ");
checkPass(pointB, 50);
System.out.print("C님, ");
checkPass(pointC, 50);
System.out.print("D님, ");
checkPass(pointD, 50);
}
}
메소드 선언시에 쓰여진 인수의 형태, 기술한 순서, 개수가 일치!
▽ 실행 화면 ▽
[예제] 여러 자료형의 인수를 가진 메소드
package jokun.chap09;
public class VariousArgument {
static void checkPass(String name, int point, int passPoint) {
System.out.print(name + "님, ");
if (point >= passPoint) {
System.out.println(point + "점 합격!");
} else {
System.out.println(point + "점 불합격!");
}
System.out.println(" ======== ");
}
public static void main(String[] args) {
int pointA = 85;
int pointB = 32;
int pointC = 60;
int pointD = 40;
checkPass("A", pointA, 50);
checkPass("B", pointB, 50);
checkPass("C", pointC, 50);
checkPass("D", pointD, 50);
}
}
▽ 실행 화면 ▽
[예제] 인수에 배열의 요소 넣기
package jokun.chap09;
public class MethodWithArrayElement {
static void checkPass(int point, int pointPass){
if(point >= pointPass){
System.out.println(point + "점 합격!");
}else{
System.out.println(point + "점 불합격!");
}
System.out.println(" ======== ");
}
public static void main(String[] args) {
// String형의 이름을 관리하는 배열의 선언과 초기화
String[] aryName = {"A", "B", "C", "D"};
// int형 점수를 관리하는 배열의 선언과 초기화
int[] point = {85, 32, 60, 40};
// 커트라인(포인트패스) 초기화
int pointPass = 50;
for(int i = 0; i < aryName.length; i++){
System.out.print(aryName[i] + "님, ");
checkPass(point[i] , pointPass);
}
}
}
▽ 실행 화면 ▽
· 배열 변수 활용
배열 선언
static 수식자 리턴형[] 메소드명(자료형[] 형명) {
처리내용;
return 문;
}
배열을 사용하는 경우 리턴값,리턴형,인수형이 기존 변수 선언에서 배열 선언으로 바뀐다. (외에 기본 구성은 같음)
static int[] method(double[] doubleArray) {
실행문장;
return intArray;
}
[예제] 인수에 배열의 요소 넣기 ①
package jokun.chap09;
public class MethodWithArrayElement {
static void checkPass(int point, int pointPass){
if(point >= pointPass){
System.out.println(point + "점 합격!");
}else{
System.out.println(point + "점 불합격!");
}
System.out.println(" ======== ");
}
public static void main(String[] args) {
// String형의 이름을 관리하는 배열의 선언과 초기화
String[] aryName = {"A", "B", "C", "D"};
// int형 점수를 관리하는 배열의 선언과 초기화
int[] point = {85, 32, 60, 40};
// 커트라인(포인트패스) 초기화
int pointPass = 50;
for(int i = 0; i < aryName.length; i++){
System.out.print(aryName[i] + "님, ");
checkPass(point[i] , pointPass);
}
}
}
▽ 실행 화면 ▽
[예제] 인수에 배열의 요소 넣기 ②
package jokun.chap09;
import org.jetbrains.annotations.NotNull;
public class ArrayArgument {
static void display(String @NotNull [] aryData) {
for (int i = 0; i < aryData.length; i++) {
System.out.println(aryData [i]);
}
}
public static void main(String[] args) {
String[] jeju = { "성산일출봉", "한라산","만장굴" };
System.out.println(" === 제주 3대 관광지 === ");
display(jeju);
}
}
▽ 실행 화면 ▽
[예제] 배열의 요소를 직접 변경하는 메소드 만들기
package jokun.chap09;
public class ChangeArrayElement4 {
static void changeJeju(String[] aryData){
aryData[0] = "쇠소깍";
aryData[1] = "이오테우해변";
aryData[2] = "새별오름";
}
public static void main(String[] args) {
String[] jeju = { "성산일출봉", "한라산","만장굴" };
System.out.println(" === 제주 3대 관광지1 === ");
for(int i = 0; i < jeju.length ; i++){
System.out.println("jeju[" + i + "]값은、" + jeju[i]);
}
changeJeju(jeju);
System.out.println(" === 제주 3대 관광지2 === ");
for(int i = 0; i < jeju.length ; i++){
System.out.println("jeju[" + i + "]값은,、" + jeju[i]);
}
}
}
▽ 실행 화면 ▽
[예제] 리턴값으로 배열 리턴하기
package jokun.chap09;
public class ReturnValueArray {
public static void main(String[] args) {
String[] jeju = new String[2]; //변수 2개로 만들어놨지만
jeju = makeArray("성산일출봉", "한라산","만장굴"); // jeju를 makeArray라는 3개짜리 변수로 다시 지정함
for(int i = 0; i < jeju.length ; i++){
System.out.println("jeju[" + i + "]값은, " + jeju[i]);
}
}
static String[] makeArray(String name1,String name2,String name3){
String[] localArray = {name1,name2,name3};
return localArray;
}
}
▽ 실행 화면 ▽
[연습문제]
9-7 연습문제
덧붙여 연습 문제의 소스 코드를 작성하는 경우는, 이하의 조건으로 작성해 주세요.
소스 폴더 : javaBasic/src
패키지 : chap09exercise
질문 1
다음의 질문 ①~⑤에 대해 ○인가×로 대답하십시오.
① 메소드는 main 메소드 이외에도 정의할 수 있다. O
② 메소드는 정의되어 있으면 자유롭게 호출하여 사용할 수 있다. O
③ 메소드에 건네지는 인수는, 수가 맞으면 타입은 어느 것이어도 된다. X
④ 메소드로부터 호출원에게 돌려주어지는 반환값은, 임의의 형태를 돌려줄 수 없다. O
⑤ 메소드를 정의하는 경우, 인수와 반환값은 필수이다. X
질문 2
다음의 ①~④의 메소드에 대해서 메소드명, 반환값과 인수의 형태를 각각 대답해 주세요.
① static int squareNum(int num){
return num*num;
System.out.println(str);
String title=” 메서드 연습 문제 2″;
return title;
}
메소드명 : returnTitle, 반환값 형태 : String , 인수의 형태 : 인수 없음
④ static void printStr2(){
System.out.println(“문자열을 표시합니다.”);
}
메소드명 : rrintStr2, 반환값 형태: void(X) ; , 인수의 형태 : 인수 없음
질문 3
다음의 사양을 가지는 메소드를 정의해 주세요.
반환 값 : double 형 area
인수 : int 형 base, int 형 height
처리 내용 :
저변과 높이의 값을 인수로 받아 삼각형의 면적의 값을 돌려준다.
static double triangle(int base, int height) {
double area = (double) base * height / 2;
return area;
질문 4
다음의 사양을 가지는 메소드를 정의해 주세요.
메소드명 : calcSum
반환값 : int 형 sum
인수 : int 형 num
처리 내용 :
1 ~ 인수의 수치만큼 루프 처리를 실시해, 그 루프의 카운터치의 합계를 구해 호출원에게 그 합계치를 돌려준다.
※반복은 for문을 사용하는 것.
static int calcSum(int num) {
int sum = 0;
for (int i = 1; i <= num; i++) {
sum += 1;
}
return sum;
}
질문 5
다음의 소스 코드 Practice0901.java를 실행했을 경우의 ①~⑤의 설문에 대해 대답해 주세요.
① evaluate 메소드의 반환값과 인수의 형태는 무엇인가.
반환값 형태 : char, 인수의 형태 : int
② 호출원의 evaluate 메소드에 설정된 실 인수의 값은 몇개인가.
1개
③ evaluate 메소드의 가인수의 변수 num에 대입되는 값은 몇개인가.
5
④ evaluate 메소드내의 반환값으로 설정되는 변수 eva의 값은 몇개인가.
1개
⑤ 메인 메소드의 변수 eva에 대입되는 값은 몇개인가.
A
Practice0901.java
package chap09Excercise;
public class Practice0901 {
/*
* 1~5평가를 A~E평가로 변환하는 방법
*/
static char evaluate(int num){
char eva;
switch(num){
case 1:
eva = 'E';
break;
case 2:
eva = 'D';
break;
case 3:
eva = 'C';
break;
case 4:
eva = 'B';
break;
case 5:
eva = 'A';
break;
default:
eva = 'Z';
break;
}
return eva;
}
public static void main(String[]args){
char eva = evaluate(5);
System.out.println("평가는 "+eva+" 입니다");
}
}
질문 6
다음의 실행 결과가 되는 소스 코드 Practice0903.java를 작성 사양에 근거해 작성해 주세요.
・main 메소드:프로그램을 실행하는 메소드
・dispLine 메소드:키보드 입력으로부터의 수치를 받아, 수치분만 루프 처리를 실시합니다.
반환값:없음 인수:int형 num
·outSign 메소드:화면에 「*」를 출력합니다.
반환값:없음 인수:없음
·Scanner 클래스를 이용해 키보드로부터 수치의 입력을 실시합니다.
· 키보드의 입력 숫자를 인수로 dispLine 메서드를 호출합니다.
・반복 처리를 2중으로 이용하여 인수의 수치분만큼 반복 처리를 실시합니다.
· 내부 루프 처리 내에서 outSign 메서드를 호출합니다.
・내측의 루프 처리가 끝나면 개행을 실시합니다.
package jokun.chap09;
import java.util.Scanner;
public class Practice0903 {
static void outSign() {
System.out.print("* ");
}
static void dispLine(int num) {
for (int i = 0; i < num; i++){
for (int j = 0; j < num; j++){
outSign();
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("숫자입력");
int num = sc.nextInt();
dispLine(num);
}
}