Search

μΈμŠ€ν„΄μŠ€

μΈμŠ€ν„΄μŠ€

μΈμŠ€ν„΄μŠ€(Instance)λŠ” ν΄λž˜μŠ€μ—μ„œ μƒμ„±λœ μ‹€μ²΄λ‘œ, ν”„λ‘œκ·Έλž¨μ—μ„œ μ‹€μ œλ‘œ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜μ–΄ λ™μž‘ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.
ν΄λž˜μŠ€κ°€ '섀계도'라면, μΈμŠ€ν„΄μŠ€λŠ” κ·Έ 섀계도λ₯Ό λ°”νƒ•μœΌλ‘œ λ§Œλ“€μ–΄μ§„ 'μ‹€μ œ μ œν’ˆ'이라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ 생성

μžλ°”μ—μ„œ μΈμŠ€ν„΄μŠ€ μƒμ„±μ΄λž€ 클래슀λ₯Ό 기반으둜 λ©”λͺ¨λ¦¬μ— 객체λ₯Ό λ§Œλ“œλŠ” κ³Όμ •μž…λ‹ˆλ‹€.
ν΄λž˜μŠ€λŠ” 객체λ₯Ό λ§Œλ“€κΈ° μœ„ν•œ 섀계도이고, μΈμŠ€ν„΄μŠ€λŠ” 이 섀계도λ₯Ό λ°”νƒ•μœΌλ‘œ μ‹€μ œλ‘œ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœ 객체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
μΈμŠ€ν„΄μŠ€ 생성은 보톡 'new' ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€:
Class λ³€μˆ˜λͺ… = new Class();
Java
볡사
// Person 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 Person person1 = new Person(); // String 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 String name = new String("홍길동");
Java
볡사
μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄:
β€’
λ©”λͺ¨λ¦¬μ— 객체λ₯Ό μœ„ν•œ 곡간이 ν• λ‹Ήλ©λ‹ˆλ‹€.
β€’
μƒμ„±μžκ°€ ν˜ΈμΆœλ˜μ–΄ 객체λ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
β€’
μƒμ„±λœ 객체의 μ°Έμ‘°κ°’(λ©”λͺ¨λ¦¬ μ£Όμ†Œ)이 λ³€μˆ˜μ— μ €μž₯λ©λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ μ‚¬μš© μ˜μ—­

Javaμ—μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ, λ©”λͺ¨λ¦¬λŠ” 크게 두 μ˜μ—­μ— λ‚˜λˆ„μ–΄ μ‚¬μš©λ©λ‹ˆλ‹€:
μŠ€νƒ(Stack) μ˜μ—­: 지역 λ³€μˆ˜μ™€ 객체 μ°Έμ‘° λ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” μ˜μ—­
νž™(Heap) μ˜μ—­: μ‹€μ œ 객체(μΈμŠ€ν„΄μŠ€)κ°€ μ €μž₯λ˜λŠ” μ˜μ—­
즉, Person person1 = new Person(); μ΄λΌλŠ” μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©΄:
1.
μŠ€νƒ(Stack) μ˜μ—­μ—λŠ” person1 λ³€μˆ˜κ°€ μƒμ„±λ©λ‹ˆλ‹€.
2.
νž™(Heap) μ˜μ—­μ—λŠ” Person 클래슀의 μ‹€μ œ 객체가 μƒμ„±λ©λ‹ˆλ‹€.
3.
person1 λ³€μˆ˜λŠ” νž™ μ˜μ—­μ— μƒμ„±λœ 객체의 λ©”λͺ¨λ¦¬ μ£Όμ†Œ(μ°Έμ‘°κ°’)λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ λ©”λͺ¨λ¦¬ 관리 κ΅¬μ‘°λŠ” Java의 가비지 μ»¬λ ‰μ…˜(Garbage Collection)κ³Ό λ°€μ ‘ν•œ 관련이 μžˆμŠ΅λ‹ˆλ‹€. 더 이상 μŠ€νƒ μ˜μ—­μ˜ λ³€μˆ˜μ—μ„œ μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” νž™ μ˜μ—­μ˜ κ°μ²΄λŠ” 가비지 컬렉터에 μ˜ν•΄ μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ©λ‹ˆλ‹€.
// μ˜ˆμ‹œ public void example() { Person person1 = new Person(); // person1은 μŠ€νƒμ—, μ‹€μ œ Person κ°μ²΄λŠ” νž™μ— 생성 // λ©”μ„œλ“œ μ’…λ£Œ μ‹œ μŠ€νƒμ˜ person1 λ³€μˆ˜λŠ” μ†Œλ©Έλ˜κ³ , // νž™μ˜ Person κ°μ²΄λŠ” 더 이상 μ°Έμ‘°λ˜μ§€ μ•Šμ•„ 가비지 μ»¬λ ‰μ…˜ λŒ€μƒμ΄ 됨 }
Java
볡사
μœ„ 이미지와 같이, μ°Έμ‘° λ³€μˆ˜λŠ” μŠ€νƒ μ˜μ—­μ—μ„œ νž™ μ˜μ—­μ— μžˆλŠ” μ‹€μ œ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” ꡬ쑰둜 λ™μž‘ν•©λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ μ‚¬μš© μ˜μ—­

Javaμ—μ„œ μΈμŠ€ν„΄μŠ€μ™€ κ΄€λ ¨λœ λ©”λͺ¨λ¦¬ μ‚¬μš© μ˜μ—­μ€ λ‹€μŒκ³Ό 같이 μš”μ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€νƒ(Stack) μ˜μ—­

β€’
지역 λ³€μˆ˜μ™€ λ©”μ„œλ“œ 호좜 정보가 μ €μž₯λ©λ‹ˆλ‹€.
β€’
객체에 λŒ€ν•œ μ°Έμ‘° λ³€μˆ˜(μ£Όμ†Œκ°’)κ°€ μ €μž₯λ©λ‹ˆλ‹€.
β€’
λ©”μ„œλ“œκ°€ μ’…λ£Œλ˜λ©΄ ν•΄λ‹Ή λ©”μ„œλ“œμ˜ μŠ€νƒ ν”„λ ˆμž„μ΄ μžλ™μœΌλ‘œ μ œκ±°λ©λ‹ˆλ‹€.
β€’
LIFO(Last In First Out) ꡬ쑰둜 λ™μž‘ν•©λ‹ˆλ‹€.

νž™(Heap) μ˜μ—­

β€’
μ‹€μ œ 객체(μΈμŠ€ν„΄μŠ€)κ°€ μ €μž₯λ˜λŠ” κ³΅κ°„μž…λ‹ˆλ‹€.
β€’
new μ—°μ‚°μžλ₯Ό 톡해 μƒμ„±λœ 객체가 이곳에 ν• λ‹Ήλ©λ‹ˆλ‹€.
β€’
μ°Έμ‘°κ°€ μ—†λŠ” κ°μ²΄λŠ” 가비지 컬렉터에 μ˜ν•΄ μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ©λ‹ˆλ‹€.
β€’
동적 λ©”λͺ¨λ¦¬ 할당이 μ΄λ£¨μ–΄μ§€λŠ” μ˜μ—­μž…λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •

1.
λ©”λͺ¨λ¦¬ ν• λ‹Ή: new μ—°μ‚°μžκ°€ νž™ μ˜μ—­μ— 객체λ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήν•©λ‹ˆλ‹€.
2.
객체 μ΄ˆκΈ°ν™”: ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ 곡간에 객체의 멀버 λ³€μˆ˜λ“€μ΄ κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.
3.
μƒμ„±μž 호좜: 클래슀의 μƒμ„±μžκ°€ ν˜ΈμΆœλ˜μ–΄ 객체의 초기 μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
4.
μ°Έμ‘°κ°’ λ°˜ν™˜: new μ—°μ‚°μžλŠ” μƒμ„±λœ 객체의 λ©”λͺ¨λ¦¬ μ£Όμ†Œ(μ°Έμ‘°κ°’)λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
5.
μ°Έμ‘° λ³€μˆ˜ ν• λ‹Ή: λ°˜ν™˜λœ 참쑰값이 μŠ€νƒ μ˜μ—­μ˜ μ°Έμ‘° λ³€μˆ˜μ— μ €μž₯λ©λ‹ˆλ‹€.
μ°Έκ³ : 객체 생성 μ‹œ λΉ„μš©μ΄ 많이 λ“€κΈ° λ•Œλ¬Έμ—, λΆˆν•„μš”ν•œ 객체 생성은 ν”Όν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 특히 반볡문 λ‚΄μ—μ„œμ˜ 객체 생성은 μ„±λŠ₯ μ €ν•˜μ˜ 원인이 될 수 μžˆμŠ΅λ‹ˆλ‹€.
// λ©”λͺ¨λ¦¬ μ‚¬μš© μ˜ˆμ‹œ public class MemoryExample { public static void main(String[] args) { // μŠ€νƒ μ˜μ—­μ— studentA λ³€μˆ˜ 생성 // νž™ μ˜μ—­μ— Student 객체 생성 ν›„ κ·Έ 참쑰값을 studentA에 μ €μž₯ Student studentA = new Student("홍길동", 20); // μŠ€νƒ μ˜μ—­μ— studentB λ³€μˆ˜ 생성 ν›„ studentA와 같은 객체 μ°Έμ‘° Student studentB = studentA; // studentBλ₯Ό 톡해 객체의 μƒνƒœ λ³€κ²½ studentB.setAge(21); // studentA둜 접근해도 같은 κ°μ²΄μ΄λ―€λ‘œ λ³€κ²½λœ 값이 좜λ ₯됨 System.out.println(studentA.getAge()); // 좜λ ₯: 21 } }
Java
볡사