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
}
예:
암호 | 설명 |
---|---|
|
메소드 print 는 매개변수로 선언됩니다.String str |
|
메서드 print 는 두 개의 매개변수로 선언됩니다.String str int count |
|
메서드 write 는 두 개의 매개변수로 선언됩니다.int x int y |
메소드에 매개변수가 있는 것을 원하지 않으면 괄호를 비워 둡니다.
매개변수는 메소드 내의 특수 변수입니다. 도움을 받으면 메서드가 호출될 때 메서드에 다양한 값을 전달할 수 있습니다.
예를 들어 주어진 횟수만큼 텍스트 문자열을 표시하는 메서드를 작성해 보겠습니다.
화면에 문자열을 여러 번 표시하는 코드를 작성하는 방법을 이미 알고 있습니다. 그러나 어떤 문자열을 인쇄해야 합니까? 그리고 몇 번? 이것이 우리가 매개변수를 필요로 하는 이유입니다.
이를 수행하는 코드는 다음과 같습니다.
암호 | 설명 |
---|---|
|
printLines 다음 매개변수를 사용하여 메서드를 선언했습니다 . String text , int count 메서드는 문자열 text count 시간 을 표시합니다 . 다양한 매개변수를 사용하여 메서드를 호출합니다. printLines |
메소드가 호출될 때마다 매개변수에 전달된 값이 할당되고 그 후에야 메소드 내에서 명령을 실행하기 시작합니다.
2. 인수
매개변수를 사용하여 메서드를 호출하는 데 조금 더 주의를 기울이고 싶습니다.
메서드에 전달되는 값은 일반적으로 메서드에 전달될 때 인수라고 합니다.
다른 예를 살펴보겠습니다.
암호 | 설명 |
---|---|
|
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
자체를 인수라고 합니다."
3. 메서드 호출 시 변수 이름 충돌
변수는 메서드 인수로 사용할 수 있습니다. 이것은 간단하고 이해할 수 있지만 잠재적으로 약간의 어려움을 초래할 수 있습니다. 같은 예제로 돌아가서 이번에는 인수를 별도의 변수로 이동하겠습니다.
암호 | 설명 |
---|---|
|
printLines 다음 매개 변수를 사용하여 메서드를 선언했습니다 . String text , int count 메서드는 문자열 text count 시간을 표시합니다 . 다음 인수를 사용하여 메서드를 호출합니다 . printLines text = str; count = n; |
지금까지는 매우 좋았습니다. 변수가 있습니다 str
. text
해당 값은 메서드가 호출될 때 매개 변수 에 할당됩니다 . 변수가 있습니다 n
. count
그 값은 메소드가 호출될 때 매개변수 에 할당됩니다 ." 지금까지는 모든 것이 명확합니다.
이제 메서드에서 변수의 이름을 바꾸겠습니다 main
.
암호 | 설명 |
---|---|
|
printLines 다음 매개 변수를 사용하여 메서드를 선언했습니다 . String text , int count 메서드는 문자열 text count 시간을 표시합니다 . 다음 인수를 사용하여 메서드를 호출합니다 . printLines text = text; count = count; |
두 가지를 주의하세요
첫째: 다른 메서드에 같은 이름을 가진 변수가 있습니다. 이들은 서로 다른 변수입니다(의도적으로 다른 색상을 사용하여 변수를 묘사함). 메서드 의 변수 main
이름이 str
and 인 이전 예제와 동일하게 모든 것이 작동합니다 n
.
둘째: 메서드가 호출될 때 마법 같은 일이 일어나지 않습니다. 매개변수에는 단순히 인수 값이 할당됩니다. 숫자, 문자열, 변수 또는 표현식인지 여부에 관계없이.
기본 메서드에서 변수의 이름을 바꾼 후 아무 것도 변경되지 않았습니다. 그들은 이전에 다른 방법에서 다른 변수 였으므로 그대로 유지됩니다. text
와 변수 사이에는 마법 같은 연결이 없습니다 text
.
4. 메서드에 대한 참조 전달
이전 강의에서 모든 내용을 이해하셨기를 바랍니다. 이제 메소드에 전달되는 인수를 다시 살펴보고 더 깊이 파고들 것이기 때문입니다.
이미 알고 있듯이 일부 Java 변수는 값 자체가 아니라 참조, 즉 값이 있는 메모리 블록의 주소를 저장합니다. 이것은 문자열 변수와 배열 변수가 작동하는 방식입니다.
다른 배열 변수를 배열 변수에 할당하면 어떻게 됩니까? 좋아요. 두 변수는 메모리의 동일한 공간을 참조하기 시작합니다.
이러한 변수 중 하나가 메소드 매개변수이면 어떻게 됩니까?
암호 | 설명 |
---|---|
|
메서드 printArraySum 는 전달된 배열의 숫자 합계를 계산하여 화면에 표시합니다. |
정확히 같은 일이 발생합니다. data
매개변수는 변수와 동일한 메모리 영역에 대한 참조를 포함합니다 months
. 메서드가 호출되면 간단한 할당이 발생합니다. .data = months
그리고 두 변수 모두 정수를 저장하는 동일한 메모리 영역을 참조하기 때문에 메서드는 printArraySum
배열에서 값을 읽을 수 있을 뿐만 아니라 값을 변경할 수도 있습니다!
예를 들어, 동일한 값으로 2차원 배열을 채우는 자체 메서드를 작성할 수 있습니다. 다음과 같이 보일 수 있습니다.
암호 | 설명 |
---|---|
|
메서드 fill 는 전달된 2차원 배열의 모든 셀을 반복하고 value 셀에 할당합니다. 우리는 2차원 배열을 만듭니다. 전체 배열을 숫자로 채웁니다 8 . |
5. 같은 이름의 메서드
이제 다시 한 번 메서드 이름으로 돌아가겠습니다.
Java 표준에서는 동일한 클래스의 모든 메서드가 고유한 이름을 가질 것을 요구합니다. 즉, 동일한 클래스에서 동일한 이름의 두 메서드를 선언하는 것은 불가능합니다.
메서드의 동일성을 비교할 때 이름뿐만 아니라 매개변수의 유형도 고려됩니다 ! 매개변수의 이름은 고려되지 않습니다 . 예:
암호 | 설명 |
---|---|
|
이 세 가지 방법은 서로 다른 방법입니다. 같은 클래스에서 선언할 수 있습니다. |
|
이 다섯 가지 방법은 각각 다른 것으로 간주됩니다 . 같은 클래스에서 선언할 수 있습니다. |
|
이 두 메서드는 동일한 것으로 간주되며 동일한 클래스에서 선언될 수 없음을 의미합니다. |
일부 방법은 동일하게 간주되는 반면 다른 방법은 다른 이유는 무엇입니까 ? 메소드의 고유성을 결정할 때 매개변수 이름이 고려되지 않는 이유는 무엇입니까?
고유성이 필요한 이유는 무엇입니까? 문제는 컴파일러가 프로그램을 컴파일할 때 지정된 위치에서 호출하려는 메서드를 정확히 알아야 한다는 것입니다.
예를 들어 를 작성하면 컴파일러는 똑똑하고 여기에서 매개 변수를 사용하여 메서드를 호출할 것이라고 쉽게 결론을 내릴 것입니다.System.out.println("Hi")
println()
String
그러나 를 작성하면 컴파일러는 매개변수가 있는 메소드 에 대한 호출을 볼 것입니다 .System.out.println(1.0)
println()
double
메소드가 호출되면 컴파일러는 인수 유형이 매개변수 유형과 일치하는지 확인합니다. 인수의 이름에는 주의를 기울이지 않습니다. Java에서 매개변수 이름은 컴파일러가 호출할 메서드를 결정하는 데 도움이 되지 않습니다. 이것이 바로 방법의 고유성을 결정할 때 고려되지 않는 이유입니다.
메소드의 이름과 해당 매개변수의 유형을 메소드 서명 이라고 합니다 . 예를 들어,sum(int, int)
각 클래스에는 고유한 이름을 가진 메서드 가 아닌 고유한 서명이 있는 메서드가 있어야 합니다 .
GO TO FULL VERSION