marker interface java
이 튜토리얼은 Java의 Marker Interface에 대해 설명합니다. 또한 코드 예제와 함께 Java에서의 직렬화 역 직렬화 및 복제에 대해서도 다룹니다.
인터페이스의 마지막 주제, 즉 Java의 마커 인터페이스에 대해 설명합니다.
마커 인터페이스를 마친 후에는 두 가지 예, 즉 Java의 직렬화 및 복제 가능 인터페이스에 대해 논의 할 것입니다. Marker 인터페이스부터 시작하겠습니다.
=> 처음부터 Java를 배우려면 여기를 방문하십시오.
학습 내용 :
자바의 마커 인터페이스
Java의 마커 인터페이스는 필드 나 메소드가없는 빈 인터페이스입니다. 이 마커 인터페이스는 마커 인터페이스를 구현하는 클래스의 객체가 다르며 다르게 처리되어야 함을 컴파일러에 알립니다.
Java의 각 마커 인터페이스는 JVM 또는 컴파일러에 특별한 것을 나타냅니다.
Java에는 아래와 같이 마커 인터페이스 인 세 가지 인터페이스가 있습니다.
# 1) 직렬화 가능한 인터페이스 : Serializable은 java.io 패키지에있는 마커 인터페이스입니다. 이 인터페이스를 사용하여 객체를 직렬화 할 수 있습니다. 즉, 객체 상태를 파일에 저장할 수 있습니다.
# 2) 복제 가능한 인터페이스 : 복제 가능한 인터페이스는 java.lang 패키지의 일부이며 객체를 복제 할 수 있습니다.
# 3) 원격 인터페이스 : 원격 인터페이스는 java.RMI 패키지의 일부이며이 인터페이스를 사용하여 RMI 애플리케이션을 만듭니다. 이 인터페이스는 주로 원격 객체를 다룹니다.
이 튜토리얼에서는 직렬화 및 복제 가능 인터페이스에 대해 설명합니다. 원격 인터페이스는 Java에서 RMI로 이동할 때 논의됩니다.
자바에서 직렬화
Java의 Serializable 인터페이스에 대해 자세히 알아보기 전에 Java의 직렬화 및 역 직렬화 프로세스를 이해해 보겠습니다.
직렬화는 객체 상태를 동등한 바이트 스트림으로 변환하여 객체를 파일의 메모리에 저장하는 프로세스로 정의 할 수 있습니다. 지속 그 물체.
저장된 상태에서 객체를 검색하고 그 내용에 액세스하려면 바이트 스트림을 다시 실제 Java 객체로 변환해야하며이 프로세스를 역 직렬화라고합니다.
이렇게하면 Java 애플리케이션의 수명에서 Java 객체를 직렬화 / 역 직렬화해야하는 경우가 많이있을 수 있습니다.
직렬화 / 역 직렬화 프로세스는 다음과 같습니다.
위에 표시된대로 직렬화는 객체를 스트림으로 변환합니다. 역 직렬화는 바이트 스트림을 다시 Java 객체로 변환합니다.
직렬화 및 역 직렬화의 전체 메커니즘은 플랫폼에 독립적입니다. 즉, 한 플랫폼에서 객체를 직렬화 한 다음 다른 플랫폼에서 역 직렬화 할 수 있습니다.
Java 객체를 직렬화했다고하면 ObjectOutputStream 메소드 writeObject ()를 호출하여 객체를 파일에 기록했음을 의미합니다.
public final void writeObect (Object obj) throws IOException
마찬가지로 deserialization의 경우 ObjectInputStream :: readObject () 메서드를 호출하여 객체를 저장 한 파일에서 데이터를 읽습니다.
public final Object readObject ()는 IOException, ClassNotFoundException을 발생시킵니다.
Java 직렬화 가능 인터페이스
Java는 Java에서 직렬화 및 역 직렬화를 구현할 수있는 '직렬화 가능'이라는 인터페이스를 제공합니다.
직렬화 가능한 인터페이스는 java.io 패키지의 일부입니다. 위에서 논의한 마커 인터페이스의 예이며 메서드 나 멤버가없는 0입니다. 직렬화 가능한 인터페이스는 Java 클래스를 '표시'하여 이러한 클래스의 객체가 자체적으로 지속되는 기능을 갖도록합니다.
따라서 객체를 유지해야하는 클래스는 Serializable 인터페이스를 구현해야합니다. 그런 다음이 클래스의 객체 (Serializable 인터페이스 구현)는 클래스 객체를 직렬화 및 역 직렬화하기 위해 각각 writeObject () 및 readObject () 메서드를 사용합니다.
모든 래퍼 클래스와 String 클래스는 기본적으로 java.io.Serializable을 구현합니다.
객체가 성공적으로 직렬화 되려면 다음 조건을 충족해야합니다.
- 객체가 직렬화되는 클래스는 java.io.Serializable 인터페이스를 구현해야합니다.
- 클래스의 모든 멤버 필드는 직렬화 가능해야합니다. 특정 필드를 직렬화 할 수없는 경우 임시로 표시해야합니다.
반대로, 클래스는 java.io.Serializable 인터페이스를 구현하는 경우에만 직렬화 가능합니다. 그렇지 않으면 직렬화 가능하지 않습니다.
Java에서 객체를 직렬화 및 역 직렬화하는 방법
Java에서 객체를 직렬화 할 때 objectOutputStream의 writeObject 메서드를 사용하여 객체를 파일에 씁니다.
Java에서 객체를 역 직렬화하기 위해 ObjectInputStream의 readObject () 메서드를 사용하여 파일의 내용을 읽고 객체로 읽습니다.
이 예에서 Serializable 인터페이스를 구현하는 Student 클래스가 있습니다. 이는 Student 클래스의 개체를 직렬화하거나 역 직렬화 할 수 있음을 의미합니다.
Java 프로그램의 주요 방법에서 Student 클래스 객체를 생성합니다. 그런 다음 FileOutputStream 객체를 가리키는 ObjectOutputStream을 생성하고이 객체는 Student 객체를 작성해야하는 파일을 가리 킵니다. 그런 다음 객체를 파일에 쓰는 writeObject () 메서드를 호출합니다.
지정된 오브젝트를 지정된 파일에 성공적으로 쓰면 프로그램은 적절한 출력 메시지를 제공합니다. 그런 다음 위의 프로세스를 반대로 수행하여 개체를 역 직렬화합니다. 먼저 내용을 읽을 파일을 읽는 ObjectOutputStream 객체를 만듭니다.
그런 다음 readObject () 메서드를 사용하여 내용을 읽고이를 Student 개체로 캐스팅합니다. 그런 다음 Student 개체의 내용을 인쇄합니다.
직렬화 / 비 직렬화 예제
다음 Java 프로그램은 위에서 설명한 Java의 직렬화 / 역 직렬화 메커니즘을 보여줍니다.
가짜 이메일 계정을 만드는 방법
import java.io.*; import java.io.Serializable; //Class Student implements class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } class Main{ public static void main(String args()){ try{ //Create the object of student class Student s1 =new Student(27,'Eddie'); //Write the object to the stream by creating a output stream FileOutputStream fout=new FileOutputStream('Eddie.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //close the stream out.close(); System.out.println('Object successfully written to the file'); //Create a stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('Eddie.txt')); Student s=(Student)in.readObject(); //print the data of the deserialized object System.out.println('Student object: ' + s.id+' '+s.name); //close the stream in.close(); }catch(Exception e){System.out.println(e);} } }
산출:
역 직렬화 후에는 동일한 파일을 다시 열 때 이전에 직렬화 한 것과 동일한 객체를 얻습니다.
자바 임시 키워드
transient 키워드는 데이터 멤버를 일시적으로 만드는 데 사용됩니다. 즉, 직렬화하고 싶지 않습니다.
예를 들면 다음 클래스 Employee를 고려하십시오. 여기에 다른 필드와 함께 직원 ID 필드가 있습니다. 이제 Employee Id 필드가 직렬화되지 않아야한다고 결정하면이를 '임시'로 선언합니다.
다음은 Java 프로그램의 예입니다.
import java.io.*; class Employee implements Serializable{ transient int id; String name; public Employee(int id, String name) { this.id = id; this.name = name; } } class Main{ public static void main(String args()){ try{ //Create the object of Employee class Employee s1 =new Employee(27,'Eddie'); //Write the object to the stream by creating a output stream FileOutputStream fout=new FileOutputStream('Eddie.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //close the stream out.close(); System.out.println('Object successfully written to the file'); //Create a stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('Eddie.txt')); Employee s=(Employee)in.readObject(); //print the data of the deserialized object System.out.println('Employee object: ' + s.id+' '+s.name); //close the stream in.close(); }catch(Exception e){System.out.println(e);} } }
산출:
위의 프로그램에서 우리는 Employee 개체를 직렬화했습니다. 그러나 Employee 클래스의 Employee id 필드는 '임시'로 선언되어 있습니다. 이제 직렬화를 확인하기 위해 객체를 역 직렬화합니다. 출력에는 Employee 개체가 '0 Eddie'로 표시됩니다. 이는 직원 ID가 파일에 저장되지 않았 음을 의미합니다.
Java의 Java.io.NotSerializableException
java.io.NotSerializableException의 예외는 클래스가 직렬화에 적합하지 않을 때 발생하는 예외입니다. Serializable 인터페이스를 구현하지 않는 클래스는 직렬화에 적합하지 않게됩니다.
아래 Java 프로그램은 NotSerializableException을 보여줍니다.
import java.io.*; class Employee { transient int id; String name; public Employee(int id, String name) { this.id = id; this.name = name; } } class Main{ public static void main(String args()){ try{ //Create the object of Employee class Employee s1 =new Employee(27,'Eddie'); //Write the object to the stream by creating a output stream FileOutputStream fout=new FileOutputStream('Eddie.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //close the stream out.close(); System.out.println('Object successfully written to the file'); }catch(Exception e){System.out.println(e);} } }
산출:
위의 프로그램에서 볼 수 있듯이 Employee 클래스는 Serializable 인터페이스를 구현하지 않습니다. 따라서 Employee 클래스 개체를 직렬화하려고하면 NotSerializableException이 throw됩니다.
Java에서 복제 가능한 인터페이스
개체 복제는 개체의 복사본을 만드는 것을 의미합니다. Java는“ 복제 가능 ' 상호 작용. 복제 가능한 인터페이스는 마커 인터페이스이며 java.lang 패키지의 일부입니다.
클래스가 Cloneable 인터페이스를 구현하면이 클래스의 객체를 복제 할 수 있음을 의미합니다. Java의 Object 클래스에는‘ 복제하다 () '방법. 따라서 특정 클래스에 의해 구현 된 Cloneable 인터페이스는 clone () 메서드가 클래스 인스턴스의 복사본을 만들 수있는 권한을 부여합니다.
클래스가 Cloneable 인터페이스를 구현하지 않고 여전히 clone () 메서드를 호출하는 경우 예외 CloneNotSupportedException Java 컴파일러에 의해 발생합니다.
Cloneable 인터페이스를 구현하는 클래스는 clone () 메서드를 재정의해야합니다.
그렇다면 개체 복제 란 무엇입니까?
객체 복제는 Object 클래스의 clone () 메서드를 사용하여 객체의 정확한 복사본을 만드는 프로세스입니다. clone () 메서드를 재정의하고 호출하려면 클래스가 Cloneable 인터페이스를 구현해야합니다.
clone () 메서드의 일반적인 구문은 다음과 같습니다.
보호 개체 clone () 던지다 CloneNotSupportedException
Java 플랫폼의 구성 요소는 무엇입니까?
clone () 메서드는 new 키워드를 사용하여 새 개체를 만드는 데 걸리는 시간보다 적은 처리 시간으로 개체의 정확한 복사본을 만듭니다.
아래 Java 프로그램은 clone () 메소드와 Cloneable 인터페이스의 사용을 보여줍니다.
class Student implements Cloneable{ int rollno; String name; //class constructor Student(int rollno,String name){ this.rollno=rollno; this.name=name; } //clone method public Object clone()throws CloneNotSupportedException{ return super.clone(); } } class Main{ public static void main(String args()){ try{ Student s1=new Student(101,'Lissa'); //clone the s1 object Student s2=(Student)s1.clone(); System.out.println('Original Student object: ' + s1.rollno+' '+s1.name); System.out.println('Cloned Student object: ' + s2.rollno+' '+s2.name); }catch(CloneNotSupportedException c){} } }
산출:
이 프로그램에는 Cloneable 인터페이스를 구현하는 Student 클래스가 있습니다. 또한 super.clone () 메서드를 호출하여 clone () 메서드를 재정의합니다. 기본 메서드에서 새 Student 개체를 만든 다음이 개체에서 새 Student 개체를 반환하는 clone () 메서드를 호출합니다.
Java에서 어레이 복제
어레이에 대한 자습서에서 어레이 복제에 대해 살펴 보았습니다. Java 배열은 기본적으로 Cloneable 인터페이스를 구현하므로 명시 적으로 구현할 필요가 없습니다. 1 차원 배열이 복제되면 배열의 전체 복사본이 생성됩니다. 2 차원 배열이 복제되면 얕은 복사본이 만들어집니다.
얕은 복사본을 만드는 것은 Java에서 clone () 메서드의 기본 동작입니다. 그러나 대부분의 경우 우리는 깊은 복제를 원합니다. 딥 클로닝에서는 멤버별로 오브젝트 멤버의 복사본을 만들고 원본 오브젝트와 독립적 인 복제본을 만듭니다. 복제 개체에 대한 변경 사항은 원래 개체에 반영되지 않습니다.
다음 Java 프로그램은 1 차원 배열의 복제를 보여줍니다.
class Main { public static void main(String args()) { //define an array int intArray() = {2,6,3,7,1,8}; //invoke clone () method on intArray int cloneArray() = intArray.clone(); //print the arrays. System.out.println('Original intArray:'); for (int i = 0; i 산출:

Java에서 목록 복제
아래 프로그램은 clone () 메서드를 사용하여 Java에서 목록을 복제하는 방법을 보여줍니다.
import java.util.ArrayList; import java.util.Arrays; import java.util.List; // MyList Class implementing cloneable class MyList implements Cloneable { String name1; String name2; // Constructor MyList(String name1, String name2) { this.name1 = name1; this.name2 = name2; } // To print the objects in the desired format @Override public String toString() { return 'Hello ' + name1 + ',' + name2 + '
' ; } // Overriding the clone method @Override protected MyList clone() { return new MyList(name1 , name2); } } class Main { public static void main(String() args) { // Create a list List original = Arrays.asList( new MyList('Sydney','Rose'), new MyList('Joe','Ian')); // Create an empty list List cloned_list = new ArrayList(); // Loop through the list and clone each element for (MyList temp : original) cloned_list.add(temp.clone()); System.out.print(cloned_list); } }
산출:

위의 프로그램에서 Cloneable 인터페이스를 구현하는 MyList 클래스를 생성했으며이 클래스 내부에서 List를 복제하는 데 도움이되는 clone () 메서드를 재정의했습니다. 주요 방법에서는 요소 목록을 만든 다음 목록을 반복하여 목록의 각 요소를 복제합니다.
자주 묻는 질문
Q # 1) Java에서 Marker Interface를 사용하는 것은 무엇입니까?
대답: '태그 된 인터페이스'라고도하는 마커 인터페이스는 클래스에 태그를 지정하고이 클래스가 특수 동작을 구현할 수 있음을 컴파일러에 알립니다.
Q # 2) Java의 모든 Marker Interface는 무엇입니까?
대답: Serializable, Cloneable 및 Remote는 Java에서 마커 인터페이스의 예인 인터페이스입니다.
Q # 3) 직렬화가 마커 인터페이스 인 이유는 무엇입니까?
대답: 직렬화 가능한 인터페이스에는 메서드 나 멤버 변수가 없습니다. 마커 인터페이스로 분류하는 것은 빈 인터페이스입니다.
Q # 4) 실행 가능한 마커 인터페이스입니까?
대답: 아니요, runnable은 마커 인터페이스가 아닙니다. 실행 가능한 인터페이스는 비어 있지 않으며 내부에 run () 메서드 선언을 제공합니다.
Q # 5) 복제 가능 인터페이스를 구현해야하는 이유는 무엇입니까?
대답: 클래스에 대해 복제 가능한 인터페이스를 구현함으로써 Object 클래스의 clone () 메서드를 사용하여이 클래스의 객체를 복제 할 수 있음을 나타냅니다. clone () 메서드를 사용하는 클래스가 복제 가능한 인터페이스를 구현하지 않으면‘CloneNotSupportedException’예외가 발생합니다.
결론
이 튜토리얼을 통해 Java의 인터페이스에 대한 논의를 완료했습니다. 우리는 인터페이스의 개념, 구조, 정의, 사용법 등에 대해 논의했습니다. 또한 Java와 유사한 Comparable, Comparator, Marker 인터페이스 등의 중요한 인터페이스에 대해 논의했습니다.
이 튜토리얼에서는 마커 인터페이스의 두 가지 예, 즉 직렬화 가능 및 복제 가능에 대해 논의했습니다. 직렬화 가능한 인터페이스는 개체를 유지하는 데 사용됩니다. 복제 가능한 인터페이스는 클래스 개체를 복제하는 데 사용됩니다. 이 두 인터페이스는 모두 마커 인터페이스입니다. 즉, 비어 있습니다.
그러나 클래스가이를 구현할 때 컴파일러가이를 구현하는 클래스에서 특별한 동작을 기대할 수 있음을 나타냅니다.
예를 들면 클래스가 Serializable 인터페이스를 구현할 때 클래스 객체를 직렬화 또는 역 직렬화하고 상태를 저장 / 검색 할 수 있습니다.
복제 가능한 인터페이스를 구현하는 클래스는이 클래스의 객체를 복제 할 수 있음을 나타냅니다. clone () 메서드의 기본 구현은 객체의 얕은 복사본을 만드는 반면 clone () 메서드를 재정 의하여 전체 복사본을 만들 수 있습니다.
추천 도서