본문으로 바로가기
Java 객체지향 Part 5: static 메서드와 중첩 클래스
LinkedInGitHub
WORKSPACE

EXPLORER

157 POSTS
BLOG
면접질문
해야하는 거
AI 시대, 개발자는 사라지는가?
Python Counter, 빈도수를 쉽게 세는 방법
정렬
1. 투 포인터
DFS와 BFS
알고리즘 논리
코딩 테스트 핵심 알고리즘 정리파이썬 딕셔너리와 코딩 테스트 활용
예시로 살펴보는 AXAX 프로젝트, 문제 정의부터 확산까지AX 시대의 가치 정의와 현장 리딩
MSA
1. Singleton PatternSOLID
Kafka의 핵심 설계 원리Kafka 메시징 시스템의 구성과 동작 방식Kafka 기본 개념과 EC2 Docker 구성
쿠버네티스 입문
Modular Monolith1. MonolithMSA, 서비스 분리와 운영의 원리
Socket이란 무엇인가
네크워크 참조 모델
전체 데이터 구조REST API의 개념과 설계 원칙2. Field/ Parameter / Argument/ this
Actuator 란?EntityManagerJPA 연관관계 매핑JPA 트랜잭션(Transaction)입력값 검증Java의 AOP(Aspect Oriented Programming)Async : AsynchronousBeanJPA(Java Persistence API)Proxy 패턴Spring MVCdocker container1. Spirng 필요컴포넌트 스캔
Spring 컨테이너
application.yamlLombok
이번 강의는 무엇을 노리고 있을까?Spring AI를 배우기 전에 정리할 것23
1. 기술 스택
개발 문서를 읽기 위한 핵심 기술 용어
Docker를 이해하기 위한 운영체제 기초
sigterm
6. 설정과 저장소, 앱을 운영할 수 있는 상태로 만들기5. Service와 Ingress, 요청은 어디로 흐를까4. 직접 실험하는 Kubernetes, Pod 복구부터 롤백까지3. kubectl과 Pod, 상태에서 원인을 찾는 법2. 클러스터는 명령을 어떻게 Pod로 바꿀까1. 쿠버네티스, 원하는 상태와 컨테이너 이미지Calico쿠버네티스 입문, 원하는 상태를 유지하는 시스템
Psql JSONB, 행 잠금, 멱등성Psql 함수,프로시져,트리거
머신러닝 입문딥러닝 학습 기본 개념데이터 시각화기초 통계와 ML 파이프라인 연결분석 자동화와 파이프라인 설계
CNN 아키텍처 발전 과정이미지 세그멘테이션 모델과 핵심 개념객체 탐지 모델과 핵심 개념
딥러닝 데이터셋 엔지니어링
딥러닝 학습 문제 진단과 디버깅
도메인 적응 방법현대 LLM 워크플로의 패턴
Transformer에서 LoRA 적용 대상 정하기LoRA (Low-Rank Adaptation)
LLM 양자화와 QLoRA
분산 학습과 MLOps딥러닝 모델 경량화와 추론 최적화딥러닝 기본 학습 테크닉딥러닝 중급 학습 테크닉
Mixture of Experts(MoE) 핵심 개념멀티모달 파운데이션 모델 핵심 개념State Space Model과 MambaTransformer와 Vision Transformer
Latent Space
1Chunking?
DevOps 기초 1편
실습에서는?Agile 개요, 왜 필요한가?
CI/CD 기초 4편: 배포 전략과 운영CI/CD 기초 3편: Jenkins와 Argo CD를 이용한 GitOps 배포CI/CD 기초 2편: Docker 이미지와 배포 파이프라인CI/CD 기초 1편: 개념과 GitHub Actions
OCI: 컨테이너 이미지와 런타임의 공통 표준Docker 기초 13편: Compose Healthcheck와 실전 구성Docker 기초 12편: Compose 네트워크와 VolumeDocker 기초 11편: Compose 명령어와 환경 변수Docker 기초 10편: Compose 기본 구조와 이미지 빌드Docker 기초 9편: Docker 및 Kubernetes 네트워크Docker 기초 8편: 컨테이너 런타임과 격리Docker 기초 7편: 이미지 Layer와 tar 내부 구조Docker 기초 6편: 이미지 Layer와 빌드 최적화Docker 기초 5편: 컨테이너 기본 명령어와 VolumeDocker 기초 4편: 가상화와 컨테이너 이미지 생명주기Docker 기초 3편: CI/CD 연결과 배포 원칙Docker 기초 2편: Layer, Registry, Volume과 NetworkDocker 기초 1편: Dockerfile, Image와 Container
NginxNginx 로드 밸런싱과 HTTPSNginx 리버스 프록시와 Spring Boot 연결Nginx 기초와 동작 구조
05. Pinia 상태 관리: store 설계와 사용법04. Vue 컴포넌트 설계: props, emit, slot과 생명주기03. Vue Composition API 정리02. Vue 기초 문법 점검: JavaScript, 템플릿01. Vue.js 입문: 핵심 구조와 렌더링
Java 심화 Part 3: 함수형 프로그래밍과 LambdaJava 심화 Part 2: AnnotationJava 심화 Part 1: Reflection
Java 기초 Part 5: Stream APIJava 기초 Part 4: 제네릭Java 기초 Part 3: 제어문Java 기초 Part 2: 주석과 JavadocJava 기초 Part 1: 백엔드 배경과 Java 실행 구조
Java 디버깅 Part 1: 자주 헷갈리는 핵심 개념Java 디버깅 Part 2: VS Code 자동 컴파일과 프로젝트 구조
Java 실행과 JVM Part 3: ClassLoader와 JVM 메모리Java 실행과 JVM Part 2: 메모리와 데이터 흐름Java 실행과 JVM Part 1: Java와 Python 컴파일 비교
Java 객체지향 Part 5: static 메서드와 중첩 클래스Java 객체지향 Part 4: 상속과 인터페이스Java 객체지향 Part 3: 좋은 설계와 OOP 4대 특성Java 객체지향 Part 2: OOP 핵심 문법Java 객체지향 Part 1: 클래스, 객체, 필드와 생성자
Spring 기초 Part 11: Actuator와 애플리케이션 모니터링Spring 기초 Part 10: 비동기 처리와 @AsyncSpring 기초 Part 9: JPA 트랜잭션과 동시성 제어Spring 기초 Part 8: AOP와 공통 관심사 분리Spring 기초 Part 7: Proxy 패턴과 Spring ProxySpring 기초 Part 6: JPA 연관관계 매핑Spring 기초 Part 5: EntityManager와 영속성 컨텍스트Spring 기초 Part 4: JPA, Entity와 RepositorySpring 기초 Part 3: REST API 요청값과 입력값 검증Spring 기초 Part 2: Spring MVC 요청 처리 흐름Spring 기초 Part 1: IoC, Bean, DI와 주요 Annotation
DNS = Domain Name System
Spring Boot, WebSocket, Vue, Docker 로 Raspberry Pi 실시간 모니터링 프로젝트 만들기 - 1편1. Spring Boot 구현
1. GitHub Project 만들기
Python 코드 품질: 디버깅부터 테스트와 자동화까지Python 01. 실행 구조와 실무 기초
sLLM 핵심 기술과 전체 구조제한된 자원에서 sLLM 구축하기
시대 단상에 대한 주저리주저리
WORKSPACE

SEARCH

제목, 카테고리와 태그로 검색하세요.

VERSION CONTROL

SOURCE CONTROL

masterGitHub Pages
저장소 열기
BUILD STATUS

RUN AND DEBUG

게시물은 GitHub Actions에서 검증하고 정적 페이지로 빌드합니다.

Actions 열기
WORKSPACE

MANAGE

홈 열기전체 게시물태그 보기블로그 소개
Java 객체지향 Part 5: static 메서드와 중첩 클래스●
workspace>posts>java>oop>java-static-nested-class.md
java / oop2026.08.111 min read6 tags

Java 객체지향 Part 5: static 메서드와 중첩 클래스

Java static 메서드, 일반 내부 클래스, static 중첩 클래스의 차이와 사용 기준을 정리한다.

Java 객체지향 Part 5: static 메서드와 중첩 클래스

중첩 클래스에서 Static을 붙이는 이유는 바깥 객체와 연결되지 않은 클래스를 내부에 묶어두기 위해서이다.

일반 내부 클래스

tatic이 없는 내부 클래스는 바깥 객체에 소속

class User { String name = "민형";

class Profile {
    void printName() {
        System.out.println(name); 
    }
}

}

따라서 Profile 객체를 만들려면 먼저 User 객체가 필요하다.

User user = new User(); User.profile profile = user.new Profile();

구조를 개념적으로 보면 다음과 같다.

User 객체 └── Profile 객체 └── 바깥 User 객체를 참조

profile이 특정 User의 name을 사용하므로 바깥 객체와 연결되는 것이 자연스럽다

Static 중첩 클래스

static 중첩 클래스는 바깥 객체와 연결되지 않는다.

class User { static class Profile{ void printMessage(){ System.out.println("프로필입니다.") } } }

User.Profile profile = new User.Profile();

profile.printMessage();

여기서 User.Profile 이라고 쓰지만, 특정 User 객체에 소속된 것은 아니다. 단지 User와 관련된 클래스라서 User 내부에 정리한 것

왜 Static을 사용하는가?

1. 바깥 객체가 필요없기 때문에

다음 Address는 특정 User 객체의 필드에 직접 접근할 필요가 없다.

class User{ static class Address{ String city;

    Address(String city){
        this.city = city; 
    }
}

}

Address에 접근하고 싶다면

User.Address address = new User.Address("판교")

바깥 객체가 필요 없는데 일반 내부 클래스로 만들면 불필요하게 User 객체와 연결된다.

2. 관련 클래스를 한 곳에 묶을 수 있기 때문에

class HttpResponse{ static class Header{

}
static class Body{

}

}

Header 와 Body가 HttpsResponse와 관련있다는 것을 구조적으로 표현할 수 있다.

HttpResponse.Header header = new HttpResponse.Header(); HttpResponse.Body body = new HttpResponse.Body();

3. 불필요한 바깥 객체 참조를 막기 때문에

일반 내부 클래스 객체는 내부적으로 바깥 객체를 참조

내부 클래스 객체 ──참조──→ 바깥 클래스 객체

하지만 static 중첩 클래스에은 그 참조가 없다.

static 중첩 클래스 객체 바깥 클래스 객체

      서로 독립적

바깥 객체가 필요하지 않다면 static 중첩 클래스를 사용해야 구조가 단순하고 불필요한 객체 참조도 생기지 않는다.

개념 확인 문제

Receipt 클래스는 특정 Order 객체의 orderNumber를 직접 사용해야 한다.

Receipt는 특정 Order 객체의 orderNumber를 사용해야 하므로 일반 내부 클래스로 선언해야 한다. 일반 내부 클래스는 자신을 생성한 바깥 Order 객체를 참조할 수 있기 때문에

Static 메서드

판단 기준

클래스의 필드를 사용하느냐? 더 자세하게는, 이 기능이 특정 객체의 행동인가, 아니면 객체와 상관없는 공통 기능인가?

특정 객체의 데이터가 필요하지 않을 때 사용한다.

판단할 떄 이렇게 생각하면 된다.

이 기능을 실행하려면 특정 객체가 꼭 필요한가?

필요하면 일반 인스턴스 메서드

class User{ string name;

void printName() {}
    System.out.println(name); 

}

printName()은 특정 User 객체의 name이 필요하다.

User user = new User(); user.name = "민형"; user.printName();


반대로 특정 객체의 데이터가 필요하지 않으면 static 메서드를 사용할 수 있다.

class Calculator { static int add(int a, int b,){ return a + b; } }

add()는 어떤 calculator 객체의 상태도 사용하지 않으므로...

int result = Calculator.add(10,20);

정리하면

특정 객체의 필드가 필요한가? ├── 필요함 → 일반 인스턴스 메서드 └── 필요 없음 → static 메서드 고려

예를 들어 Order에서 특정 주문 번호를 출력하다면 일반 메서드가 자연스러움

class Order{ String orderNumber;

void printOrderNumber() {
    System.out.println(orderNumber); 
}

}

하지만 주문 번호의 형식만 검사한다면 특정 Order 객체가 없어도 된다.

class Order { static boolean isValidOrderNumber(String orderNumber) { return orderNumber.startsWith("ORDER-"); } }

boolean valid = Order.isValidOrderNumber("ORDER-100");

근데 그냥 필드 선언 안하고 쓰면 되는 거 아닌가?

class Calculator { int add(int a, int b) { return a + b; } }

class Calculator { static int add(int a, int b) { return a + b; } }

두 메서드는 모두 전달받은 값만 계산 -> 차이는 호출 방식

// 일반 메서드 Calculator calculator = new Calculator(); calculator.add(10,20):

// static 메서드 Calculator.add(10, 20);

일반 메서드는 필드를 사용하지 않더라도 객체를 먼저 만들어야 합니다. 반면 static 메서드는 객체 없이 실행할 수 있다. -> 이거는 객체를 만들지 않아서 상당히 편리하다!

그러면 Static method는 언제 안써야 하는가?

나중에 구현을 객체마다 다르게 바꿔야 한다면 일반 베서드로 구현해야 한다.

class Calculator { int calculate(int a, int b) { return a + b; } }

class MultiplyCalculator extends Calculator { @Override int calculate(int a, int b) { return a * b; } }

여기서는 객체에 따라 calculate() 동작이 달라진다.

Calculator calculator1 = new Calculator(); Calculator calculator2 = new MultiplyCalculator();

calculator1.calculate(10, 20); // 30 calculator2.calculate(10, 20); // 200

반대로 동작이 항상 같고, 특정 객체의 상태도 필요하지 않다면 static이 자연스럽다

class CalculatorUtils { static int add(int a, int b) { return a + b; } }

정리하면

필드가 필요하다 -> 일반 메소드 필드가 필요 없지만 객체마다 동작이 달라질 수 있다 -> 일반 메서드 필드가 필요 업고 동작도 항상 같다 -> static 메서드가 자연스럽다.

TAGS#Java#Static#Nested Class#Inner Class#Method#Polymorphism
PREVIOUSJava 심화 Part 2: AnnotationNEXTJava 심화 Part 3: 함수형 프로그래밍과 Lambda
DISCUSSION

COMMENTS

GitHub 계정으로 로그인하여 댓글을 남길 수 있습니다. 댓글은 GitHub Discussions에 공개 저장되며, 작성 내용과 GitHub 프로필 정보가 다른 방문자에게 보일 수 있습니다.

GitHub 로그인 후 댓글 쓰기Discussion 열기
DOCUMENT STRUCTURE

이 문서에는 목차가 없습니다.

DOCUMENT INFO
TYPE
Markdown
DATE
2026.08.11
READ
1 min read
WORDS
0
CATEGORY
java / oop
RELATED DOCUMENTS
Java 객체지향 Part 2: OOP 핵심 문법Java 객체지향 Part 1: 클래스, 객체, 필드와 생성자Java 객체지향 Part 4: 상속과 인터페이스Java 객체지향 Part 3: 좋은 설계와 OOP 4대 특성Java 디버깅 Part 1: 자주 헷갈리는 핵심 개념Spring 기초 Part 11: Actuator와 애플리케이션 모니터링
main java / oop
1 min readUTF-8Markdown
본문 글씨 크기
RECENTLY OPENED1
Java 객체지향 Part 5: static 메서드와 중첩 클래스recently opened