"안녕하세요 Amigo! 자신만의 방법을 사용하여 작업을 해결하고 방법을 만드는 것이 얼마나 편리한지 깨닫기를 바랍니다. 이제 가장 흥미로운 주제에 대해 이야기해 봅시다."

"내 흥미를 끌었군, 디에고... 새로운 주제?"

"내 어린 로봇이여, 모든 주제가 새롭다! 그리고 이것도 예외는 아니다. 다시 한번 말하지만 그것은 메소드에 관한 것이다. 메소드에 인수를 전달할 수 있는 것과 같은 메소드에서 이미 알아차렸을 것이다. 일단 메소드 내부에 System.out.println()들어가면 , 매개변수라고 합니다."

"매개 변수는 우리가 괄호 안에 쓰는 것입니까?"

"네, 맞습니다. 사실 매개변수는 메서드를 만들고 사용함으로써 얻을 수 있는 이점을 크게 향상시킵니다."

"나는 당신이 그것들을 사용하는 것에 대해 말하는 것을 이해하고, 내가 이미 그것을 했다는 것이 밝혀졌습니다. 우리는 어떻게 매개변수를 가진 메소드를 선언합니까?"

"실제로 매우 간단합니다.

public static void name(parameters)
{
  method body
}

"여기서 name메서드의 고유한 이름은 method body메서드를 구성하는 명령을 나타냅니다. 그리고 parameters쉼표로 구분된 메서드 매개 변수의 자리 표시자입니다."

"음...이해한 것 같은데... 아니면 아닐지도..."

"이 템플릿에 대한 자세한 내용을 알려드리면 다음 내용을 이해하고 있음을 확신하실 수 있습니다.

public static void name(Type1 name1, Type2 name2, Type3 name3)
{
  method body
}

여기 몇 가지 예가 있어요.

암호 설명
public static void print(String str)
{
}
메소드 print는 매개변수로 선언됩니다.
String str
public static void print(String str, int count)
{
}
메서드 print는 두 개의 매개변수로 선언됩니다.
String str
int count
public static void write(int x, int y)
{
}
메서드 write는 두 개의 매개변수로 선언됩니다.
int x
int y

"아...이제 알겠습니다. 메서드에 매개변수를 포함하지 않으려면 괄호를 비워 둡니다."

"맞아요. 기본적으로 매개변수는 메서드 내 특수 변수입니다. 매개변수의 도움을 받아 메서드 호출 시 다양한 값을 메서드에 전달할 수 있습니다. 값을 전달할 필요가 없다면 괄호를 비워두세요.

"예를 들어, 주어진 텍스트 행을 주어진 횟수만큼 표시하는 메서드를 작성해 봅시다. 어떻게 하면 좋을지 생각이 나십니까?"

"글쎄... 문자열을 화면에 여러 번 표시하는 코드를 작성하는 방법을 잘 알고 있는 것 같습니다..."

"표시할 문자열을 어떻게 지정합니까? 그리고 표시되는 줄 수는 어떻게 지정합니까? 추측할 수 있습니까?"

"모든 것이 명확해지기 시작했습니다... 아마도 메서드 매개변수의 도움으로?"

"정확합니다. 텍스트 줄에 대한 문자열 매개변수와 표시된 줄 수에 대한 숫자 매개변수입니다. 이 작업을 수행하는 코드는 다음과 같습니다.

암호 설명
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}

printLines다음 매개변수를 사용하여 메서드를 선언했습니다 .
String text, int count

메서드는 문자열 text count시간 을 표시합니다 . 다양한 매개변수를 사용하여 메서드를



호출합니다.printLines

"메소드가 호출될 때마다 해당 매개변수에 전달된 값이 할당되고 나서야 메서드 내에서 명령을 실행하기 시작합니다.

인수

"매개변수가 있는 메서드 호출에 특별한 주의를 기울이시기 바랍니다. 메서드에 전달되는 값은 일반적으로 메서드에 전달될 때 인수 라고 합니다.

예제를 다시 살펴보겠습니다.

암호 설명
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}

printLines다음 매개 변수를 사용하여 메서드를 선언했습니다 .
String text, int count

메서드는 문자열 text count시간을 표시합니다 . 다음 인수를 사용하여 메서드를


호출합니다 .printLines
text = "Hi"; count = 10;
text = "Bye"; count = 20;

" printLines메서드가 처음 호출되었을 때 해당 매개변수에 다음 값이 할당되었습니다.

String text = "Hi", int count = 10.

" printLines메서드가 두 번째로 호출되었을 때 해당 매개변수에 다른 값이 할당되었습니다.

String text = "Bye", int count = 20.

"매개변수는 메서드가 호출될 때 특정 값이 할당되는 변수 이상도 이하도 아닙니다. 값 "Hi", "Bye", 10, 및 20자체가 인수라고 합니다."

"차이점을 기억하고 이러한 개념을 혼동하지 않도록 노력하겠습니다."

메서드를 호출할 때 충돌하는 변수 이름

"메서드를 호출할 때 변수를 인수로 사용할 수 있습니다.

"글쎄, 말이 되네!"

"말이 되지만 잠재적으로 약간의 어려움이 발생할 수 있습니다. 다시 한 번 예제로 돌아가서 이번에는 인수를 별도의 변수로 이동하겠습니다.

암호 설명
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String str = "Hi";
     String n = 10;
     printLines(str, n);
   }
}

printLines다음 매개 변수를 사용하여 메서드를 선언했습니다 .
String text, int count

메서드는 문자열 text count시간을 표시합니다 . 다음 인수를 사용하여 메서드를



호출합니다 .printLines
text = str;
count = n;

"흠.. 별 어려움은 없는 것 같습니다. 변수가 있습니다 . 메소드가 호출될 때 str그 값이 매개변수에 할당됩니다 . 변수가 있습니다. 그 값은 메소드가 호출될 때 매개변수 에 할당됩니다 ." "지금까지는 모든 것이 명확합니다."textncount

"좋아요. 이제 main메서드에서 변수의 이름을 바꾸겠습니다.

암호 설명
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String text = "Hi";
     String count = 10;
     printLines(text, count);
   }
}

printLines다음 매개 변수를 사용하여 메서드를 선언했습니다 .
String text, int count

메서드는 문자열 text count시간을 표시합니다 . 다음 인수를 사용하여 메서드를



호출합니다 .printLines
text = text;
count = count;

"두 가지에 주의하라.

첫째: 다른 메서드에 같은 이름을 가진 변수가 있습니다. 이들은 서로 다른 변수입니다(의도적으로 다른 색상을 사용하여 변수를 묘사함). 메서드 의 변수 main이름이 strand 인 이전 예제와 동일하게 모든 것이 작동합니다 n.

둘째: 메서드가 호출될 때 마법 같은 일이 일어나지 않습니다. 매개변수에는 단순히 인수 값이 할당됩니다. 숫자, 문자열, 변수 또는 표현식인지 여부에 관계없이.

"메인 메서드에서 변수의 이름을 바꾼 후 아무 것도 변경되지 않았습니다. 이전에는 다른 메서드에서 다른 변수 였으므로 그대로 유지됩니다. 두 text변수 사이에는 마법 같은 연결이 없습니다 ."

"이제 알겠어."

메서드에 대한 참조 전달

"메서드에 인수를 전달하는 방법에 대해 제가 말한 모든 내용을 이미 이해하셨기를 바랍니다. 이제 이 주제에 대해 좀 더 깊이 파고들 것이기 ​​때문에 그렇게 말씀드립니다. 잘 들으십시오."

"자바의 일부 변수는 값 자체가 아니라 참조, 즉 이 있는 메모리 블록의 주소를 저장한다는 것을 이미 알고 있습니다. 이것이 문자열 변수와 배열 변수가 작동하는 방식입니다.

"개발자가 다른 배열 변수를 배열 변수에 할당하면 어떻게 됩니까?"

"그럼 같은 주소를 가리키나요?"

"정답입니다. 두 변수는 메모리에서 동일한 공간을 참조하기 시작합니다.

"이러한 변수 중 하나가 메서드 매개 변수이면 어떻게 됩니까?

암호 설명
class Solution
{
   public static void sum(int[] data)
   {
     int total = 0;
     for (int i = 0; i < data.length; i++)
       total = total + data[i];
     System.out.println(total);
   }
   
   public static void main(String[] args)
   {
     int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30};
     sum(months);
   }
}


메서드 sum는 전달된 배열의 숫자 합계를 계산하여 화면에 표시합니다.

"정확히 같은 일이 발생합니다. data매개변수에는 변수와 동일한 메모리 영역에 대한 참조가 포함됩니다 months. 메서드가 호출되면 간단한 할당이 발생합니다. .data = months

"그리고 두 변수 모두 정수를 저장하는 동일한 메모리 영역을 참조하기 때문에 메서드는 sum배열에서 값을 읽을 수 있을 뿐만 아니라 값을 변경할 수도 있습니다!"

"이해한 것 같지만 더 많은 예가 필요합니다!"

"음, 예를 들어 같은 값으로 2차원 배열을 채우는 자체 메서드를 작성할 수 있습니다. 다음과 같이 표시될 수 있습니다.

암호 설명
class Solution
{
   public static void fill(int[][] data, int value)
   {
     for (int i = 0; i < data.length; i++)
     {
       for (int j = 0; j < data[i].length; j++)
         data[i][j] = value;
     }
  }

   public static void main(String[] args)
   {
     int[][] months = {{31, 28}, {31, 30, 31}, {30, 31, 31}};
     fill (months, 8);
   }
}


메서드 fill 는 전달된 2차원 배열의 모든 셀을 반복하고 할당합니다 value.






우리는 2차원 배열을 만듭니다.
전체 배열을 숫자로 채웁니다 8.

이름이 같은 메서드

"이제 다시 한 번 메서드 이름으로 돌아가 봅시다."

"나는 이름에 대해 다른 무엇을 말할 수 있는지 상상할 수 없습니다!"

"자바 언어 표준에서는 동일한 클래스의 모든 메서드가 고유한 이름을 가질 것을 요구합니다.

"그래서 같은 클래스에서 같은 이름의 메소드 두 개를 선언하는 것이 불가능합니까?"

"이제 — 주의를 기울이십시오! 클래스의 메서드는 실제로 동일한 이름을 가질 수 있습니다! 그러나 이 경우 서로 다른 매개 변수를 가져야 합니다. 즉, 메서드는 동일성에 대해 비교되며 이름뿐만 아니라 매개변수의 유형 ! 구체적으로 유형을 언급했음을 참고하십시오. 매개변수의 이름은 고려되지 않습니다 . 예:

암호 설명
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
이 세 가지 방법은 서로 다른 방법입니다. 같은 클래스에서 선언할 수 있습니다.
void print(String str) {
}
void print(String str, String str2) {
}
void print(int val) {
}
void print(double val) {
}
void print() {
}
이 다섯 가지 방법은 각각 다른 것으로 간주됩니다 . 같은 클래스에서 선언할 수 있습니다.
void sum(int x, int y) {
}
void sum(int data, int value) {
}
"이 두 메서드는 동일한 것으로 간주되며 동일한 클래스에서 선언될 수 없음을 의미합니다."

"완전히 혼란스러워요! 왜 이 모든 것이 필요한가요? 왜 어떤 방법은 같은 것으로 간주되고 다른 방법은 다른 가요? 그리고 방법의 고유성을 결정할 때 매개변수 이름이 고려되지 않는 이유는 무엇입니까? 고유성이 필요한 이유는 무엇입니까? 모두?"

"문제는 컴파일러가 프로그램을 컴파일할 때 지정된 위치에서 호출하려는 메서드를 정확히 알아야 한다는 것입니다.

"예를 들어 를 작성하면 컴파일러는 똑똑하고 여기에서 매개변수를 사용하여 메소드를 호출할 것이라고 쉽게 결론을 내릴 것입니다 . 그러나 를 작성하면 컴파일러는 매개 변수가 있는 메소드 에 대한 호출을 볼 것입니다. 메소드를 선언할 때 프로그래머가 매개변수에 부여한 이름."System.out.println("Hi")println()StringSystem.out.println(1.0)println()double

아, 슬슬 풀리기 시작하는 것 같다!

"메소드가 호출되면 컴파일러는 인수의 유형이 매개변수의 유형과 일치하는지 확인합니다. 인수의 이름에는 주의를 기울이지 않습니다. Java에서 매개변수 이름은 컴파일러가 어떤 메소드를 수행할지 결정하는 데 도움이 되지 않습니다. 컴파일러가 아니라 프로그래머에게 필요합니다.

"그래서 방법의 고유성을 결정할 때 고려되지 않는 것 같습니다."

"예, 전적으로 맞습니다. 메소드의 이름과 해당 매개변수의 유형을 메소드 서명 이라고 합니다 . 예를 들어, sum (int, int)"

"따라서 각 클래스에는 고유한 이름을 가진 메서드 가 아닌 고유한 서명이 있는 메서드가 있어야 합니다 ."

"잘했어, 아미고! 이번 수업을 완벽하게 요약했어. 불확실한 부분이 있더라도 당황하지 마라. 이 주제는 몇 가지 작업 후에 명확해질 것이다."