목차

    ⏳ Time Log/1. One Day (Daily · 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)