πŸ“‚ JAVA/μ£Όμš” κ°œλ…

마컀 μΈν„°νŽ˜μ΄μŠ€ (Marker Interface)

Amenable 2023. 3. 9. 21:59

1. μ •μ˜ πŸ’

interface XXX {
	
}

  마컀 μΈν„°νŽ˜μ΄μŠ€(Marker Interface)λž€ 아무 λ©”μ„œλ“œλ„ μ„ μ–Έν•˜μ§€ μ•Šμ€ μΈν„°νŽ˜μ΄μŠ€λ‹€. ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λŠ” 객체의 νƒ€μž…κ³Ό κ΄€λ ¨λœ μ •λ³΄λ§Œμ„ μ œκ³΅ν•΄ μ£ΌλŠ” 역할을 ν•œλ‹€. κ·Έλž˜μ„œ μ»΄νŒŒμΌλŸ¬μ™€ JVM은 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 객체에 λŒ€ν•œ 좔가적인 정보λ₯Ό 얻을 수 μžˆλ‹€. 쑰금 더 κ°„λ‹¨ν•˜κ²Œ λ§ν•˜μžλ©΄, 마컀 μΈν„°νŽ˜μ΄μŠ€λŠ” μžμ‹ μ„ κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€κ°€ νŠΉμ • 속성을 κ°€μ§„λ‹€λŠ” 것을 ν‘œν˜„ν•΄ μ£ΌλŠ” 것이닀.

 

2. μ˜ˆμ‹œλ₯Ό ν†΅ν•œ 이해 πŸ₯

  마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€κ°€ νŠΉμ • 속성을 κ°€μ§„λ‹€λŠ” 것을 ν‘œμ‹œν•΄ μ£ΌλŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ? μ•„λž˜μ˜ 동물 μ˜ˆμ‹œλ₯Ό 톡해 μ•Œμ•„λ³΄μž. κΈ°λ³Έ μ„€μ •은 μ•„λž˜μ™€ κ°™λ‹€.

  • μƒμœ„ν΄λž˜μŠ€μΈ Animalμ΄λΌλŠ” ν΄λž˜μŠ€κ°€ μžˆλ‹€.
  • Dog, Lion, Snake, Fish... λ“± μ—¬λŸ¬ κ°€μ§€ λ‹€λ₯Έ 동물 ν΄λž˜μŠ€λ“€μ΄ Animal 클래슀λ₯Ό μƒμ†λ°›λŠ”λ‹€.
  • isMammaliaλΌλŠ” λ©”μ„œλ“œλ₯Ό ν†΅ν•΄ Animal νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›κ³  ν•΄λ‹Ή λ³€μˆ˜κ°€ ν¬μœ λ₯˜μΈμ§€ μ•„λ‹Œμ§€λ₯Ό ν™•μΈν•œλ‹€.
class Animal {
	public static boolean isMammalia(Animal animal) {
		if(animal instanceof Dog) {
			return true;
		}
		else if(animal instanceof Lion) {
			return true;
		}
		else if(animal instanceof Snake) {
			return false;
		}
		else if(animal instanceof Fish) {
			return false;
		}
		// ...
	}
}

class Dog extends Animal{}
class Lion extends Animal{}
class Snake extends Animal{}
class Fish extends Animal{}

  일반적으둜 생각해 λ³Ό 수 μžˆλŠ” isMammalia λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 instanceof μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 일일이 λΉ„κ΅ν•˜λŠ” 것이닀.

  ν•˜μ§€λ§Œ μžμ‹ 클래슀의 κ°œμˆ˜κ°€ λ§Žμ•„μ§€λ©΄ μ½”λ“œκ°€ κΈΈμ–΄μ§€κ³  λ³΅μž‘ν•΄μ§„λ‹€. 이런 κ²½μš°μ— μ•„λ¬΄λŸ° λ‚΄μš©μ΄ μ—†λŠ” λ§ˆμ»€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•˜κ³  μžμ‹ ν΄λž˜μŠ€λ“€μ΄ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ ν•œλ‹€. 그러면 ν•΄λ‹Ή ν΄λž˜μŠ€λ“€μ΄ νŠΉμ • 속성을 κ°€μ§„λ‹€λŠ” 것이 ν‘œμ‹œλœλ‹€.

interface Mammalia{}
class Animal {
	public static boolean isMammalia(Animal animal) {
		if(animal instanceof Mammalia) {
			return true;
		}
		else {
			return false;
		}
	}
}

class Dog extends Animal implements Mammalia{}
class Lion extends Animal implements Mammalia{}
class Snake extends Animal {}
class Fish extends Animal {}

  즉, λ§ˆμ»€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄ λ‹¨μˆœ νƒ€μž… μ²΄ν¬λ₯Ό ν•  μˆ˜ μžˆλ‹€.

 

3. μžλ°”μ˜ 마컀 μΈν„°νŽ˜μ΄μŠ€ 🏏

  μžλ°”μ˜ λŒ€ν‘œμ μΈ 마컀 μΈν„°νŽ˜μ΄μŠ€λ‘œλŠ” Serializableκ³Ό Cloneable이 μžˆλ‹€.

1. Serializable

class A implements Serializable {
    int i;
    String s;
  
    // A class constructor
    public A(int i,String s)
    {
        this.i = i;
        this.s = s;
    }
}
  
public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        A a = new A(20,"Amenable");
  
        // Serializing 'a'
        FileOutputStream fos = new FileOutputStream("Amenable.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(a);
  
        // De-serializing 'a'
        FileInputStream fis = new FileInputStream("Amenable.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        A b = (A)ois.readObject();//down-casting object
  
        System.out.println(b.i+" "+b.s);
  
        // closing streams
        oos.close();
        ois.close();
    }
}

  Serializable은 μžμ‹ μ„ κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” ObjectOutputStream을 톡해 write ν•  수 μžˆλ‹€κ³  μ•Œλ €μ€€λ‹€. 즉, 직렬화할 수 μžˆλ‹€κ³  μ•Œλ €μ£ΌλŠ” 것이닀.

2. Cloneable

class A implements Cloneable
{
	int i;
	String s;

	public A(int i,String s) {
		this.i = i;
		this.s = s;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}

public class Test
{
	public static void main(String[] args) throws CloneNotSupportedException {
		A a = new A(20, "Amenable");
		A b = (A)a.clone();
	}
}

  Cloneable도 μžμ‹ μ„ κ΅¬ν˜„ν•œ 클래슀의 μΈν„°νŽ˜μ΄μŠ€λ§Œ clone()을 ν†΅ν•œ λ³΅μ œκ°€ κ°€λŠ₯ν•˜λ„λ‘ ν•œλ‹€. 즉, CloneableμΈν„°νŽ˜μ΄μŠ€κ°€ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€λŠ” 것은 클래슀 μž‘μ„±μžκ°€ 볡제λ₯Ό ν—ˆμš©ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

 


  μ΄νŽ™ν‹°λΈŒ μžλ°”μ—μ„œ 'clone μž¬μ •μ˜'κ΄€λ ¨ 뢀뢄을 κ³΅λΆ€ν•˜λ‹€κ°€ 마컀 μΈν„°νŽ˜μ΄μŠ€μ˜ κ°œλ…κΉŒμ§€ 였게 λ˜μ—ˆλ‹€. ν•΄λ‹Ή κ°œλ…μ„ ν† λŒ€λ‘œ clone μ‚¬μš©λ²•κ³Ό clone을 μž¬μ •μ˜ν•  λ•Œ μ£Όμ˜μ‚¬ν•­λ“€λ„ κ³„μ†ν•΄μ„œ 같이 곡뢀해 보도둝 ν•˜μž.

 

ν•΄λ‹Ή 글은
남ꢁ μ„±λ‹˜μ˜ JAVA의 정석,
μ‘°μŠˆμ•„ λΈ”λ‘œν¬λ‹˜μ˜ μ΄νŽ™ν‹°λΈŒ μžλ°”,
geeksforgeeks의 Marker interface in Java,
Inpaλ‹˜μ˜ μΈν„°νŽ˜μ΄μŠ€(Interface)의 정석 - νƒ„νƒ„ν•˜κ²Œ κ°œλ… 정리
 λ₯Ό μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.