JavaRush /Java Blog /Random-KO /Java의 참조 데이터 유형

Java의 참조 데이터 유형

Random-KO 그룹에 게시되었습니다
Java 구문을 이해하지 않고는 진지한 개발자가 될 수 없으므로 오늘날 우리는 구문을 계속해서 배웁니다. 이전 기사 중 하나에서 기본 변수에 대해 이야기했지만 변수에는 두 가지 유형이 있으므로 오늘은 두 번째 유형인 Java의 참조 유형에 대해 이야기하겠습니다. 그래서 그것은 무엇입니까? Java에서 참조 데이터 유형이 필요한 이유는 무엇입니까? Java의 참조 데이터 유형 - 1채널 번호, 사운드 볼륨, 플래그와 같은 몇 가지 특성을 가진 TV 개체가 있다고 가정해 보겠습니다.
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
와 같은 간단한 유형이 int이 데이터를 어떻게 저장할 수 있습니까? 기억하자: 하나의 변수는 int4바이트이다. 그러나 내부에는 동일한 유형의 두 개의 변수(4바이트 + 4바이트)와 boolean(+1바이트)도 있습니다. 합계 - 4~9이지만 일반적으로 훨씬 더 많은 정보가 개체에 저장됩니다. 무엇을 해야 할까요? 변수에 객체를 넣을 수 없습니다. 이야기의 이 시점에서 참조 변수가 나타납니다. 참조 변수는 특정 객체가 위치한 메모리 위치의 주소를 저장합니다. 즉, 이것은 공유 메모리에서 개체를 찾아 몇 가지 조작을 수행할 수 있는 주소가 있는 "명함"입니다. Java의 모든 객체에 대한 참조는 참조 변수입니다. TV 개체의 모습은 다음과 같습니다.
TV telly = new TV();
telly생성된 TV 유형 개체에 대한 링크에 대한 이름을 가진 TV 유형 변수를 설정합니다. 즉, JVM은 TV 객체에 대한 힙에 메모리를 할당하고 이를 생성하고 메모리 내 해당 위치에 대한 주소를 변수에 저장합니다 telly. 이 변수는 스택에 저장됩니다. 이 강의 에서는 메모리, 즉 스택과 기타 유용한 정보에 대해 자세히 알아볼 수 있습니다 . TV 유형의 변수와 TV 유형의 객체를 보셨나요? 이유가 없는 것은 아닙니다. 특정 유형의 객체에는 동일한 유형의 해당 변수가 있어야 합니다(상속 및 인터페이스 구현은 계산하지 않지만 지금은 이를 고려하지 않습니다). 결국 우리는 수프를 잔에 붓지 않을 것입니다. 그렇죠? 우리의 객체는 TV이고 이에 대한 참조 변수는 제어판과 같다는 것이 밝혀졌습니다. 이 리모콘을 사용하여 개체 및 해당 데이터와 상호 작용할 수 있습니다. 예를 들어 TV의 특성을 설정합니다.
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
여기서는 점 연산자를 사용하여 .변수가 참조하는 개체의 내부 요소에 액세스하고 사용을 시작했습니다. 예를 들어, 첫 번째 줄에서 우리는 변수에 다음과 같이 말했습니다 . " 참조하고 있는 개체의 telly내부 변수를 제공 하고 이를 true로 설정하세요."(TV를 켜주세요).isOn

참조 변수 재정의

참조 유형의 두 변수와 이들이 참조하는 객체가 있다고 가정해 보겠습니다.
TV firstTV = new TV();
TV secondTV = new TV();
우리가 쓴다면:
firstTV = secondTV;
이는 첫 번째 변수를 두 번째 개체에 대한 주소 복사본(주소 비트의 값) 값으로 할당했으며 이제 두 변수 모두 두 번째 개체를 참조한다는 의미입니다. TV). 동시에 첫 번째 개체는 이를 참조하는 변수 없이 남겨졌습니다. 결과적으로 변수는 조건부 스레드이므로 가비지로 변하고 메모리에 놓여 공간을 차지하기 때문에 액세스할 수 없는 개체가 있습니다. 이 개체는 나중에 가비지 수집기에 의해 메모리에서 삭제됩니다 . Java의 참조 데이터 유형 - 2다른 링크 없이 개체와의 연결 스레드를 끊을 수 있습니다.
secondTV = null;
결과적으로 개체에 대한 링크는 하나만 있게 되며 firstTVsecondTV이상 누구에게도 연결되지 않습니다(이로 인해 향후 TV와 같은 일부 개체에 대한 링크를 할당할 수 있습니다).

문자열 클래스

이와 별도로 String 클래스 에 대해 언급하고 싶습니다 . 이는 문자열로 저장된 데이터를 저장하고 작업하기 위해 설계된 기본 클래스입니다. 예:
String text = new String("This TV is very loud");
여기서는 객체 생성자에 저장할 문자열을 전달했습니다. 하지만 아무도 그렇게 하지 않습니다. 결국 문자열을 만들 수 있습니다.
String text = "This TV is very loud";
훨씬 더 편리하죠? 사용의 대중성 측면에서는 String원시형보다 열등하지 않지만 여전히 클래스이며, 이를 참조하는 변수는 원시형이 아닌 참조형이다. 우리는 String문자열을 연결하는 놀라운 능력을 가지고 있습니다:
String text = "This TV" + " is very loud";
결과적으로 This TV is very loud두 줄이 하나의 전체로 결합되고 변수가 이 전체 텍스트를 참조하므로 텍스트를 다시 얻습니다. 중요한 뉘앙스는 String이것이 불변 클래스라는 것입니다. 무슨 뜻이에요? 다음 예를 들어보겠습니다.
String text = "This TV";
text = text + " is very loud";
모든 것이 간단한 것 같습니다. 변수를 선언하고 값을 지정합니다. 다음 줄에서는 이를 변경합니다. 하지만 우리는 실제로 변하지 않습니다. 이는 불변 클래스이므로 두 번째 줄에서는 초기 값이 변경되지 않지만 새 값이 생성되어 첫 번째 + " is very loud".

참조 상수

기본 유형에 관한 기사에서 우리는 상수 주제를 다루었습니다. 참조 변수를 final 로 선언하면 어떻게 동작할까요 ?
final TV telly = new TV();
이렇게 하면 객체가 불변이 될 것이라고 생각할 수도 있습니다. 하지만 아니요, 그건 사실이 아닙니다. Java의 참조 데이터 유형 - 3수정자가 있는 참조 변수는 final어떤 방식으로든 바인딩을 해제할 수 있는 기능(재정의 또는 와 동일시 null) 없이 특정 개체에 바인딩됩니다. 즉, 이러한 변수의 값을 설정한 후 다음과 같은 코드를 작성합니다.
telly = new TV();
또는
telly = null;
컴파일 오류가 발생합니다. 즉, final링크에만 작용하고 객체 자체에는 영향을 미치지 않습니다. 처음에 변경 가능하게 설정했다면 문제 없이 내부 상태를 변경할 수 있습니다.
telly.soundVolume = 30;
가끔 메소드 인수에서도 변수가 final로 지정되는 경우가 있습니다!
public void enableTV (final TV telly){
   telly.isOn = true;
}
이는 메서드를 작성하는 과정에서 이러한 인수를 재정의할 수 없으므로 혼란이 덜 발생하도록 하기 위한 것입니다. final불변 객체를 참조하는 참조 변수를 표시하면 어떻게 될까요 ? 예 String:
final String PASSWORD = "password";
결과적으로 우리는 기본 유형의 상수와 유사한 상수를 얻게 됩니다. 여기서는 참조를 재정의하거나 객체의 내부 상태(내부 데이터)를 변경할 수 없기 때문입니다.

요약하자면

  1. 단순 변수는 값 비트를 저장하는 반면, 참조 변수는 객체 검색 방법을 나타내는 비트를 저장합니다.
  2. 개체 참조는 한 가지 개체 유형에 대해서만 선언됩니다.
  3. Java의 모든 클래스는 참조 유형입니다.
  4. Java에서 참조 변수의 기본값은 입니다 null.
  5. String참조 유형의 표준 예입니다. 이 클래스도 변경할 수 없습니다.
  6. 수정자가 있는 참조 변수는 final재정의 가능성 없이 하나의 객체에만 바인딩됩니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION