일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 소프트웨어공학
- 인공지능
- 컴퓨터공학
- 웹개발
- 2
- Yes
- 데이터구조
- I'm Sorry
- 코딩
- 자료구조
- 프로그래밍언어
- 데이터과학
- 컴퓨터과학
- 빅데이터
- 자바스크립트
- 알고리즘
- 클라우드컴퓨팅
- 딥러닝
- 버전관리
- 데이터분석
- 데이터베이스
- 네트워크
- 보안
- 컴퓨터비전
- 파이썬
- 프로그래밍
- 사이버보안
- 소프트웨어
- 머신러닝
- 네트워크보안
- Today
- Total
스택큐힙리스트
Java는 "참조에 의한 전달(pass-by-reference)"인가요 "값에 의한 전달(pass-by-value)"인가요? 본문
Java는 "참조에 의한 전달(pass-by-reference)"인가요 "값에 의한 전달(pass-by-value)"인가요?
스택큐힙리스트 2023. 3. 10. 21:09나는 항상 자바가 참조에 의한 전달을 사용한다고 생각했다. 그러나 나는 자바가 값에 의한 전달을 사용한다고 주장하는 a blog post을 읽었다. 나는 작성자가 만드는 차이점을 이해하지 못하는 것 같다.
설명은 무엇인가요?
답변 1
값에 의한 전달과 참조에 의한 전달 용어는 컴퓨터 공학에서 특별한 의미를 가지고 있습니다. 이 의미는 처음에 이 용어를 듣는 많은 사람들이 가지는 직관과는 다릅니다. 이 토론에서 혼란이 큰 부분은 이 사실에서 비롯된 것 같습니다.
값에 의한 전달과 참조에 의한 전달이란 용어는 변수에 대해 언급합니다. 값에 의한 전달은 변수의 값을 함수/메소드로 전달하는 것을 의미합니다. 반면 참조에 의한 전달은 해당 변수에 대한 참조를 함수에 전달하는 것을 의미합니다. 후자는 함수가 변수의 내용을 변경할 수 있는 방법을 제공합니다.
그러한 정의에 따르면, 자바는 항상 값에 의한 전달(pass-by-value)입니다. 하지만 객체를 담고 있는 변수를 다룰 때는 참조(reference)라는 객체 핸들(handle)을 다루게 되므로 이 또한 값에 의한 전달(pass-by-value)입니다. 이러한 용어와 문법은 초보자들을 쉽게 혼란스럽게 만듭니다.
그것은 다음과 같이 진행됩니다.
public static void main(String[] args) {
Dog aDog = new Dog(Max);
Dog oldDog = aDog;
// we pass the object to foo
foo(aDog);
// aDog variable is still pointing to the Max dog when foo(...) returns
aDog.getName().equals(Max); // true
aDog.getName().equals(Fifi); // false
aDog == oldDog; // true
}
public static void foo(Dog d) {
d.getName().equals(Max); // true
// change d inside of foo() to point to a new Dog instance Fifi
d = new Dog(Fifi);
d.getName().equals(Fifi); // true
}
위의 예에서 g.getName() in #는 여전히 # . The value를 반환합니다. ain wou 내의 값 within #$은 객체 참조가 값에 의해 전달되므로 함수 foo에서 변경되지 않습니다. 만약 참조에 의해 전달되었다면 호출 후 ain wou의 g.getName() in #는 @#Fifi 을 반환할 것입니다.
마찬가지로:
public static void main(String[] args) {
Dog aDog = new Dog(Max);
Dog oldDog = aDog;
foo(aDog);
// when foo(...) returns, the name of the dog has been changed to Fifi
aDog.getName().equals(Fifi); // true
// but it is still the same dog:
aDog == oldDog; // true
}
public static void foo(Dog d) {
d.getName().equals(Max); // true
// this changes the name of d to be Fifi
d.setName(Fifi);
}
위의 예에서, Fifi는 foo(aDog)에 대한 호출 이후 개의 이름이며, 객체의 이름이 foo(...) 안에 설정되었습니다. foo가 d에서 수행하는 모든 작업은 실제로는 aDog에서 수행되지만, 변수 aDog의 값을 변경하는 것은 불가능합니다.
참조에 의한 전달과 값에 의한 전달에 대한 자세한 정보는 다음 답변을 참조하십시오: https://stackoverflow.com/a/430958/6005228 . 이 문서는 두 개념의 의미와 역사를 보다 자세히 설명하며 Java 및 많은 다른 현대 언어가 특정한 경우 둘 다 하는 이유를 설명합니다.
답변 2
Java는 pass-by-reference인가 pass-by-value인가?
Java는 pass-by-value이다. 이것은 객체 참조가 값으로 전달된다는 뜻이다. 다시 말해, 메소드가 객체에 대한 참조를 전달할 때, 실제로는 참조가 복사되어 전달된다.
이것은 Java에서 메소드 호출 시 객체를 변경할 수 없다는 것을 의미한다. 참조된 객체를 수정하려면 참조 값인 객체를 수정 하거나 객체의 새 복사본을 만들어 수정할 수 있다.
Java가 pass-by-value인 이유는 Java가 안정적인 언어로 유지되기 위해 강력한 타입 검사를 필요로 하기 때문이다. Java에서 객체를 pass-by-reference 로 처리하면 코드가 예기치 않게 동작할 수 있다.
따라서 Java에서 객체를 전달할 때 복사본을 만들기 때문에 더블 데이터 타입과 같은 객체의 필드를 변경하는 메소드를 작성 할 때 문제가 발생할 수 있다. 이렇게하면 메소드 호출을 종료해도 원래 객체의 값이 변경되지 않기 때문이다.
결론적으로, Java는 pass-by-value 이지만 객체를 수정하려면 객체의 값을 수정하거나 새 복사본을 만들어 수정해야 한다. 이는 Java에서 안정적인 언어를 유지하기 위해 필요한 것이기 때문이다.