on my way

CS μŠ€ν„°λ”” 02-1 컴퓨터 μ–Έμ–΄: Java λ³Έλ¬Έ

Computer Science

CS μŠ€ν„°λ”” 02-1 컴퓨터 μ–Έμ–΄: Java

wingbeat 2024. 10. 24. 22:22
λ°˜μ‘ν˜•

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/main

Part 2. Language

πŸ’Ž Java Link

  • JVM 에 λŒ€ν•΄μ„œ / GC 의 원리
  • Collection
  • Annotation
  • Generic
  • final
  • Overriding vs Overloading
  • Access Modifier
  • Wrapper class
  • Multi-Thread ν™˜κ²½μ—μ„œμ˜ 개발

μΆ”κ°€ 자료


1. JVMμ΄λž€ λ¬΄μ—‡μΈκ°€μš”? / JVM의 역할은 λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:
JVM(Java Virtual Machine)은 μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μš΄μ˜μ²΄μ œμ™€ 상관없이 싀행될 수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” 가상 λ¨Έμ‹ μž…λ‹ˆλ‹€. μžλ°” μ½”λ“œλŠ” λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜λ˜μ–΄ JVMμ—μ„œ μ‹€ν–‰λ˜λ©°, 이λ₯Ό 톡해 μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μš΄μ˜μ²΄μ œμ— λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. JVM은 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 λ©”λͺ¨λ¦¬ 관리, Garbage Collection(GC), μŠ€λ ˆλ“œ 관리 등을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.


2. Garbage Collection(GC)μ΄λž€ λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:
Garbage Collection은 JVM이 μžλ™μœΌλ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 객체λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. 객체가 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠμœΌλ©΄, GCκ°€ ν•΄λ‹Ή 객체λ₯Ό μ œκ±°ν•˜μ—¬ λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 κ΄€λ¦¬ν•©λ‹ˆλ‹€. GCλŠ” 주둜 Mark-and-Sweep μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬, μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό μ°Ύμ•„λ‚΄μ–΄ μ œκ±°ν•©λ‹ˆλ‹€.


3. Java Collectionμ΄λž€ λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:
Java Collection은 λ°μ΄ν„°μ˜ 집합을 κ΄€λ¦¬ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬λ‘œ, μ—¬λŸ¬ ν˜•νƒœμ˜ 데이터λ₯Ό μ €μž₯ν•˜κ³  μ‘°μž‘ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ 자료ꡬ쑰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. λŒ€ν‘œμ μΈ μ»¬λ ‰μ…˜ μΈν„°νŽ˜μ΄μŠ€λ‘œλŠ” List, Set, Queue, Map 등이 있으며, 각각의 μΈν„°νŽ˜μ΄μŠ€λŠ” ArrayList, HashSet, LinkedList, HashMapκ³Ό 같은 λ‹€μ–‘ν•œ κ΅¬ν˜„μ²΄λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

μ»¬λ ‰μ…˜(Collection) vs λ°°μ—΄(Array)

  • λ°°μ—΄(Array):
    • κ³ μ •λœ 크기λ₯Ό κ°–λŠ” 데이터 κ΅¬μ‘°μž…λ‹ˆλ‹€. 배열은 μ„ μ–Έ μ‹œμ μ— 크기가 정해지며, 이후에 크기λ₯Ό λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    • λ°°μ—΄μ˜ μš”μ†ŒλŠ” λ™μΌν•œ νƒ€μž…μ΄μ–΄μ•Ό ν•˜λ©°, 인덱슀λ₯Ό 톡해 μ ‘κ·Όν•©λ‹ˆλ‹€.
    • 배열은 주둜 μ„±λŠ₯이 μ€‘μš”ν•œ μƒν™©μ—μ„œ μ‚¬μš©λ˜λ©°, 초기 λ©”λͺ¨λ¦¬ 할당이 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
    int[] arr = new int[10]; // 배열은 크기가 고정됨
  • μ»¬λ ‰μ…˜(Collection):
    • 크기가 가변적이며, ν•„μš”ν•œ 만큼 λ™μ μœΌλ‘œ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • List, Set, Mapκ³Ό 같은 λ‹€μ–‘ν•œ ν˜•νƒœμ˜ μ»¬λ ‰μ…˜μ„ μ œκ³΅ν•˜λ©°, λ‹€μ–‘ν•œ 데이터 ꡬ쑰와 μ•Œκ³ λ¦¬μ¦˜μ„ λ‚΄μž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
    • μ»¬λ ‰μ…˜μ€ λ‹€μ–‘ν•œ μžλ£Œν˜•μ„ 담을 수 있고, μ„±λŠ₯ μ΅œμ ν™”μ™€ λ‹€μ–‘ν•œ μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜μ—¬ νŽΈλ¦¬ν•¨μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
    List<Integer> list = new ArrayList<>();
    list.add(1); // λ™μ μœΌλ‘œ 크기 증가
  • 차이점:
    • 배열은 κ³ μ • 크기이고 μš”μ†Œμ— λŒ€ν•œ 직접적인 인덱슀 접근이 κ°€λŠ₯ν•˜λ©°, μ„±λŠ₯이 μ€‘μš”ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • μ»¬λ ‰μ…˜μ€ λ™μ μœΌλ‘œ 크기λ₯Ό μ‘°μ •ν•  수 있으며, λ‹€μ–‘ν•œ μžλ£Œκ΅¬μ‘°μ™€ μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜μ—¬ 더 μœ μ—°ν•©λ‹ˆλ‹€.

4. Annotationμ΄λž€ λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:
Annotation은 μ½”λ“œμ— 메타데이터λ₯Ό μΆ”κ°€ν•˜λŠ” λ°©μ‹μœΌλ‘œ, μ»΄νŒŒμΌλŸ¬μ—κ²Œ νŠΉμ • 정보λ₯Ό μ œκ³΅ν•˜κ±°λ‚˜ λŸ°νƒ€μž„ μ‹œμ μ— νŠΉμ • λ™μž‘μ„ ν•˜λ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, @OverrideλŠ” λ©”μ„œλ“œκ°€ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λŠ” κ²ƒμž„μ„ λͺ…μ‹œν•˜λ©°, @DeprecatedλŠ” 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œλ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€. μ• λ„ˆν…Œμ΄μ…˜μ€ 주둜 λ¦¬ν”Œλ ‰μ…˜(Reflection)κ³Ό ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€.

Annotationμ΄λž€?

  • μ• λ„ˆν…Œμ΄μ…˜(Annotation)은 μžλ°”μ—μ„œ 메타데이터λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•œ λ„κ΅¬μž…λ‹ˆλ‹€.
  • 주둜 컴파일러 μ§€μ‹œλ¬Έ, λŸ°νƒ€μž„μ—μ„œ νŠΉμ • 처리λ₯Ό νŠΈλ¦¬κ±°ν•˜κ±°λ‚˜ μ½”λ“œμ˜ ꡬ쑰λ₯Ό λͺ…ν™•νžˆ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.
  • μ• λ„ˆν…Œμ΄μ…˜ μžμ²΄λ‘œλŠ” νŠΉλ³„ν•œ λ™μž‘μ„ ν•˜μ§€ μ•Šμ§€λ§Œ, 이λ₯Ό ν•΄μ„ν•˜λŠ” νˆ΄μ΄λ‚˜ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
    @Override
    public void myMethod() {
        // λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©
    }
  • μ˜ˆμ‹œ:
  • μ£Όμš” μ• λ„ˆν…Œμ΄μ…˜:
    • @Override: λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©μ„ λͺ…μ‹œ
    • @Deprecated: μ‚¬μš©μ΄ ꢌμž₯λ˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œλ‚˜ ν΄λž˜μŠ€μ— λΆ™μž„
    • @SuppressWarnings: νŠΉμ • κ²½κ³ λ₯Ό λ¬΄μ‹œ

5. Genericμ΄λž€ λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:
Generic은 ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œμ—μ„œ μ‚¬μš©ν•  데이터 νƒ€μž…μ„ 미리 μ§€μ •ν•˜μ§€ μ•Šκ³ , νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μœ μ—°ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 있게 ν•΄μ£ΌλŠ” μžλ°”μ˜ κΈ°λŠ₯μž…λ‹ˆλ‹€. μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ 컴파일 μ‹œ νƒ€μž… 검사λ₯Ό 톡해 μ½”λ“œ μ•ˆμ •μ„±μ„ 높이고, λΆˆν•„μš”ν•œ ν˜•λ³€ν™˜μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, List<String>은 λ¬Έμžμ—΄λ§Œ 담을 수 μžˆλŠ” 리슀트둜, 잘λͺ»λœ νƒ€μž…μ˜ 데이터λ₯Ό λ„£μœΌλ € ν•˜λ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.


6. final ν‚€μ›Œλ“œλž€ λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:
**final**은 λ³€μˆ˜, λ©”μ„œλ“œ, ν΄λž˜μŠ€μ— μ‚¬μš©λ˜μ–΄ μˆ˜μ •ν•  수 μ—†μŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

  • final λ³€μˆ˜: 값을 ν•œ 번만 ν• λ‹Ήν•  수 있으며, 이후 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • final λ©”μ„œλ“œ: ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜(Overriding)ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • final 클래슀: 상속할 수 μ—†λŠ” ν΄λž˜μŠ€κ°€ λ©λ‹ˆλ‹€.

7. Overridingκ³Ό Overloading의 차이점은 λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:

  • Overriding은 λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. λ©”μ„œλ“œμ˜ 이름, λ§€κ°œλ³€μˆ˜, λ°˜ν™˜ νƒ€μž…μ΄ λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ 동일해야 ν•©λ‹ˆλ‹€.
  • Overloading은 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž… λ˜λŠ” 개수λ₯Ό λ‹€λ₯΄κ²Œ ν•˜μ—¬ μ—¬λŸ¬ 번 μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λŠ” 컴파일 μ‹œμ μ— κ²°μ •λ©λ‹ˆλ‹€.

Overridingκ³Ό Overloading 곡톡점 (λ‹€ν˜•μ„±)

  • 곡톡점:
    • λ‘˜ λ‹€ λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. λ‹€ν˜•μ„±μ΄λž€, λ™μΌν•œ μ΄λ¦„μ˜ λ©”μ„œλ“œκ°€ μ—¬λŸ¬ ν˜•νƒœλ‘œ λ™μž‘ν•  수 μžˆλŠ” λŠ₯λ ₯을 μ˜λ―Έν•©λ‹ˆλ‹€.
    • Overloadingκ³Ό Overriding을 μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό 가독성을 높이고, λ‹€ν˜•μ„±μ„ 톡해 더 μœ μ—°ν•œ 섀계λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Overriding:
    • λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
    • λŸ°νƒ€μž„ μ‹œ λ™μž‘μ΄ κ²°μ •λ˜λ©°, 상속과 κ΄€λ ¨λœ λ‹€ν˜•μ„±μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
  • Overloading:
    • 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ 개 μ •μ˜ν•˜λ˜, νŒŒλΌλ―Έν„°μ˜ νƒ€μž…μ΄λ‚˜ κ°œμˆ˜κ°€ λ‹€λ₯Έ κ²½μš°μž…λ‹ˆλ‹€.
    • 컴파일 μ‹œμ μ— μ–΄λŠ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ μ§€ κ²°μ •λ˜λ©°, λ©”μ„œλ“œμ˜ λ‹€ν˜•μ„±μ„ λ†’μ—¬μ€λ‹ˆλ‹€.

μ˜€λ²„λΌμ΄λ”©κ³Ό μ˜€λ²„λ‘œλ”©μ˜ μ‹œμ  차이

  • μ˜€λ²„λ‘œλ”©(Overloading):
    • 컴파일 μ‹œμ μ— κ²°μ •λ©λ‹ˆλ‹€.
    • 같은 λ©”μ„œλ“œ 이름을 κ°€μ§€μ§€λ§Œ νŒŒλΌλ―Έν„° νƒ€μž…μ΄λ‚˜ κ°œμˆ˜κ°€ λ‹€λ₯Έ μ—¬λŸ¬ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
    • μ»΄νŒŒμΌλŸ¬λŠ” λ©”μ„œλ“œ 호좜 μ‹œμ μ— κ°€μž₯ μ ν•©ν•œ λ©”μ„œλ“œλ₯Ό μ°Ύμ•„λƒ…λ‹ˆλ‹€.
    public void print(int x) {
        System.out.println("int: " + x);
    }
    
    public void print(double x) {
        System.out.println("double: " + x);
    }
  • μ˜€λ²„λΌμ΄λ”©(Overriding):
    • λŸ°νƒ€μž„ μ‹œμ μ— κ²°μ •λ©λ‹ˆλ‹€.
    • μƒμœ„ 클래슀의 λ©”μ„œλ“œλ₯Ό ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜μ—¬, ν•˜μœ„ 클래슀 객체가 μƒμœ„ 클래슀 νƒ€μž…μœΌλ‘œ 호좜될 λ•Œ λ™μž‘μ΄ κ²°μ •λ©λ‹ˆλ‹€.
    class Parent {
        public void show() {
            System.out.println("Parent");
        }
    }
    
    class Child extends Parent {
        @Override
        public void show() {
            System.out.println("Child");
        }
    }
    
    Parent p = new Child(); // λŸ°νƒ€μž„ μ‹œ Child의 show() 호좜
  • μ‹œμ  차이:
    • μ˜€λ²„λ‘œλ”©μ€ 컴파일 μ‹œ μ–΄λ–€ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ μ§€ κ²°μ •λ˜μ§€λ§Œ,
    • μ˜€λ²„λΌμ΄λ”©μ€ λŸ°νƒ€μž„ μ‹œμ— μ–΄λ–€ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ μ§€ κ²°μ •λ©λ‹ˆλ‹€.

8. Access Modifier(μ ‘κ·Ό μ œν•œμž)λž€ λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:
Access ModifierλŠ” 클래슀, λ©”μ„œλ“œ, λ³€μˆ˜ λ“±μ˜ μ ‘κ·Ό λ²”μœ„λ₯Ό μ§€μ •ν•˜λŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.

  • public: μ–΄λ””μ„œλ‚˜ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • protected: 같은 νŒ¨ν‚€μ§€ λ˜λŠ” 상속받은 ν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • default: μ ‘κ·Ό μ œν•œμžλ₯Ό λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄, 같은 νŒ¨ν‚€μ§€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • private: 같은 클래슀 λ‚΄μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.

9. Wrapper Classλž€ λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:
Wrapper ClassλŠ” κΈ°λ³Έ 데이터 νƒ€μž…(int, char, boolean λ“±)을 객체둜 감싸기 μœ„ν•œ 클래슀λ₯Ό λ§ν•©λ‹ˆλ‹€. μžλ°”λŠ” μžλ™μœΌλ‘œ κΈ°λ³Έν˜•μ„ 객체둜 λ³€ν™˜ν•˜λŠ” μ˜€ν† λ°•μ‹±(Auto-Boxing)κ³Ό 객체λ₯Ό κΈ°λ³Έν˜•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” μ–Έλ°•μ‹±(Unboxing)을 μ§€μ›ν•©λ‹ˆλ‹€. λŒ€ν‘œμ μΈ Wrapper ν΄λž˜μŠ€μ—λŠ” Integer, Boolean, Character 등이 μžˆμŠ΅λ‹ˆλ‹€.

Wrapper 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. κΈ°λ³Έ 데이터 νƒ€μž…μ„ 객체둜 닀루기 μœ„ν•΄: μžλ°”μ˜ κΈ°λ³Έ 데이터 νƒ€μž…(int, char, boolean λ“±)은 객체가 μ•„λ‹ˆλ―€λ‘œ, κΈ°λ³Έ νƒ€μž…μ„ 객체둜 닀루기 μœ„ν•΄μ„œλŠ” Wrapper ν΄λž˜μŠ€κ°€ ν•„μš”ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬(예: ArrayList, HashSet)λŠ” 객체만 μ €μž₯ν•  수 μžˆμœΌλ―€λ‘œ κΈ°λ³Έ νƒ€μž…μ„ 직접 μ €μž₯ν•  수 μ—†κ³ , 이λ₯Ό 객체둜 λ³€ν™˜ν•œ Wrapper 클래슀λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  2. μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œ 제곡: Wrapper ν΄λž˜μŠ€λŠ” κΈ°λ³Έ νƒ€μž…μ„ 객체둜 λ³€ν™˜ν•˜λŠ” κ²ƒλΏλ§Œ μ•„λ‹ˆλΌ, λ‹€μ–‘ν•œ μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Integer.parseInt() λ©”μ„œλ“œλŠ” λ¬Έμžμ—΄μ„ μ •μˆ˜λ‘œ λ³€ν™˜ν•΄ μ£ΌλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
  3. κΈ°λ³Έ νƒ€μž…κ³Ό 객체 νƒ€μž… κ°„μ˜ λ³€ν™˜: μžλ°”μ—μ„œλŠ” κΈ°λ³Έ 데이터 νƒ€μž…κ³Ό 객체 νƒ€μž… κ°„μ˜ λ³€ν™˜μ΄ 자주 ν•„μš”ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, κΈ°λ³Έ 데이터 νƒ€μž…μ„ μ»¬λ ‰μ…˜μ— μ €μž₯ν•˜κ±°λ‚˜, λ©”μ„œλ“œμ— 객체둜 μ „λ‹¬ν•˜λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. Wrapper ν΄λž˜μŠ€λŠ” μ΄λŸ¬ν•œ λ³€ν™˜μ„ μ‰½κ²Œ ν•  수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€. μžλ°” 5 μ΄ν›„μ—λŠ” μ˜€ν† λ°•μ‹±(Auto-Boxing)κ³Ό μ–Έλ°•μ‹±(Unboxing)을 톡해 κΈ°λ³Έ νƒ€μž…κ³Ό Wrapper 클래슀 κ°„μ˜ λ³€ν™˜μ΄ μžλ™μœΌλ‘œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
  4. null κ°’ 처리: κΈ°λ³Έ 데이터 νƒ€μž…μ€ null 값을 κ°€μ§ˆ 수 μ—†μ§€λ§Œ, Wrapper ν΄λž˜μŠ€λŠ” κ°μ²΄μ΄λ―€λ‘œ null 값을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ null 값이 ν•„μš”ν•  λ•ŒλŠ” Wrapper 클래슀λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ:

int primitiveInt = 10;
Integer wrapperInt = Integer.valueOf(primitiveInt);  // κΈ°λ³Έ νƒ€μž…μ„ 객체둜 λ³€ν™˜ (μ˜€ν† λ°•μ‹±)
int unboxedInt = wrapperInt;  // κ°μ²΄μ—μ„œ κΈ°λ³Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ (μ–Έλ°•μ‹±)

// μ»¬λ ‰μ…˜μ— κΈ°λ³Έ νƒ€μž…μ„ μ €μž₯ν•  λ•ŒλŠ” Wrapper ν΄λž˜μŠ€κ°€ ν•„μš”
List<Integer> intList = new ArrayList<>();
intList.add(primitiveInt);  // μ˜€ν† λ°•μ‹±μ„ 톡해 κΈ°λ³Έ νƒ€μž…μ΄ μžλ™μœΌλ‘œ Integer 객체둜 λ³€ν™˜λ¨

λ”°λΌμ„œ Wrapper ν΄λž˜μŠ€λŠ” κΈ°λ³Έ 데이터 νƒ€μž…μ„ 객체둜 닀루기 μœ„ν•΄, λ‹€μ–‘ν•œ μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œ μ‚¬μš©, κΈ°λ³Έ νƒ€μž…κ³Ό 객체 κ°„μ˜ λ³€ν™˜, null κ°’ 처리 등을 κ°€λŠ₯ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.


10. Multi-Thread ν™˜κ²½μ—μ„œμ˜ κ°œλ°œμ—μ„œ κ³ λ €ν•  점은 λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:
λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— 같은 μžμ›μ— μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμ— 동기화(Synchronization)λ₯Ό 톡해 경쟁 μƒνƒœ(Race Condition)λ‚˜ λ°λ“œλ½(Deadlock)κ³Ό 같은 λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ™κΈ°ν™”λŠ” synchronized ν‚€μ›Œλ“œλ‚˜ 락(Lock)을 μ‚¬μš©ν•΄ κ΅¬ν˜„ν•  수 있으며, 이λ₯Ό 톡해 곡유 μžμ›μ— λŒ€ν•œ μŠ€λ ˆλ“œ κ°„μ˜ 접근을 μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


11. Javaμ—μ„œμ˜ Garbage Collection(GC)λŠ” μ–΄λ–»κ²Œ λ™μž‘ν•˜λ‚˜μš”?

λ‹΅λ³€:
Garbage Collection은 μžλ°”μ˜ λ©”λͺ¨λ¦¬ 관리 κΈ°λ²•μœΌλ‘œ, μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό μžλ™μœΌλ‘œ ν•΄μ œν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. GCλŠ” 주둜 Mark-and-Sweep μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬, 객체의 μ°Έμ‘° μ—¬λΆ€λ₯Ό ν™•μΈν•˜κ³  μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€. GCλŠ” JVM의 Young Generationκ³Ό Old Generation μ˜μ—­μ—μ„œ 각각 λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λ©°, Stop-the-World와 같은 μ„±λŠ₯ 이슈λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμ–΄ μ„±λŠ₯ μ΅œμ ν™” μ‹œ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.


12. Java의 Collectionμ—μ„œ List와 Set의 차이점은 λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:

  • List: μˆœμ„œκ°€ μžˆλŠ” λ°μ΄ν„°μ˜ μ§‘ν•©μœΌλ‘œ, μ€‘λ³΅λœ μš”μ†Œλ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€. λŒ€ν‘œμ μΈ κ΅¬ν˜„μ²΄λ‘œλŠ” ArrayList, LinkedListκ°€ μžˆμŠ΅λ‹ˆλ‹€.
  • Set: μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μš”μ†Œμ˜ μ§‘ν•©μœΌλ‘œ, μˆœμ„œκ°€ μ—†μŠ΅λ‹ˆλ‹€. λŒ€ν‘œμ μΈ κ΅¬ν˜„μ²΄λ‘œλŠ” HashSet, TreeSet 등이 μžˆμŠ΅λ‹ˆλ‹€.

13. Java의 Generic을 μ‚¬μš©ν•˜λ©΄ μ–΄λ–€ μž₯점이 μžˆλ‚˜μš”?

λ‹΅λ³€:
Generic을 μ‚¬μš©ν•˜λ©΄ 컴파일 μ‹œ νƒ€μž… 검사λ₯Ό 톡해 μ½”λ“œμ˜ μ•ˆμ •μ„±μ„ 높일 수 있고, ν˜•λ³€ν™˜ 없이 객체λ₯Ό λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½”λ“œμ˜ 가독성과 μž¬μ‚¬μš©μ„±μ΄ ν–₯μƒλ©λ‹ˆλ‹€. λ˜ν•œ, μ—¬λŸ¬ νƒ€μž…μ— λŒ€ν•΄ 같은 μ½”λ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄ μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•©λ‹ˆλ‹€.


14. final ν‚€μ›Œλ“œλ₯Ό 클래슀, λ©”μ„œλ“œ, λ³€μˆ˜μ— 각각 μ μš©ν–ˆμ„ λ•Œμ˜ 차이점은 λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:

  • final 클래슀: 더 이상 상속할 수 μ—†μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, String ν΄λž˜μŠ€λŠ” final ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
  • final λ©”μ„œλ“œ: ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜(Overriding)ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • final λ³€μˆ˜: ν•œ 번 μ΄ˆκΈ°ν™”λœ 값을 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

15. Javaμ—μ„œ Overridingκ³Ό Overloading의 차이점은 λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:

  • Overriding: 상속 κ΄€κ³„μ—μ„œ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€κ°€ μž¬μ •μ˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λΆ€λͺ¨ λ©”μ„œλ“œμ™€ 이름, λ§€κ°œλ³€μˆ˜, λ°˜ν™˜ νƒ€μž…μ΄ 동일해야 ν•©λ‹ˆλ‹€.
  • Overloading: λ™μΌν•œ μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…, 개수, μˆœμ„œλ₯Ό λ‹€λ₯΄κ²Œ ν•˜μ—¬ μ—¬λŸ¬ 개 μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λŠ” 같은 클래슀 λ‚΄μ—μ„œ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

16. Javaμ—μ„œ Wrapper ν΄λž˜μŠ€λŠ” 무엇이고, μ™œ ν•„μš”ν•œκ°€μš”?

λ‹΅λ³€:
Wrapper ν΄λž˜μŠ€λŠ” μžλ°”μ˜ κΈ°λ³Έ 데이터 νƒ€μž…(int, boolean λ“±)을 객체둜 λ‹€λ£° 수 있게 ν•΄μ£ΌλŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€. μžλ°”μ˜ μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬λŠ” 객체λ₯Ό λ‹€λ£¨λ―€λ‘œ, κΈ°λ³Έ 데이터 νƒ€μž…μ„ 객체둜 κ°μ‹ΈλŠ” μ˜€ν† λ°•μ‹±(Auto-Boxing)κ³Ό μ–Έλ°•μ‹±(Unboxing)이 ν•„μš”ν•  λ•Œ Wrapper 클래슀λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.


17. λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ 동기화 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법은 λ¬΄μ—‡μΈκ°€μš”?

λ‹΅λ³€:
λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” 동기화(Synchronization)λ₯Ό 톡해 μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— 곡유 μžμ›μ— μ ‘κ·Όν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ synchronized ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, Lock을 μ‚¬μš©ν•˜μ—¬ νŠΉμ • μ½”λ“œ 블둝에 λŒ€ν•œ λ™μ‹œ 접근을 μ œμ–΄ν•©λ‹ˆλ‹€. Atomic ν΄λž˜μŠ€λ‚˜ Concurrent νŒ¨ν‚€μ§€μ˜ 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€λ ˆλ“œ μ•ˆμ „μ„±μ„ 보μž₯ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ°˜μ‘ν˜•