목차

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

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

      ⏳ Time Log/TIL · 하루

      [TIL] Day 10 — Java 상속 심화 + 싱글턴 패턴

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

      [TIL] Day 10 — Java 상속 심화 + 싱글턴 패턴

      날짜: 2025-10-31
      기술 스택: Java OOP Inheritance Singleton super
      부트캠프: 풀스택 개발자 부트캠프 2주차


      상속 (Inheritance)

      class Animal {
          String name;
          void eat() { System.out.println(name + " 먹는 중"); }
      }
      class Dog extends Animal { // extends 키워드
          void bark() { System.out.println("멍멍"); }
      }
      
      Dog d = new Dog();
      d.name = "하루"; // 부모 필드 상속
      d.eat();         // 부모 메서드 상속
      d.bark();        // 자식 메서드
      • 자바는 단일 상속만 지원 (1개의 부모 클래스만)
      • private 멤버는 상속 관계에서 직접 접근 불가, getter/setter 통해 접근

      super 키워드

      class Person {
          String name;
          Person(String name) { this.name = name; }
          void introduce() { System.out.println("이름: " + name); }
      }
      class Student extends Person {
          int grade;
          Student(String name, int grade) {
              super(name);       // 부모 생성자 호출 — 첫 줄에 위치
              this.grade = grade;
          }
          @Override
          void introduce() {
              super.introduce(); // 부모 메서드 호출
              System.out.println("학년: " + grade);
          }
      }
      키워드 역할
      this 현재 객체 참조 / this()로 같은 클래스 다른 생성자 호출
      super 부모 클래스 참조 / super()로 부모 생성자 호출

      toString() / equals() 오버라이딩

      class Point {
          int x, y;
          Point(int x, int y) { this.x = x; this.y = y; }
      
          @Override
          public String toString() {
              return "Point(" + x + ", " + y + ")";
          }
      
          @Override
          public boolean equals(Object obj) {
              if (!(obj instanceof Point)) return false;
              Point p = (Point) obj;
              return this.x == p.x && this.y == p.y;
          }
      }
      
      Point p1 = new Point(1, 2);
      System.out.println(p1);              // toString() 자동 호출 → "Point(1, 2)"
      p1.equals(new Point(1, 2));          // true

      제어자(Modifier) 정리

      제어자 사용 가능한 곳 특징
      static 멤버변수, 메서드, 초기화 블록 객체 없이 사용
      final 클래스, 메서드, 변수 클래스: 상속 불가, 메서드: 오버라이딩 불가, 변수: 수정 불가
      abstract 클래스, 메서드 추상 클래스 선언, 자식이 반드시 구현

      싱글턴 패턴 (Singleton Pattern)

      public class DatabaseConnection {
          private static DatabaseConnection instance; // 유일 객체
      
          private DatabaseConnection() {} // 외부 생성 차단
      
          public static DatabaseConnection getInstance() {
              if (instance == null) {
                  instance = new DatabaseConnection();
              }
              return instance;
          }
      }
      
      // 사용 — 둘 다 같은 객체
      DatabaseConnection c1 = DatabaseConnection.getInstance();
      DatabaseConnection c2 = DatabaseConnection.getInstance();
      System.out.println(c1 == c2); // true

      싱글턴 활용 사례: DB 커넥션 풀, 로그 매니저, 환경 설정 객체, 스레드 풀


      트러블슈팅

      super() 위치 오류

      • super()는 자식 생성자 첫 줄에 있어야 함. 두 번째 줄에 위치 시 컴파일 오류

      Singleton 스레드 안전 문제

      • 위의 코드는 단일 스레드에서는 정상, 멀티스레드 환경에서는 race condition 발생 가능
      • 해결: synchronized 키워드 또는 이너 클래스 홀더 패턴(Initialization-on-demand holder) 사용

      더 알아볼 것

      • abstract class vs interface 차이
      • final + 상속 제한 실제 사용 사례
      • Singleton 스레드 안전 구현 (double-checked locking)
      • Object.hashCode() vs equals() 관계 원칙
      • 자바 코딩 컨벤션: 패키지 이름 스타일 (com.company.project)