Java | 메소드method

설탕·2023년 9월 19일
0

Java

목록 보기
2/4
post-thumbnail

🥊 이 글은 제대로 파는 자바 - Java 끝.장.내.기 (얄팍한 코딩사전) 강의 내용을 정리한 글입니다.

메소드

  • 타 언어의 함수function과 같은 개념
  • Java는 모든 것이 클래스의 요소이므로 메소드method라 부름

메소드의 의미

  • 반복을 최소화
    • 한 번 이상 실행될 수 있는 일련의 작업들을 묶어두는 것
  • 값을 받고 연산하여 결과값을 반환 - 함수

매개변수의 개수가 정해지지 않은 메소드

// ... 연산자: 해당 위치 뒤로 오는 연산자들을 배열로 묶음
// int[] (배열 자체를 받음)과는 다름!
static double getAverage(int... nums) {
	double result = 0.0;
    for (int num : nums) {
    	result += num;
    }
    return result / num.length;
}

public static void main(String[] args) {
	double avg = getAverage(3, 91, 14, 27, 4); // avg: 27.8
    
    // 배열을 넣으면 자동으로 펼쳐져 인식됨
    int[] numbers = {3, 91, 14, 27, 4};
    double avgOfArr = getAverage(numbers); // avgOfArr: 27.8
}

메소드 오버로딩

  • 같은 메소드 이름, 다른 매개변수
  • 다른 자료형의 값들로 같은 성질의 작업을 정의할 때
static int add(int a, int b) { return a + b; }

// 매개변수의 개수가 다름
static int add(int a, int b, int c) { return a + b + c; }

// 매개변수의 자료형이 다름
static double add(double a, double b) { return a + b; }

// 매개변수의 자료형 순서가 다름
static String add(String a, char b) { return a + b; }
static String add(char a, String b) { return a + b; }

// ⚠️ 반환 자료형이 다른 것은 오버로딩 안 됨 - 다른 함수명 사용
static double add(int a, int b) { return (double) (a + b); } // error!

원시형 매개변수 vs 참조형 매개변수

// 원시값은 '복사해서' 가져옴 - 메소드 내부에서 값을 변경해도 원본에 영향 X
static void modifyIntArg (int num) {
	System.out.printf("수정 전: %d%n", num++);
    System.out.printf("수정 후: %d%n", num);
}

// 참조값은 주소값이므로 원본 그 자체를 가리킴
static void modifyArrElem (int[] arr) {
	System.out.printf("수정 전: %d%n", arr[1]++);
    System.out.printf("수정 후: %d%n", arr[1]);
}

public static void main(String[] args) {
	int intNum = 3;
    modifyIntArg(intNum); // 수정 전: 3 수정 후: 4 intNum: 3
    
    int[] intNums = {1, 2, 3};
    
    // 배열은 참조형이지만 그 안의 값(int)들은 원시형
    modifyIntArg(intNums[0]); // 수정 전: 1 수정 후: 2
    
    // 참조형인 배열 자체를 인자로 사용
    modifyArrElem(intNums); // 수정 전: 2 수정 후: 3 intNums: [1, 3, 3] 
}

재귀 메소드

  • 스스로를 호출하는 메소드
  • 호출 시마다 메모리에 스택 축적 - 초과 시 스택 오버플로우stack overflow 에러
static int factorial (int num) {
	return num == 0 ? 1 : num * factorial(--num);
}

  • 다른 메소드를 호출한 메소드는 호출된 메소드가 종료될 때까지 메모리에 남아 있음
    • 호출이 반복될수록 위와 같이 메소드들이 쌓이게 됨

꼬리 재귀 최적화

  • 재귀 코드를 내부적으로 루프 형태로 바꿔서 스택이 쌓이지 않도록 함
  • Java에서는 현재 기본적으로 제공하지 않음 (보안 등 문제)
  • 반복 횟수가 너무 많아지는 작업에는 사용하지 말 것!
profile
공부 기록

0개의 댓글