1. 인수 전달

이제 재미가 시작됩니다. System.out.println()메서드에 인수를 전달할 수 있다는 것을 메서드에서 이미 알고 있을 것입니다 . 메서드 내부에 들어가면 매개 변수라고 합니다. 실제로 매개변수는 메서드를 만들고 사용함으로써 얻을 수 있는 이점을 크게 향상시킵니다.

매개변수가 있는 메서드를 어떻게 선언합니까? 실제로 매우 간단합니다.

public static void name(parameters)
{
  method body
}

여기서 name 는 메서드의 고유한 이름이며 method body 메서드를 구성하는 명령을 나타냅니다. And 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

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


2. 인수

매개변수를 사용하여 메서드를 호출하는 데 조금 더 주의를 기울이고 싶습니다.

메서드에 전달되는 값은 일반적으로 메서드에 전달될 때 인수라고 합니다.

다른 예를 살펴보겠습니다.

암호 설명
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", 1020자체를 인수라고 합니다."


3. 메서드 호출 시 변수 이름 충돌

변수는 메서드 인수로 사용할 수 있습니다. 이것은 간단하고 이해할 수 있지만 잠재적으로 약간의 어려움을 초래할 수 있습니다. 같은 예제로 돌아가서 이번에는 인수를 별도의 변수로 이동하겠습니다.

암호 설명
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";
     int n = 10;
     printLines(str, n);
   }
}


printLines다음 매개 변수를 사용하여 메서드를 선언했습니다 .
String text, int count
메서드는 문자열 text count시간을 표시합니다 . 다음 인수를 사용하여 메서드를







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

지금까지는 매우 좋았습니다. 변수가 있습니다 str. text해당 값은 메서드가 호출될 때 매개 변수 에 할당됩니다 . 변수가 있습니다 n. count그 값은 메소드가 호출될 때 매개변수 에 할당됩니다 ." 지금까지는 모든 것이 명확합니다.

이제 메서드에서 변수의 이름을 바꾸겠습니다 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";
     int count = 10;
     printLines(text, count);
   }
}


printLines다음 매개 변수를 사용하여 메서드를 선언했습니다 .
String text, int count
메서드는 문자열 text count시간을 표시합니다 . 다음 인수를 사용하여 메서드를







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

두 가지를 주의하세요

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

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

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



4. 메서드에 대한 참조 전달

이전 강의에서 모든 내용을 이해하셨기를 바랍니다. 이제 메소드에 전달되는 인수를 다시 살펴보고 더 깊이 파고들 것이기 ​​때문입니다.

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

다른 배열 변수를 배열 변수에 할당하면 어떻게 됩니까? 좋아요. 두 변수는 메모리의 동일한 공간을 참조하기 시작합니다.

메서드에 대한 참조 전달

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

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


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

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

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

예를 들어, 동일한 값으로 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.


5. 같은 이름의 메서드

이제 다시 한 번 메서드 이름으로 돌아가겠습니다.

Java 표준에서는 동일한 클래스의 모든 메서드가 고유한 이름을 가질 것을 요구합니다. 즉, 동일한 클래스에서 동일한 이름의 두 메서드를 선언하는 것은 불가능합니다.

메서드의 동일성을 비교할 때 이름뿐만 아니라 매개변수의 유형도 고려됩니다 ! 매개변수의 이름은 고려되지 않습니다 . 예:

암호 설명
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()String

그러나 를 작성하면 컴파일러는 매개변수가 있는 메소드 에 대한 호출을 볼 것입니다 .System.out.println(1.0)println()double

메소드가 호출되면 컴파일러는 인수 유형이 매개변수 유형과 일치하는지 확인합니다. 인수의 이름에는 주의를 기울이지 않습니다. Java에서 매개변수 이름은 컴파일러가 호출할 메서드를 결정하는 데 도움이 되지 않습니다. 이것이 바로 방법의 고유성을 결정할 때 고려되지 않는 이유입니다.

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

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