1. 참조 변수

Java 언어에는 두 가지 종류의 변수가 있습니다: 원시 변수와 기타 모든 것입니다. 공교롭게도 이제 "다른 모든 것"에 대해 이야기하겠습니다.

사실 원시변수참조변수가 있다는 말이 더 맞을 것이다 . 그렇다면 이러한 참조 변수는 무엇입니까?

변수가 값을 직접 저장하는 기본 유형과 달리 참조 변수는 개체에 대한 참조를 저장합니다. 즉, 메모리 어딘가에 객체가 있고 참조 변수는 단순히 이 객체의 주소(객체에 대한 참조)를 메모리에 저장합니다.

기본 유형만 변수 내부에 직접 값을 저장합니다. 다른 모든 유형은 개체 참조 만 저장합니다 . String그건 그렇고, 변수와 배열 변수 라는 두 가지 유형의 변수를 이미 접했습니다 .

배열과 문자열은 모두 메모리 어딘가에 저장된 객체입니다. String변수와 배열 변수는 개체에 대한 참조만 저장합니다.

Java의 참조 변수

int a, int b and double d내부에 값을 저장하는 기본 변수입니다.

변수 String str는 참조이며 String객체에 대한 주소(참조)를 메모리에 저장합니다.

기본 유형의 변수에 기본 값을 할당하면 해당 값이 복사(복제)됩니다. 참조 변수를 할당할 때 개체의 주소만 복사되고 개체 자체는 복사되지 않습니다 .


2. 참조란 무엇에 관한 것입니까?

참조 변수와 기본 변수의 근본적인 차이점은 무엇입니까?

기본 변수는 상자와 같습니다. 상자에 값을 저장할 수 있습니다. 참조 변수는 전화번호가 적힌 종이와 비슷합니다.

자동차 대 자동차 열쇠

친구의 생일에 자동차를 선물하기로 결정했다고 상상해 보십시오. 당신은 그것을 상자에 싸서 가지고 다니지 않을 것입니다. 차가 너무 큽니다.

차 열쇠를 담을 수 있을 만큼 큰 상자에 차 열쇠만 담아서 제시하는 것이 훨씬 더 편리합니다. 당신의 친구는 상자에서 열쇠를 꺼낼 때 모든 것을 이해할 것입니다. 키를 맡기기만 하면 되므로 차 전체를 가지고 다닐 필요가 없습니다.

사람 vs 그녀의 전화번호

또는 여기 또 다른 비교가 있습니다. 사람과 그녀의 전화번호입니다. 전화번호는 사람이 아니지만 전화번호를 사용하여 그녀에게 전화를 걸거나 정보를 요청하거나 지침을 제공할 수 있습니다.

마찬가지로 참조는 개체와 상호 작용하는 데 사용됩니다. 모든 개체는 참조를 사용하여 서로 상호 작용합니다. "사람을 교환"하는 대신 단순히 전화 번호를 교환합니다.

기본 변수에 값을 할당할 때 해당 값이 복사(복제)됩니다. 참조 변수에 값을 할당할 때 객체의 주소(전화번호)만 복사되고 객체 자체는 복사되지 않습니다.

참조는 또 다른 이점을 제공합니다. 개체 참조를 일부 메서드에 전달할 수 있으며 메서드는 개체에 대한 참조를 사용하고 해당 메서드를 호출하고 개체 내부의 데이터에 액세스하여 개체를 수정(변경)할 수 있습니다.


3. 참조 할당

참조 변수를 할당할 때 메모리에 있는 개체의 주소만 할당됩니다. 객체 자체는 나타나거나 사라지지 않습니다.

이 접근 방식은 대량의 메모리 복사를 방지합니다. 매우 큰 개체를 메서드에 전달해야 하는 경우 개체 참조만 전달하면 됩니다. 참조는 훨씬 적은 공간을 차지합니다.

참조 할당

모든 참조 변수의 크기(유형에 관계없이)는 4바이트(int와 유사)로 동일합니다. 하지만! 응용 프로그램이 64비트 Java 시스템에서 실행 중인 경우 모든 참조 크기는 8바이트(64비트)입니다.

또한 참조는 서로에게만 할당할 수 있습니다. 참조를 변경하거나 참조 변수에 임의의 값을 할당할 수 없습니다.

암호 설명
String hello = "Hello";
String s = hello;
이것은 허용됩니다
String hello = "Hello";
hello++;
그러나 이것은 허용되지 않습니다
String hello = 0x1234;
그리고 이것은 허용되지 않습니다

4. null참조

아직 아무 것도 할당되지 않은 경우 참조 변수는 무엇을 저장합니까?

null 참조를 저장합니다 . null참조가 없음(빈 참조)을 의미하는 특수 Java 키워드입니다. 값 null은 모든 참조 변수에 할당될 수 있습니다.

모든 참조 변수는 null어떤 종류의 참조가 할당되지 않은 경우입니다.

예:

암호 설명
class Person
{
   public static String name;
   public static int age;
}


변수 String name의 기본값은 입니다 null.
변수 int age의 기본값은 입니다 0.

값이 할당되지 않은 지역 변수는 기본 유형과 참조 유형 모두에 대해 초기화되지 않은 것으로 간주됩니다.

변수가 일부 개체에 대한 참조를 저장하고 변수의 값을 지우려면 null 참조를 할당하면 됩니다.

암호 설명
String s = null;
s = "Hello";
s = null;
s상점 null.
s문자열 객체에 대한 참조를 저장
s합니다 null.

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

메서드에 참조 유형 인 매개변수가 있는 경우 비참조 변수로 작업할 때와 동일한 방식으로 값이 메서드에 전달됩니다. 매개변수에는 단순히 다른 변수의 값이 할당됩니다.

예:

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

   public static void main(String[] args)
   {
     String[] data = new String[10];
     fill(data, "Hello");
   }
}


fill전달된 배열( array)을 전달된 값( value)으로 채웁니다.

fill메서드가 호출 되면 array매개 변수에 배열에 대한 참조가 할당됩니다 data. 변수 value에는 문자열 개체("Hello")에 대한 참조가 할당됩니다.

다음은 메서드 를 호출하기 전의 메모리 모습입니다 fill.

메서드에 대한 참조 전달

메서드가 실행 중일 메모리는 다음과 같습니다 fill .

메서드 2에 대한 참조 전달

data및 변수 array는 메모리의 동일한 컨테이너를 참조(저장 참조)합니다.

변수 value는 문자열 개체( "Hello")에 대한 참조를 저장합니다.

배열의 셀도 "Hello"개체에 대한 참조만 저장합니다.

사실 어떤 개체도 복제되지 않고 참조만 복사됩니다.



6. C/C++ 언어와의 비교

인터뷰에서 때때로 Java 프로그래머는 데이터가 Java의 메소드에 어떻게 전달되는지 묻습니다. 때때로 질문은 데이터가 참조로 전달되는지 값으로 전달되는지입니다.

이 질문은 C++에서 왔지만 Java에서는 그다지 의미가 없습니다 . Java에서 매개변수에는 항상 단순히 인수 값이 할당됩니다. 따라서 정답은 " 값 기준 "입니다.

그러나 "원시 유형은 값으로 전달되고 참조 유형은 참조로 전달됩니다."라는 반박을 즉시 들을 수 있으므로 귀하의 입장을 설명 할 준비 를 하십시오.

이 문제의 기원은 많은 Java 프로그래머가 과거에 C++ 프로그래머였다는 사실에서 비롯됩니다. 그 프로그래밍 언어에서 매개변수가 메서드에 전달되는 방식에 대한 질문은 매우 중요했습니다.

Java에서는 모든 것이 명확합니다. 기본 유형은 값을 저장하고 참조 유형도 값(참조)을 저장합니다. 변수가 값으로 간주되는지 여부에 대한 질문입니다 .

C++에서 변수는 개체에 대한 참조와 개체 자체를 모두 저장할 수 있습니다. 기본 유형에 대해서도 마찬가지입니다. 기본 변수는 값을 저장하거나 변수를 에 대한 참조로 선언할 수 있습니다 int. 따라서 혼동을 피하기 위해 C++ 프로그래머는 항상 개체를 참조로 참조 하고 개체 자체를 값으로 참조합니다.

C++에서는 하나의 변수에 개체가 포함되어 있지만 다른 변수에는 해당 개체에 대한 참조가 포함되어 있는 상황이 쉽게 발생할 수 있습니다. 따라서 변수가 무엇을 저장하는가(객체 자체인지 또는 객체에 대한 참조인지)에 대한 질문은 매우 중요했습니다. 개체가 메서드에 전달될 때 개체가 복사되고(값으로 전달된 경우) 복사되지 않았습니다(참조로 전달된 경우).

Java에서는 이러한 이중성이 존재하지 않으므로 정답은 인수가 값에 의해 Java 메서드에 전달된다는 것입니다 . 참조 변수에 대해 이야기할 때 이 값은 참조입니다.