목차

    불편함을 코드로 지웁니다.

    개발 공부 노트, 개발 도구와 문제를 해결한 과정, AI 프롬프트와 Obsidian 활용법을 정리합니다.

      ⏳ Time Log/TIL · 하루

      [TIL] Day 11 — Java 클래스 구조 심화 + 다형성 개념

      this.Serena 2026. 2. 18. 23:41

      [TIL] Day 11 — Java 클래스 구조 심화 + 다형성 개념

      날짜: 2025-11-03
      기술 스택: Java OOP 다형성 접근제어자 상속
      부트캠프: 풀스택 개발자 부트캠프 3주차


      클래스 구성 요소 총정리

      구성 요소 역할
      멤버변수(필드) 객체 상태 저장
      메서드 객체 동작 정의
      생성자 객체 생성 시 초기화
      getter/setter private 필드 간접 접근
      접근제어자 가시성(접근 범위) 제어

      static 변수 vs 인스턴스 변수

      class Counter {
          static int total = 0; // 모든 인스턴스 공유 (클래스 레벨)
          int count = 0;        // 각 객체마다 별도 (인스턴스 레벨)
      
          Counter() { total++; } // 생성될 때마다 total 증가
      }
      
      Counter c1 = new Counter();
      Counter c2 = new Counter();
      System.out.println(Counter.total); // 2 — 공유됨
      System.out.println(c1.count);      // 0 — 각자 독립

      접근제어자 가시성 정리

      제어자 같은 클래스 같은 패키지 자식 클래스 외부
      private ✅ ❌ ❌ ❌
      default ✅ ✅ ❌ ❌
      protected ✅ ✅ ✅ ❌
      public ✅ ✅ ✅ ✅
      • 클래스 선언 앞에는 public 또는 default만 가능
      • 메서드에는 4가지 모두 사용 가능

      final 키워드

      final int MAX = 100;           // 변수: 재할당 불가 (상수)
      final void display() { /* 구현 */ } // 메서드: 자식 오버라이드 불가
      final class Utility { /* 구현 */ }  // 클래스: 상속 불가

      다형성 (Polymorphism)

      class Animal {
          void sound() { System.out.println("소리"); }
      }
      class Dog extends Animal {
          @Override
          void sound() { System.out.println("멍멍"); }
          void fetch() { System.out.println("공 가져오기"); }
      }
      
      // 업캐스팅: 부모 타입으로 자식 객체 참조
      Animal a = new Dog();  // 업캐스팅 (자동)
      a.sound();             // 멍멍 — 오버라이딩된 자식 메서드 호출 (동적 바인딩)
      // a.fetch();          // 컴파일 오류 — 부모 타입에 없는 메서드
      
      // 다운캐스팅: 부모 타입 → 자식 타입
      Dog d = (Dog) a;       // 명시적 다운캐스팅
      d.fetch();             // 정상 호출
      구분 설명
      업캐스팅 자식 → 부모 타입, 자동 변환
      다운캐스팅 부모 → 자식 타입, 명시적 캐스팅 필요
      동적 바인딩 런타임에 실제 객체 타입의 메서드 호출

      트러블슈팅

      다운캐스팅 시 ClassCastException

      • 원인: 실제 객체 타입이 캐스팅 대상과 다를 때
      • 해결: instanceof로 확인 후 캐스팅
      if (a instanceof Dog) {
          Dog d = (Dog) a;
          d.fetch();
      }

      default 생성자 관련 오류

      • 매개변수 있는 생성자를 정의하면 기본 생성자가 자동 생성되지 않음
      • new ClassName() 호출 시 오류 → 명시적으로 기본 생성자 추가

      더 알아볼 것

      • 추상 클래스(abstract class)와 인터페이스(interface) 차이
      • 업캐스팅 활용 사례 — 배열에 여러 자식 타입 담기
      • instanceof 연산자 + Java 16+ pattern matching
      • 멤버 변수는 오버라이딩 대상이 아님 — 참조 타입(선언 타입)에 따라 결정됨
      • protected 접근제어자가 패키지 설계에 미치는 영향