backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • 자바 메모리 구조
  • 스택과 큐
  • Static (정적 변수)
  • 인스턴스 변수 vs 클래스 변수
  1. 자바
  2. 06 클래스 기초

Static 보충자료

자바 메모리 구조

자바 프로그램 실행 시 JVM(Java Virtual Machine)은 메모리를 다음과 같이 나눕니다.

1. 메서드 영역 (Method Area)

  • 정의: 프로그램 실행에 필요한 공통 데이터를 관리하는 영역입니다.

  • 특징:

    • 클래스에 대한 정보(클래스 이름, 메서드, 필드 정보)가 저장됩니다.

    • static 변수와 같은 클래스 수준의 데이터가 저장됩니다.

2. 스택 영역 (Stack Area)

  • 정의: 실제 프로그램의 메서드가 실행될 때 사용되는 메모리 공간입니다.

  • 특징:

    • 스택 프레임(Stack Frame): 메서드 호출 시 생성되며, 지역 변수 및 호출 정보를 저장합니다.

    • 메서드 실행이 종료되면 해당 스택 프레임은 제거됩니다.

    • LIFO(Last In, First Out) 구조로 작동합니다.

3. 힙 영역 (Heap Area)

  • 정의: 객체 인스턴스와 배열이 생성되는 영역입니다.

  • 특징:

    • 런타임 중 동적 메모리 할당이 이루어집니다.

    • new 키워드를 통해 생성된 객체는 힙 영역에 저장됩니다.

    • 힙 영역에 있는 객체는 스택에 저장된 참조 변수를 통해 접근합니다.

스택과 큐

스택 (Stack)

  • 정의: 후입선출 (LIFO, Last In First Out) 방식의 자료 구조입니다.

  • 특징:

    • 마지막에 추가된 데이터가 가장 먼저 제거됩니다.

    • 주로 함수 호출, 되돌리기 기능 등에 사용됩니다.

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(10); // 데이터 추가
        stack.push(20);
        System.out.println(stack.pop()); // 20 (후입선출)
        System.out.println(stack.peek()); // 10 (마지막 데이터 확인)
    }
}

큐 (Queue)

  • 정의: 선입선출 (FIFO, First In First Out) 방식의 자료 구조입니다.

  • 특징:

    • 먼저 추가된 데이터가 먼저 제거됩니다.

    • 주로 대기열 처리, BFS 등에서 사용됩니다.

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        queue.offer(10); // 데이터 추가
        queue.offer(20);
        System.out.println(queue.poll()); // 10 (선입선출)
        System.out.println(queue.peek()); // 20 (첫 번째 데이터 확인)
    }
}

Static (정적 변수)

  • Static 변수란?

    • 클래스 로딩 시 메모리에 적재되며, 프로그램 종료 시까지 유지됩니다.

    • 클래스 수준에서 공유되며, 모든 객체가 동일한 메모리 위치를 참조합니다.

    • **메서드 영역(Method Area)**에서 관리됩니다.

    • 객체마다 다른 값을 가지는 인스턴스 변수와 달리 공유 데이터를 저장하는 용도로 사용됩니다.

  • 사용 이유

    • 객체 간 공유되는 데이터를 저장하거나 관리하기 위해 사용합니다.

    • 자주 사용되는 상수, 설정값, 전역 변수 등에 적합합니다.

class StaticVariableExample {
    static int sharedCounter = 0; // Static 변수 (공유 데이터)

    int instanceCounter = 0; // 인스턴스 변수 (객체마다 별도)

    void incrementCounters() {
        sharedCounter++; // Static 변수는 모든 객체가 공유
        instanceCounter++; // 인스턴스 변수는 객체마다 별도 관리
    }

    public static void main(String[] args) {
        StaticVariableExample obj1 = new StaticVariableExample();
        StaticVariableExample obj2 = new StaticVariableExample();

        obj1.incrementCounters();
        obj2.incrementCounters();

        System.out.println("obj1.instanceCounter: " + obj1.instanceCounter); // 1
        System.out.println("obj2.instanceCounter: " + obj2.instanceCounter); // 1
        System.out.println("sharedCounter: " + StaticVariableExample.sharedCounter); // 2 (모든 객체가 공유)
    }
}

인스턴스 변수 vs 클래스 변수

구분

인스턴스 변수

클래스 변수 (Static)

소유주

각 객체가 개별적으로 소유

클래스에 속함

메모리 위치

힙(Heap) 영역

메서드(Method) 영역

접근 방식

객체를 통해 접근

클래스명 또는 객체를 통해 접근 가능

초기화 시점

객체 생성 시

클래스 로딩 시

인스턴스 변수와 클래스 변수의 접근 방법

  • 인스턴스 변수

    • 객체를 생성한 후에 접근 가능합니다.

    • 인스턴스명.변수명으로 접근합니다.

  • 클래스 변수 (Static 변수)

    • 클래스명으로 직접 접근하는 것이 권장됩니다.

    • 클래스명.변수명 또는 인스턴스명.변수명으로 접근 가능합니다.

class VariableExample {
    int instanceVariable = 10; // 인스턴스 변수
    static int classVariable = 20; // Static 변수

    public static void main(String[] args) {
        VariableExample obj1 = new VariableExample();
        VariableExample obj2 = new VariableExample();

        // 인스턴스 변수는 각 객체별로 독립적
        obj1.instanceVariable = 30;
        obj2.instanceVariable = 40;

        // Static 변수는 모든 객체가 공유
        VariableExample.classVariable = 50;

        // 출력
        System.out.println("obj1.instanceVariable: " + obj1.instanceVariable); // 30
        System.out.println("obj2.instanceVariable: " + obj2.instanceVariable); // 40
        System.out.println("classVariable (obj1): " + obj1.classVariable); // 50
        System.out.println("classVariable (obj2): " + obj2.classVariable); // 50
    }
}

Static(메서드)

  1. Static 메서드란?

    • 클래스 로딩 시 함께 적재되며, 객체를 생성하지 않아도 클래스명으로 호출 가능합니다.

    • Static 메서드는 **객체의 상태(인스턴스 변수, 메서드)**에 의존하지 않고, 클래스 수준에서 동작합니다.

  2. Static 메서드의 제약

    • Static 메서드는 인스턴스 변수나 인스턴스 메서드에 직접 접근할 수 없습니다.

    • 클래스 변수(Static 변수)나 다른 Static 메서드만 사용할 수 있습니다.

  3. Static 메서드와 인스턴스 메서드의 차이

    • Static 메서드는 상태에 독립적인 작업(예: 유틸리티 메서드)에 적합합니다.

    • 인스턴스 메서드는 객체의 상태를 조작하거나 반환하는 작업에 적합합니다.

  1. Static 메서드의 사용

class StaticMethodExample {
    static int sharedCounter = 0;

    static void incrementCounter() { // Static 메서드
        sharedCounter++;
        System.out.println("Shared Counter: " + sharedCounter);
    }

    public static void main(String[] args) {
        StaticMethodExample.incrementCounter(); // 클래스명으로 호출
        StaticMethodExample.incrementCounter();
    }
}
  1. Static 메서드의 제약

class StaticRestrictionsExample {
    int instanceCounter = 0; // 인스턴스 변수
    static int sharedCounter = 0; // Static 변수

    static void staticMethod() {
        // instanceCounter++; // 컴파일 오류 (Static 메서드에서 인스턴스 변수 접근 불가)
        sharedCounter++; // Static 변수 접근 가능
        System.out.println("Static Counter: " + sharedCounter);
    }

    void instanceMethod() {
        instanceCounter++; // 인스턴스 변수 접근 가능
        sharedCounter++; // Static 변수도 접근 가능
        System.out.println("Instance Counter: " + instanceCounter);
        System.out.println("Static Counter: " + sharedCounter);
    }

    public static void main(String[] args) {
        StaticRestrictionsExample obj = new StaticRestrictionsExample();
        StaticRestrictionsExample.staticMethod(); // Static 메서드 호출
        obj.instanceMethod(); // 인스턴스 메서드 호출
    }
}
  1. Static 변수

    • 클래스 수준에서 공유되는 데이터로, 클래스명으로 접근하는 것이 권장됩니다.

    • 메서드 영역에서 관리되며, 모든 객체가 동일한 값을 참조합니다.

  2. 인스턴스 변수

    • 각 객체가 개별적으로 소유하며, 객체 생성 후에 접근 가능합니다.

  3. Static 메서드

    • 클래스명으로 호출 가능하며, 객체의 상태에 의존하지 않습니다.

    • 인스턴스 변수와 메서드에 접근할 수 없으며, 클래스 수준의 데이터(Static 변수)에만 접근 가능합니다.

Previous06 클래스 기초Next패키지 보충자료

Last updated 5 months ago