본문 바로가기
Programming Language/Java

[국비] Java 내용정리 Day08

by tpleehan 2021. 11. 5.

메서드

  • 메서드란 객체의 기능을 표현하는 코드 블록을 말한다.
  • 수학의 함수처럼 어떤 데이터를 메서드에 전달하면 특정 값을 반환하는 형태로 만들어져 있다.

Programming Method

  • 메서드는 반복되는 코드 블록에 이름을 붙여놓은 것이다.
  • 메서드는 반복되는 코드를 줄여주고 좀 더 구조화 시켜서 우리가 코드를 알아보기 쉽게 한다. (코드의 모듈화)
  • 메서드는 선언하는 과정과 호출하는 과정으로 나눠진다.
  • 메서드의 선언은 메서드 내부에서는 불가능하다. 
    새로운 메서드의 선언은 반드시 메서드 블록 외부 and 클래스 블록 내부에서만 가능하다.
  • 메서드의 호출은 메서드나 생성자 내부에서만 가능하다.
  • 메서드의 호출은 곧 메서드를 사용하는 것을 의미한다.
    1. 메서드가 필요로 하는 데이터(매개값)를 호출부로 전달하면
    2. 그 값을 받아서 메서드 내부로 전달하고, 로직이 실행된다.
    3. 실행 결괏값을 메서드를 호출한 곳으로 다시 반환한다.
    4. 반환된 값은 변수에 담아서 저장하거나, 출력하는 등 다양하게 활용된다.
public class MethodExample1 {

	//메서드의 선언
	static int calcTotal(int x) {
		int total = 0;
		for(int i = 1; i <= x; i++) {
			total += i;
		}
		return total;
	}
	
	public static void main(String[] args) {
		int result = calcTotal(10); //int result = 55;
		System.out.println(result);
		
		System.out.println("1~100까지의 누적합: " + calcTotal(100));
		System.out.println("1~200까지의 누적합: " + calcTotal(200));
		System.out.println("1~300까지의 누적합: " + calcTotal(300));
		System.out.println("1~400까지의 누적합: " + calcTotal(400));
		System.out.println("1~500까지의 누적합: " + calcTotal(500));
		System.out.println("1~600까지의 누적합: " + calcTotal(600));
		System.out.println("1~700까지의 누적합: " + calcTotal(700));		
	}

}

메서드 선언 방식

메서드 선언 예시

static int calcTotal(int x) {
	int total = 0;
    for (int n = 1; n <= x; n++) {
    	total += n;
    }
    return total;
} // end calcTotal method
  • 위 코드는 1부터 x까지의 총합을 구하는 코드를 구성할 목적으로 선언한 예시이다.
  • 메서드는 코드들을 기능단위로 사용하기 위한 목적으로 선언한다.
  • 메서드는 메서드 안에서는 선언할 수 없다.

메서드 호출

public static void main(String[] args) {
	System.out.println("메서드 테스트 시작!");
	
    int a = calcTotal(10);
	System.out.println(a);
    
    int b = calcTotal(50);
	System.out.println(b);
    
    System.out.println(calcTotal(100));    
} // end main method
  • 메서드를 선언을 했더라도 선언한 자체로는 사용이 불가능하다.
  • 메서드는 반드시 호출(call)을 통해 기능을 동작시켜야 한다.
  • 호출 시 메서드의 이름과 함께 메서드에게 전달할 값을 소괄호 안에 넣어준다.

매개 변수 (parameter, argument)

  • 매개변수란 메서드 실행을 위해 필요한 데이터를 메서드 내부로 전달할 목적으로 사용하는 변수이다.
  • 모든 메서드에서 매개변수가 필요한 것은 아니다.
    예) 사람은 일기를 쓰기 위해 펜이라는 매개체가 필요하지만 일기를 읽기 위해서는 다른 도구가 없어도 되는 것과 같다.
  1. 매개변수는 메서드를 호출할 때 메서드 실행에 필요한 값들을 메서드 내부로 전달하는 매개체 역할을 한다.
  2. 메서드 호출부에서 어떤 매개값을 전달하느냐에 따라 메서드의 실행 결과는 달라질 수 있다.
  3. 매개값을 몇 개 받아서 사용할지는 메서드를 선언할 때 선언부에서 ()안에 미리 개수와 타입을 지정한다.
    256개를 선언할 수 있지만 순서를 기억하기 힘들기 때문에 사용하지 않는다.
    2~3개가 보편적이고 4개정도 사용하지만 그 이상은 사용할 일이 없다.
  4. 매개변수를 하나도 선언하지 않을 수도 있다. 이 때는 메서드의 선언부에 () 내부를 비워둔다.
    그리고 호출할 때도 ()를 비워서 호출한다.
    괄호()는 메소드 함수로 표현하기 때문에 괄호를 지우면 변수로 인식한다.
  5. 매개변수의 이름을 지을 때는 호출자가 선언부로 돌아와서 매개값을 확인하지 않게, 어떠한 값을 담는 변수인지 그 뜻을 알기 쉽게 지어주면 서로에게 좋다.

매개변수의 수를 모를 경우

  • 메서드의 매개변수는 메서드를 선언할 때 미리 필요한 만큼의 매개변수를 나열하여 선언한다.
  • 예를 들면 두 수의 합을 구하는 메서든느 정수 2개가 매개 변수로 필요하다.
  • 하지만 n개의 합을 구하는 메서드와 같이 매개 변수의 수를 사전에 모를 경우 배열을 이용한다.
public class MethodExample2 {

	//x부터 y까지의 누적합계를 구하는 메서드
	static int calcRangeTotal(int start, int end) {
		
		int total = 0;
		for(int i = start; i <= end; i++) {
			total += i;
		}
		return total;
	}
	
	//매개변수가 필요 없는 경우.
	static String selectRandonFood(){
		double rn = Math.random();
		if(rn > 0.66) {
			return "치킨";
		} else if (rn > 0.33) {
			return "족발";
		} else {
			return "삼겹살";
		}
	}
	
	//정수 n개를 전달하면 그 정수들의 총 합을 리턴하는 메서드
	static int calcNumberTotal(int[] nums) {
		
		int total = 0;
		//forEach문
		for(int n : nums) {
			total += n;
		}
		return total;
		
		/*
		일반 for문
		for(int i=0; i < nums.length; i++) {
			total += nums[i];
		}
		return total;
		 */
	}
	
	//가변인수(가변 파라미터)를 사용한 매개변수 작성.
	//콤마로 나열되어 들어오는 여러개의 값을 배열로 묶어서 내부로 전달
	static int calcNumberTotal2(int... nums) {
		int total = 0;
		for(int i : nums) {
			total += i;
		}
		return total;
	}
	
	public static void main(String[] args) {

		int result = calcRangeTotal(3, 7); 
		System.out.println(result);
		
		System.out.println("오늘의 점심: " + selectRandonFood());
	
		int[] arr = {10, 30, 50, 70, 90, 110};
		int sum = calcNumberTotal(arr);
		System.out.println("누적합: " + sum);
		
		sum = calcNumberTotal(new int[] {1, 2, 3, 4, 5, 6, 7});
		System.out.println("누적합: " + sum);
		
		//가변 파라미터에 값을 보낼 때는 콤마로 쭉 나열하거나
		//배열로 포장해서 보내도 된다..
		sum = calcNumberTotal2(1,2,3,4,5,6,7);
		System.out.println("누적합: " + sum);
	}

}

반환값, 반환 유형 (return value, return type)

  1. 반환값이란 메서드의 실행 결과값을 의미한다.
  2. 매개변수는 여러 개 존재할 수 있지만, 반환값은 오직 한 개만 존재해야 한다.
    특정 조건을 통해 반환값을 줄 수 있다.
    하지만 특정 조건 이외엔 반환은 2번이 될 수 없다.
  3. 전달되는 값의 타입을 반환 유형이라고 하며, 메서드를 선언할 때 메서드 이름 앞에 반드시 반환 유형을 명시해야 한다.
  4. return이라는 키워드를 사용하며 return 뒤에 전달할 값을 지정한다. (변수, 상수)
  5. 반환값이 있는 메서드는 호출문 자체가 하나의 값으로 처리될 수 있기 때문에 반환값을 다른 변수에 대입할 수도 있고, 다른 메서드의 매개값으로도 처리될 수 있다.
  6. 모든 메서드가 반환값이 있는 것은 아니다. 메서드 실행 후에 반환할 값이 딱히 없다면 return을 생략해도 된다.
  7. 이 때는 반환유형을 메서드를 선언할 때 비워두지 말고 void라는 키워드를 작성해야 한다.
    반환값이 없기 때문에 변수에 대입할 수 없고 출력할 수 없다.
  8. 모든 메서드는 return을 만나면 강제로 메서드가 종료된다.
    따라서 조건 없이 return문 아래에 코드를 작성할 수 없다.
    void메서드에서는 return키워드를 탈출 기능으로 사용할 수 있다.
    반복문과 switch에서 return이 가능하고 조건문에선 사용할 수 없다.
public class MethodExample3 {

	static int add(int n1, int n2) {
		return n1 + n2;
//		System.out.println("호출"); (x)
	}
	
	static int[] operateTotal(int n1, int n2) {
		return new int[] {add(n1, n2), n1 - n2, n1 * n2, n1 / n2};
	}
	
	static double[] calcArrayTotal(int[] nums) {
		int total = 0;
		for(int n : nums) {
			total += n;
		}
		double avg = (double) total / nums.length;
		return new double[] {total, avg};
	}
	
	static void multi(int n1, int n2) {
		int result = n1 * n2;
		System.out.printf("%d x %d = %d\n", n1, n2, result);
	}
	
	static void divide(int n1, int n2) {
		if(n2 == 0) {
			System.out.println("0으로 나눌 수 없습니다.");
			return;
		}
		int result = n1 / n2;
		System.out.printf("%d / %d = %d\n", n1, n2, result);
	}
	
	public static void main(String[] args) {
		
		int r1 = add(3,8); //int r1 = 11;
		int r2 = add(10,15); //int r1 = 25;
		int r3 = add(add(4,6), add(7,8));
		System.out.println(r3);
		
		int[] totalResult = operateTotal(30, add(2,4));
		System.out.println("30 + 6 = " + totalResult[0]);
		System.out.println("30 - 6 = " + totalResult[1]);
		System.out.println("30 * 6 = " + totalResult[2]);
		System.out.println("30 / 6 = " + totalResult[3]);		
		
		/*
         # Method Quiz)
		 1. 메서드 이름은 calcArrayTotal로 정의한다.
		 2. 이 메서드는 정수 배열을 하나 전달 받아서 해당 배열 내부에 있는
		    모든 정수의 합계(int)와 평균(double)을 '배열'에 담아서 리턴하는 메서드이다.
		 3. 2번에 정의한 조건대로 메서드를 선언하고, 실제로 main에서 호출해서
		    합계와 평균(소수 둘째 자리까지)을 출력한다.
		    {57, 89, 78, 91, 93, 47}
		 */		
		int[] numbers = {57, 89, 78, 91, 93, 47};
		double[] result = calcArrayTotal(numbers);
		
		System.out.printf("합계: %d, 평균: %.2f\n", (int) result[0], result[1]);
//		System.out.printf("합계: %.0f, 평균: %.2f\n", result[0], result[1]); //result[0] int 형변환을 안하고 %.0f로 가능
		
		System.out.println("----------------------------------------");
		
		/*
		 - 반환값이 없는 void 타입의 메서드는 값이 돌아오지 않기 때문에
		   실행 결과를 변수에 저장할 수 없고, 다른 메서드의 매개값으로도
		   사용이 불가능 하다.
		 - 반드시 단독 호출하여 사용해야 한다.
		 - void메서드는 단순히 동작을 지시하는 역할을 수행한다.
		 */
		
//		int r4 = multi(10, 7); (x)
//		System.out.println(multi(10, 7)); (x)
		multi(10,7);
		multi(add(3,4), add(4,7));
//		add(multi(4,4), multi(5,6)); (x)
		
		divide(20, 0);
		
	}

}
문제)
모든 메서드를 생성 후 main에서 호출해서 사용한다.
메서드 명 반환 유형 매개 변수 기능
method1 x x "안녕" 출력
method2 String String "전달 받은 매개 변수 리턴"
method3 x int, int, double "세 매개변수 합 리턴"
method4 String int "매개 변수가 짝수면 '짝수', 홀수라면 '홀수' 리턴"
method5 x String, int "매개 변수 int만큼 String 반복 출력"
maxNum ? ? "매개 변수 2개를 입력받아 큰 수 리턴"
abs ? int "절대값 리턴"
method6 int ? "0 ~ 매개변수까지 합을 저장해서 리턴"
method7 int int[] "배열의 길이를 리턴"
method8 String[] String, String "매개 변수를 배열에 저장하여 배열 리턴"

반환유형, 매개변수의 x는 반환과 유형이 없는 것이고, 물음표(?)는 고민과 생각을 해서 풀기

문제2)
1. java 함수는 매개변수로 숫자를 받는다.
2. 매개변수 숫자길이만큼 패턴 "자바자바자바..."를 리턴하는 함수를 완성한다.
    1이면 자
    2이면 자바
    3이면 자바자
    4이면 자바자바

import java.util.Arrays;

public class MethodQuiz01 {

	static void method1() {
		System.out.println("안녕");
	}
	
	static String method2(String str){
		return str;
	}
	
	static double method3 (int n1, int n2, double d){
		return n1 + n2 + d;
	}
	
	static String method4 (int i) {
		if(i % 2 == 0) {
			return "짝수";
		} else {
			return "홀수";
		}
	}
	
	static void method5 (String s, int i) {
		for(int j = 1; j <= i; j++) {
			System.out.println(s);
		}
	}
	
	static int maxNum (int i, int j) {	
		if(i > j) {
			return i;
		} else {
			return j;
		}
//		return i > j ? i : j; //삼항 연산자
	}
	
	static int abs (int i) {	
		return i > 0 ? i : -i;
	}
	
	static int method6 (int i) {	
		int total = 0;
		for(int j = 0; j <= i; j++) {
			total += j;
		}
		return total;
	}
	
	static int method7 (int[] arr) {	
		return arr.length;
	}
	
	static String[] method8 (String s1, String s2) {	
		return new String[] {s1, s2}; 
	}
	
   
	static String java (int i) {
		String str = "";

		for(int j = 1; j <= i; j++) {
			if(j % 2 != 0) {
				str += "자"; //홀수
			} else {
				str += "바"; //짝수
			}
//			str += (j % 2 != 0 ? "자" : "바"); //삼항 연산자
		}
		
		//배열로 넣어서 문자열에 들어 있는 값을 
		//하나씩 대입하려고 했지만 배열은 답이 아니었다. 
//		String[] arr = new String[str.length()];
//		for(int j = 0; j < arr.length; j++) {
//			arr[j] = str;
//		}
		return str;
	}
	
	public static void main(String[] args) {
		
		method1();
		
		System.out.println(method2("안녕하세요."));
		
		System.out.println(method3(3, 4, 3.14));
		
		System.out.println(method4(23));
		
		method5("반복", 3);
		
		System.out.println(maxNum(43, 96));
		
		System.out.println(abs(-43));
		
		System.out.println(method6(100));
		
		System.out.println("배열의 길이: " + method7(new int[] {1, 2, 3, 4, 5}));
		
		System.out.println(Arrays.toString(method8("자바", "java")));
		

		String str = java(5);
		System.out.println(str);
		System.out.println(java(9));
	}

}

'Programming Language > Java' 카테고리의 다른 글

[국비] Java 내용정리 Day10  (0) 2021.11.10
[국비] Java 내용정리 Day09  (0) 2021.11.06
[국비] Java 내용정리 Day07  (0) 2021.11.03
[국비] Java 내용정리 Day06  (0) 2021.11.01
[국비] Java 내용정리 Day05  (0) 2021.10.29

댓글