마커 인터페이스 및 딥 카피 - 1

"안녕, 아미고!"

"안녕, 빌라보!"

"오늘은 마커 인터페이스 에 대해 말씀드리겠습니다 ."

"마커 인터페이스는 메서드가 없는 인터페이스입니다. 클래스가 이러한 인터페이스를 구현할 때 인터페이스에 의해 표시된다고 합니다."

"이러한 인터페이스의 예에는 Cloneable, Serializable, Remote가 포함됩니다 ."

" Serializable 인터페이스는 직렬화를 지원하는 클래스를 표시하는 데 사용되며 이러한 클래스의 인스턴스가 자동으로 직렬화 및 역직렬화될 수 있음을 나타냅니다."

" 원격 인터페이스는 원격 실행을 지원하는 개체, 즉 다른 JVM(Java Virtual Machine) 및/또는 다른 컴퓨터에서 호출할 수 있는 메서드를 식별하는 데 사용됩니다."

" Cloneable 인터페이스는 복제를 지원하는 클래스를 표시하는 데 사용됩니다."

"아, 복제나 복사에 대해."

"복사에는 얕은 복사와 깊은 복사의 두 가지 유형이 있습니다."

" 얕은 복사는 참조하는 개체를 복제하지 않고 개체의 복사본을 만드는 것입니다."

" 깊은 복사에는 참조하는 개체와 해당 개체가 참조하는 개체 등을 포함하여 개체를 복제하는 작업이 포함됩니다."

"딥 클론을 안정적으로 생성할 수 있는 정말 좋은 방법이 있습니다."

"이 방법은 개발자가 클래스를 복제 가능으로 표시하는 것을 잊은 경우에도 작동합니다. "유일한 요구 사항은 객체가 직렬화 가능해야 한다는 것입니다."

"방법은 다음과 같습니다."

1) 메모리에 버퍼(바이트 배열)를 만듭니다.

2) 개체와 하위 개체를 버퍼로 직렬화합니다.

3) 버퍼에 저장된 개체 계층 구조를 역직렬화합니다.

암호
BigObject objectOriginal = new BigObject();

ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer);
outputStream.writeObject(objectOriginal);
outputStream.close();

byte[] buffer = writeBuffer.toByteArray();
ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer);
ObjectInputStream inputStream = new ObjectInputStream(readBuffer);
BigObject objectCopy = (BigObject)inputStream.readObject();

"첫 번째 줄에서 복제할 objectOriginal 을 만듭니다 . 개체와 모든 하위 개체는 직렬화를 지원해야 합니다."

"세 번째 줄에서 ByteArrayOutputStream 을 생성합니다 . 이는 ArrayList와 같이 새 데이터가 추가될 때 동적으로 확장됩니다."

"4행에서 우리는 직렬화에 사용되는 ObjectOutputStream을 생성합니다."

"라인 5에서 outputStream을 사용하여 objectOriginal을 바이트 배열로 직렬화 하고 writeBuffer 에 저장합니다 ."

"8행에서 writeBuffer를 일반 바이트 배열로 변환합니다 . 나중에 이 배열에서 새 개체를 '읽습니다'."

"라인 9에서 버퍼를 InputStream처럼 읽기 위해 버퍼를 ByteArrayInputStream 으로 변환합니다 ."

"10행에서 객체를 읽기(역직렬화)하기 위해 readBuffer를 ObjectInputStream 생성자 에 전달합니다 ."

"11행에서 객체를 읽고 BigObject로 변환합니다 . "

"어떻게 생각하나요?"

"예쁘다."

"그런데 코드가 다른 색상으로 강조 표시되면 훨씬 이해하기 쉽습니다."