Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

clone()
๐Ÿ“‚ JAVA/์ฃผ์š” ๊ฐœ๋…

clone()

2023. 4. 7. 23:40

1. ๊ฐœ๋… ๐Ÿ‘ท‍โ™‚๏ธ

  clone() ๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ์„ ๋ณต์ œํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ์„ ํ•œ๋‹ค.

 

2. ์‚ฌ์šฉ๋ฐฉ๋ฒ• ๐Ÿ‘ฉ‍โš•๏ธ

  clone()์€ Object ํด๋ž˜์Šค์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

public class Object {
    protected native Object clone() throws CloneNotSupportedException;
}

  ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ 2๊ฐ€์ง€๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

  1. Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  2. clone()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ฉด์„œ ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ protected์—์„œ public์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
public class User implements Cloneable {
	String name;
	int age;
	
	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	@Override
	public User clone() {
		Object obj = null;
		try {
			obj = super.clone();
		}catch(CloneNotSupportedException e) {}
		
		return (User) obj;
	}	
}

  ๋งˆ์ปค์ธํ„ฐํŽ˜์ด์Šค์ธ Cloneable์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” 'ํด๋ž˜์Šค ์ž‘์„ฑ์ž๊ฐ€ ๋ณต์ œ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ'์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

  ๋˜ํ•œ, clone()์„ ๊ณต๋ณ€ ๋ฐ˜ํ™˜ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ํ™•์ธํ•˜์ž.

// ๊ณต๋ณ€ ๋ฐ˜ํ™˜ํƒ€์ž… ์ ์šฉ X
@Override
public Object clone() {
    Object obj = null;
    try {
        obj = super.clone();
    }catch(CloneNotSupportedException e) {}

    return obj;
}

// ๊ณต๋ณ€ ๋ฐ˜ํ™˜ํƒ€์ž… ์ ์šฉ O
@Override
public User clone() {
    Object obj = null;
    try {
        obj = super.clone();
    }catch(CloneNotSupportedException e) {}

    return (User) obj;
}

 

3. ์ฃผ์˜์  ๐Ÿ‘จ‍๐Ÿ”ง

  Object ํด๋ž˜์Šค์— ์ •์˜๋œ clone()์€ ๋‹จ์ˆœํžˆ ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ์™„์ „ํ•œ ์ธ์Šคํ„ด์Šค ๋ณต์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

  ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ์ฒด ๋ฐฐ์—ด์€ ๊ทธ ์ž์ฒด๋กœ๋„ ์ฐธ์กฐ ํƒ€์ž…์ด๊ณ , ๊ฐ์ฒด ๋ฐฐ์—ด์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐ’๋“ค ์—ญ์‹œ ์ฐธ์กฐ ํƒ€์ž…์ด๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ์ฒด ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•˜๊ฒŒ ๋˜๋ฉด ์–•์€ ๋ณต์‚ฌ๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

public static void main(String[] args) {
    User[] usersOrigin = {
            new User("amenable", 24),
            new User("sunny", 21)
    };

    User[] usersCopy = usersOrigin.clone();
    for(User user : usersOrigin) {
        System.out.println(user);
    }
    // User [name=amenable, age=24]
    // User [name=sunny, age=21]
    for(User user : usersCopy) {
        System.out.println(user);
    }
    // User [name=amenable, age=24]
    // User [name=sunny, age=21]

    usersOrigin[0].name = "jay";
    usersOrigin[0].age = 30;
    for(User user : usersOrigin) {
        System.out.println(user);
    }
    // User [name=jay, age=30]
    // User [name=sunny, age=21]
    for(User user : usersCopy) {
        System.out.println(user);
    }
    // User [name=jay, age=30] // ์–•์€ ๋ณต์‚ฌ
    // User [name=sunny, age=21]
}

  ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋ฉด์„œ ๊ฐ์ฒด๋งˆ๋‹ค ๋ณต์‚ฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

public static void main(String[] args) {
    User[] usersOrigin = {
            new User("amenable", 24),
            new User("sunny", 21)
    };

    User[] usersCopy = new User[2];
    for(int i = 0; i < usersOrigin.length; i++) {
        usersCopy[i] = usersOrigin[i].clone();
    }
}

 

  ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์•˜์„ ๋•Œ ์˜๋ฌธ์ ์ด ํ•˜๋‚˜ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. String์€ ๊ธฐ๋ณธ ๊ฐ์ฒด ํƒ€์ž…์ด ์•„๋‹Œ๋ฐ ์–ด๋–ป๊ฒŒ ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋˜๋Š” ๊ฑธ๊นŒ?

public static void main(String[] args) {
    User userA = new User("amenable", 24);
    User userB = userA.clone();

    System.out.println(userA.name); // amenable
    System.out.println(userB.name); // amenable

    userA.name = "sunny";
    System.out.println(userA.name); // sunny 
    System.out.println(userB.name); // amenable // ๊นŠ์€๋ณต์‚ฌ
}

  ๊ทธ ์ด์œ ๋Š” String์˜ ํŠน์„ฑ ๋•Œ๋ฌธ์ด๋‹ค. ์ž๋ฐ”์—์„œ String ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์˜ ๋ฌธ์ž์—ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ธฐ์กด์˜ ๋ฌธ์ž์—ด ๊ฐ’์„ ๊ฐ€์ง„ String ๊ฐ์ฒด๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๋ณ€๊ฒฝ๋œ ๋ฌธ์ž์—ด์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

  ์ฆ‰, String๋„ ๊ธฐ๋ณธ ํƒ€์ž…์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ๊ฐ’๋งŒ ๋ณต์‚ฌ๋˜์—ˆ์ง€๋งŒ ๋ฌธ์ž์—ด ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ฐธ์กฐ๊ฐ’์€ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ String ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋œ๋‹ค. ์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•ด ๋ณด๋„๋ก ํ•˜์ž.

 

ํ•ด๋‹น ๊ธ€์€
Inpa ๋‹˜์˜ '[JAVA] clone ๋ฉ”์„œ๋“œ ์žฌ์ •์˜(์–•์€ ๋ณต์‚ฌ & ๊นŠ์€ ๋ณต์‚ฌ)',
injae ๋‹˜์˜ 'Javaํ”„๋กœ์ ํŠธํ•˜๋ฉด์„œ String์˜ ํŠน์„ฑ์œผ๋กœ ์ธํ•œ ๊นŠ์€ ๋ณต์‚ฌ ์„ค๋ช…ํ•˜๊ธฐ',
๋‚จ๊ถ์„ฑ ๋‹˜์˜ '์ž๋ฐ”์˜ ์ •์„'
์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

'๐Ÿ“‚ JAVA > ์ฃผ์š” ๊ฐœ๋…' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ œ๋„ค๋ฆญ(Generics) - ๊ธฐ๋ณธ ๊ฐœ๋…  (0) 2023.05.13
๋ž˜ํผ ํด๋ž˜์Šค (Wrapper Class)  (0) 2023.05.09
์–•์€ ๋ณต์‚ฌ(Shallow Copy) vs ๊นŠ์€ ๋ณต์‚ฌ(Deep Copy)  (0) 2023.04.07
JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ  (0) 2023.03.24
๋ณ€์ˆ˜  (0) 2023.03.21
    '๐Ÿ“‚ JAVA/์ฃผ์š” ๊ฐœ๋…' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ์ œ๋„ค๋ฆญ(Generics) - ๊ธฐ๋ณธ ๊ฐœ๋…
    • ๋ž˜ํผ ํด๋ž˜์Šค (Wrapper Class)
    • ์–•์€ ๋ณต์‚ฌ(Shallow Copy) vs ๊นŠ์€ ๋ณต์‚ฌ(Deep Copy)
    • JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”