JavaRush /Java Blog /Random-KO /Java에서 매개변수 전달
vincent_vega
레벨 24
Gainesville

Java에서 매개변수 전달

Random-KO 그룹에 게시되었습니다
Java의 변수는 값이 포함된 컨테이너입니다. 그렇다면 변수를 "전달"한다는 것은 무엇을 의미합니까? 기본 데이터 유형과 참조 데이터 유형의 차이점은 무엇입니까?
Java에서 매개변수 전달 - 1
이에 대해서는 나중에 다루겠습니다. 먼저 간단한 과제부터 시작하겠습니다. 이 코드의 기능은 다음과 같습니다.
int х = 3;
int у = х;
1행에서는 int 유형의 변수 x가 생성되고 값 3이 할당됩니다. 2행에서는 int 유형의 변수 y가 생성되고 변수 x 의 값이 할당됩니다 . 미래에는 변수 x 가 y 에 어떤 식으로든 영향을 미치지 않습니다 . Java는 x (3) 의 값을 복사 하고 해당 복사본을 y 에 배치합니다 . 이는 매개변수를 값으로 전달하는 것입니다. 하나의 변수를 다른 변수에 쓰지 않습니다. 값이 복사되어 새 변수에 할당됩니다. 표현식 y = x; " x를 y 에 쓰기"를 의미하지 않습니다 . 이는 " x 내부의 값을 복사 하고 해당 복사본을 y 에 쓴다 "는 의미입니다. 나중에 변경하면 y :
у = 34;
이것이 x 에 영향을 미칠까요 ? 당연히 아니지. x 의 값은 여전히 ​​3입니다. 나중에 x를 변경하면 다음과 같습니다 .
х = 90;
이것이 y 에 어떤 영향을 미칠까요 ? 안 돼요. 할당이 이루어진 후에는 어떤 식으로든 관련이 없습니다(값 복사). 참조 유형은 어떻습니까? 어떻게 작동하나요? 그렇게 어렵지는 않습니다. 실제로 규칙은 동일합니다. 링크는 동일한 작업을 수행합니다. 즉, 링크의 복사본을 얻습니다. 그래서 내가 이렇게 말한다면:
Cat A = new Cat ();
Cat B = A;
링크 A가 링크 B 로 복사됩니다. 이는 개체에는 적용되지 않습니다. 여전히 개체가 하나만 있습니다. 그러나 이제 동일한 Cat 객체를 제어하는 ​​두 개의 서로 다른 참조가 있습니다 . 이제 메서드에 매개변수를 전달하는 방법을 살펴보겠습니다. Java는 매개변수를 값으로 전달합니다. 언제나. 이는 "값을 복사하고 복사본을 전달한다"는 의미입니다. 기본 유형의 경우 쉽습니다.
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
doStuff 메소드는 다음과 같습니다:
void doStuff (int у) {

   / / Действия с 'y'
}
x 값의 복사본 , 즉 5가 doStuff() 메서드 에 전달됩니다 . doStuff() 메서드에는 y 라는 자체 변수가 있습니다 . y 변수는 새롭고 다른 변수입니다. x 를 메소드에 전달하는 시점에 x 에 있던 내용의 복사본을 사용합니다 . 이제부터 yx는 서로 영향을 미치지 않습니다. y 를 변경해도 x 에는 영향을 주지 않습니다 .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
그 반대의 경우도 마찬가지입니다. x 를 변경하면 y 는 변경되지 않습니다 . 이 경우 x 가 한 유일한 일은 해당 값을 복사하여 doStuff() 메서드에 전달하는 것이었습니다 . "값 전달"은 참조에서 어떻게 작동합니까? 너무 많은 사람들이 "Java는 기본 유형을 값으로 전달하고 객체를 참조로 전달합니다."라고 말합니다. 그것은 그들이 말하는 것이 아닙니다. Java는 모든 것을 값으로 전달합니다. 프리미티브를 사용하면 콘텐츠의 복사본을 얻을 수 있습니다. 링크를 사용하면 콘텐츠의 사본도 얻을 수 있습니다. 그런데 링크 내용이 뭔가요? 리모콘. 시설을 관리/접근하기 위한 시설입니다. 객체에 대한 참조를 메서드에 전달하면 참조의 복사본이 전달됩니다. 원격 제어 클론. 그 물체는 여전히 그것이 만들어졌던 더미 ​​속에 앉아 누군가가 리모콘을 사용하기를 기다리고 있습니다. 시설에서는 이를 제어하기 위해 얼마나 많은 리모콘이 "프로그램"되어 있는지 신경 쓰지 않습니다. 이것에 관심을 갖는 유일한 사람은 가비지 수집가와 프로그래머인 당신뿐입니다. 그래서 당신이 말할 때 :
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Cat 개체 는 하나만 있습니다 . 그러나 이제 두 개의 원격 제어(링크)가 동일한 Cat 개체에 액세스할 수 있습니다 . 이제 B가 Cat 개체 에 수행하는 작업은 A 가 가리키는 Cat 에 영향을 주지만 A 의 내용에는 영향을 미치지 않습니다 ! 새 링크 B ( A 에서 직접 복사됨 )를 사용하여 Cat을 변경할 수 있지만 A는 변경할 수 없습니다. 그게 도대체 무슨 뜻이야? A 가 참조하는 객체를 변경할 수 있지만 A 의 참조를 변경할 수는 없습니다 . 이를 다른 객체나 null 로 리디렉션합니다 . 따라서 B 의 참조 ( B 가 참조 하는 실제 Cat 객체 가 아니라 참조 자체의 값)를 변경하면 A 의 값은 변경되지 않습니다 . 그 반대. 그래서:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
이는 단순히 B가 다른 개체를 가리킨다는 의미입니다. A 는 여전히 행복하다. 그럼 제 말을 따라하세요. Java는 모든 것을 값으로 전달합니다. (좋아요, 한 번 더... 느낌을 가지고요.) Java는 모든 것을 가치로 전달합니다. 기본 유형의 경우 현재 값의 복사본을 전달하고, 개체 참조의 경우 참조 복사본(원격 제어)을 전달합니다. 당신은 결코 객체를 전달하지 않습니다. 모든 객체는 힙에 저장됩니다. 언제나. 이제 커피를 듬뿍 끓여서 코드를 작성해 보세요! 원본 기사.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION