🗑️ The Garbage Collector: Java의 메모리 관리 🗑️
📌 참조 유형 (Reference Types) in Java
1. 강한 참조 (Strong Reference)
• 기본 참조 유형으로, 객체가 가비지 컬렉션의 대상이 되지 않도록 합니다.
• 객체가 강한 참조를 가지고 있는 한, 가비지 컬렉터는 그 객체를 수거하지 않습니다.
2. 약한 참조 (Weak Reference)
• 객체가 약한 참조만 가지고 있으면, 가비지 컬렉터가 그 객체를 언제든지 수거할 수 있습니다.
• 주로 메모리 누수를 방지하기 위해 사용되며, 캐시와 같은 상황에서 활용됩니다.
3. 소프트 참조 (Soft Reference)
• 약한 참조와 유사하지만, 메모리가 충분한 한 가비지 컬렉터가 수거하지 않습니다.
• 주로 메모리 민감한 캐시에서 사용됩니다.
4. 유령 참조 (Phantom Reference)
• 객체가 가비지 컬렉션의 대상이 된 후, 특정 작업을 수행하기 위해 사용됩니다.
• PhantomReference 객체와 함께 ReferenceQueue를 사용해야 합니다.
📝 요약
• 강한 참조 (Strong Reference): 기본 참조, 가비지 컬렉션의 대상이 되지 않음.
• 약한 참조 (Weak Reference): 객체가 가비지 컬렉션에 의해 수거될 수 있음.
• 소프트 참조 (Soft Reference): 메모리가 충분할 때 가비지 컬렉션에 의해 수거되지 않음.
• 유령 참조 (Phantom Reference): 객체가 수거된 후 특정 작업을 수행하기 위해 사용.
🛠️ 추상 클래스와 abstract 키워드 🛠️
• 추상 클래스 (Abstract Class)
• 인스턴스화할 수 없는 클래스입니다.
• 다른 클래스들이 상속받아야 하며, 필요한 경우 추상 메서드를 구현해야 합니다.
• 일반 메서드와 필드도 가질 수 있습니다.
• abstract 키워드
• 추상 클래스와 추상 메서드를 정의하는 데 사용됩니다.
• 유연성과 재사용성을 높이는 데 중요한 역할을 합니다.
🔍 자바의 어노테이션 (Annotations)
• 표준 어노테이션
• @Override: 메서드가 상위 클래스의 메서드를 오버라이드하고 있음을 나타냅니다.
• @Deprecated: 해당 요소가 더 이상 사용되지 않음을 나타냅니다.
• @SuppressWarnings: 컴파일러 경고를 무시합니다.
🚦 Access Modifiers in Java
• Public: 모든 클래스에서 접근 가능.
• Protected: 동일 패키지 또는 하위 클래스에서 접근 가능.
• Default: 동일 패키지 내에서만 접근 가능.
• Private: 해당 클래스 내에서만 접근 가능.
🚀 클래스 메서드와 final 메서드 🚀
• 클래스 메서드 (Static Methods)
• static 키워드를 사용하여 선언되며, 객체 생성 없이 클래스 이름을 통해 호출할 수 있습니다.
• this 키워드를 사용할 수 없습니다.
• final 메서드
• 하위 클래스에서 오버라이딩할 수 없는 메서드입니다.
• 클래스의 보안 및 신뢰성을 높이는 데 사용됩니다.
🧩 문제 풀이: IdentifyMyParts 클래스 🧩
public class IdentifyMyParts {
public static int x = 7;
public int y = 3;
}
IdentifyMyParts a = new IdentifyMyParts();
IdentifyMyParts b = new IdentifyMyParts();
a.y = 5;
b.y = 6;
a.x = 1;
b.x = 2;
System.out.println("a.y = " + a.y);
System.out.println("b.y = " + b.y);
System.out.println("a.x = " + a.x);
System.out.println("b.x = " + b.x);
System.out.println("IdentifyMyParts.x = " + IdentifyMyParts.x);
출력 결과:
• a.y = 5
• b.y = 6
• a.x = 2
• b.x = 2
• IdentifyMyParts.x = 2
분석:
• 클래스 변수: x는 모든 인스턴스에서 공유되며, 마지막 할당된 값이 반영됩니다.
• 인스턴스 변수: y는 각 인스턴스마다 독립적으로 값을 가집니다.
🔄 Iterator와 hasNext()
• Iterator는 컬렉션 객체를 순회할 때 사용됩니다.
• hasNext(): Iterator가 다음 요소를 가지고 있는지 여부를 반환합니다.
• next(): Iterator에서 다음 요소를 반환합니다.
이러한 요소들을 잘 이해하면 자바 프로그래밍에서 더욱 효율적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다. 💻✨
'Java' 카테고리의 다른 글
Interface, Type Casting, and the Power of hashCode & equals (0) | 2024.07.05 |
---|---|
Nested Classes, Local Classes, Anonymous Classes, and Lambda Expressions (0) | 2024.07.04 |
Interface, Superclass, and Call by Value (0) | 2024.07.03 |
자바 프로그래밍 핵심 개념 이해하기 (0) | 2024.07.01 |
C/C++ 프로그래밍 기초: 포인터, 반복문, 클래스, 그리고 Java의 데이터 타입 (2) | 2024.07.01 |