language study/java | 문제풀이

[Java] 객체지향 기초 : 캡슐화, final, static 블록

지그농 2026. 5. 22. 12:23

자바와 객체 지향 개념에 대해 공부할 때 항상 헷갈리는 핵심 개념들이 있습니다.

이번 게시글에서는 코드의 안전성을 높이는 접근 제한자와 캡슐화, 프로그램의 구조를 잡는 package와 import, 그리고 데이터의 변경을 막고 초기화를 돕는 final과 static 블록에 대해 정리했습니다.

목차
1. 접근제한자와 캡슐화
2. package와 import
3. final과 static 블록

1. 접근 제한자 (Access Modifier)와 캡슐화 (Encapsulation)

접근 제한자는 클래스, 변수, 메서드의 사용 범위를 제한하는 역할을 합니다.

1.1 접근 허용 범위 크기

public > protected > default > private

 

 

  • public: 다른 패키지를 포함해 어디서나 접근 가능합니다.
  • protected: 같은 패키지 내에서 접근 가능하며, 다른 패키지에 있더라도 상속 관계(자식 클래스)라면 접근 가능합니다.
  • default: 접근 제한자를 명시하지 않았을 때의 기본값입니다. 같은 패키지 내부에서만 접근할 수 있습니다.
  • private: 같은 클래스 내부에서만 접근이 가능하며, 외부에서는 절대 직접 접근할 수 없습니다.

 

1.2 캡슐화

외부에서 클래스의 데이터(변수)에 직접 접근해 값을 바꾸지 못하도록 막고, 내가 정해둔 규칙(메서드)을 통해서만 데이터에 접근하고 수정할 수 있도록 제한하는 것을 캡슐화라고 합니다.

 

이는 데이터의 무결성이 깨지는 것을 막고 안전성을 높이기 위해, 오직 검증된 public 메서드로만 데이터 접근을 허용하는 대표적인 객체지향 기법입니다.

 

  • Setter (설정자 메서드): 외부에서 값을 전달받아 조건문 등으로 유효성을 검증한 뒤 내부 멤버 변수에 대입합니다. (접근)
  • Getter (접근자 메서드): private 멤버 변수의 값을 외부로 반환하여 읽기 기능을 제공합니다. (읽기)

 

package com.library.model;

public class Book {
    // 1. 외부에서 직접 변경하지 못하도록 private 선언
    private String title;
    private int price;

    // 2. Setter: 내가 정해둔 규칙으로만 값을 저장하도록 제어
    public void setTitle(String title) {
        // 입력된 제목 앞에 반드시 "[종이책]"이라는 접두사가 붙도록 규칙 설정
        this.title = "[종이책]" + title;
    }

    public void setPrice(int price) {
        // 가격이 음수가 되지 않도록 검증 규칙 적용
        if (price < 0) {
            this.price = 0;
        } else {
            this.price = price;
        }
    }

    // 3. Getter: 안전하게 데이터를 외부로 출력
    public String getTitle() {
        return this.title;
    }

    public int getPrice() {
        return this.price;
    }
}

 

 


2. 패키지(Package)와 임포트(Import)

Package

  • 정의: 물리적인 폴더 구조를 기반으로 관련 클래스들을 그룹화하여 관리하는 단위입니다.
  • 목적: 클래스 이름의 중복 및 충돌을 방지합니다.
  • 규칙: 소스 코드 최상단(첫 줄)에 명시해야 합니다.

Import

  • 정의: 다른 패키지에 속한 클래스를 참조할 때 사용합니다.
  • 권장사항: import 패키지명.*은 패키지 내 모든 클래스를 가리키지만, 코드의 가독성과 명확한 의존성 파악을 위해 사용하는 클래스명을 각각 명시하는 것을 권장합니다.
  • 특징: java.lang 패키지는 기본 패키지이므로 import문 없이 사용 가능합니다. (lang 예시 - System, String, Math...)
package com.library.service; // 최상단 위치

import com.library.model.Book; // 명시적 클래스 import

public class LibraryService {
    public void createBook() {
        Book myBook = new Book(); 
        myBook.setTitle("자바 가이드");
        
        // java.lang 패키지의 String과 System은 import 생략
        String title = myBook.getTitle();
        System.out.println(title); 
    }
}

 


3. final 제어자

final 키워드는 대상의 상태를 확정하여 이후 변경이나 확장이 불가능하도록 만듭니다.

컴파일 시점에 변경 시도를 차단하므로 런타임 오류를 예방하고 개발 생산성을 높입니다.

  • final 변수: 상수가 되며, 초기화 이후 값을 변경(재할당)할 수 없습니다.
  • final 클래스: 다른 클래스가 상속(Inheritance)할 수 없는 클래스가 됩니다.
  • final 메서드: 자식 클래스에서 오버라이딩(Overriding)하여 재정의할 수 없습니다.
package com.library.util;

// final 클래스: 상속 불가능
public final class BookConfig {

    // final 변수: 값 변경 불가능한 상수
    public static final int MAX_RENTAL_DAYS = 14; 

    // final 메서드: 자식 클래스에서 오버라이딩 불가능
    public final void printPolicy() {
        System.out.println("도서관 대여 정책입니다.");
    }
}

 


4. Static 블록과 인스턴스(Instance) 블록

Static 초기화 블록

  • 특징: 클래스가 메모리에 처음 로딩될 때 단 한 번만 실행됩니다. 객체 생성 여부와 무관하게 호출됩니다.
  • 목적: static 멤버 변수(클래스 변수)의 복잡한 초기화 작업을 수행할 때 사용합니다.

인스턴스 초기화 블록

  • 특징: 클래스 내부에 키워드 없이 { }로 작성하며, 인스턴스가 생성될 때마다 생성자보다 먼저 실행됩니다.
  • 목적: 다중 생성자가 존재할 때, 생성자의 종류와 관계없이 공통적으로 실행되어야 하는 초기화 코드를 중복 없이 작성할 때 사용합니다.
package com.library.model;

public class EBook {
    public static String libraryName;
    public String bookTitle;

    // 1. Static 블록: 클래스 로딩 시 1회 실행
    static {
        libraryName = "중앙 디지털 도서관";
        System.out.println("Static 블록 실행: 클래스 변수 초기화");
    }

    // 2. 인스턴스 블록: 객체 생성 시 생성자 호출 전에 실행
    {
        System.out.println("인스턴스 블록 실행: 객체 공통 로직 실행");
    }

    public EBook() {
        System.out.println("기본 생성자 실행");
    }

    public EBook(String bookTitle) {
        this.bookTitle = bookTitle;
        System.out.println("매개변수 생성자 실행");
    }
}
public class Main {
    public static void main(String[] args) {
        // 인스턴스를 생성하기 위해 EBook 클래스를 처음 호출하는 순간 클래스가 로딩됩니다.
        System.out.println("--- 첫 번째 객체 생성 ---");
        EBook book1 = new EBook("자바의 정석");

        System.out.println("\n--- 두 번째 객체 생성 ---");
        EBook book2 = new EBook();
    }
}
--- 첫 번째 객체 생성 ---
Static 블록: 클래스 변수(libraryName) 초기화 완료  <-- 클래스 로딩 시 최초 1회만
인스턴스 블록: 객체 생성 시 공통 로직 실행          <-- 인스턴스 생성 시 실행
매개변수 생성자 실행                                <-- 생성자 실행

--- 두 번째 객체 생성 ---
인스턴스 블록: 객체 생성 시 공통 로직 실행          <-- static 블록은 건너뛰고 인스턴스 블록 실행
기본 생성자 실행                                    <-- 생성자 실행

5. 참고 링크

 

java.lang (Java SE 23 & JDK 23 [build 1])

Provides classes that are fundamental to the design of the Java programming language. The most important classes are Object, which is the root of the class hierarchy, and Class, instances of which represent classes at run time. Frequently it is necessary t

download.java.net

 

[지금 무료]비전공자를 위한 자바| 이신만 - 인프런 강의

현재 평점 4.9점 수강생 946명인 강의를 만나보세요. 비전공자, 초보 개발자들이 자바 문법을 쉽게 배울 수 있습니다. 예제를 분석하며 문법을 배우는 방식입니다. 자바 문법, 객체지향, 자료구조,

www.inflearn.com