[Java] Chpater 2- 04) static - 클래스가 공유하는 공간

2025. 2. 25. 17:16·코딩 공부/Java

    1️⃣ Static

    1. Static 이란?

    • static 키워드는 모든 객체가 함께 사용하는 변수나 메서드를 만들때 사용된다.
    • 객체(인스턴스)를 만들지 않아도 클래스 이름만으로 바로 사용할 수 있다.
    • 모든 객체가 같은 값을 공유한다. → 공용 게시판이라고 생각하면 된다.
    • static 변수와 메서드는 한 번만 생성되고 Method Area(메서드영역) 에 저장된다.

    2. Static 활용

    • static 키워드는 변수, 메서드에 붙일 수 있습니다.
    • static 키워드로 선언된 변수와 메서드는 MethodArea 에 저장됩니다.
    • 각 객체(인스턴스)는 클래스영역에 저장된 데이터를 활용할 수 있습니다.
    // People Class
    class Person {
            // ✅ static 변수
            static int population = 0; 
    
            // ✅ static 메서드
            static void printPopulation() { 
                    System.out.println("현재 인구 수: " + population);
            }
    }
    
    // Main Class
    System.out.println("static 변수: " + Person.population);
    System.out.println("static 메서드: " + Person.printPopulation);

    - People class 의 값이 Main 에서도 호출될 수 있다는 것!

    2️⃣ 인스턴스 멤버(인스턴스 변수 + 인스턴스 메서드)

    • 객체를 만들때 마다 생성되는 변수와 메서드 입니다.
    • 객체(인스턴스)를 생성한 후에만 사용할 수 있습니다.
    • 각 객체가 개별적으로 값을 가집니다. (공유되지 않음)
    • 인스턴스는 Heap 영역에 위치합니다.

    1. 인스턴스 변수

    • 객체가 생성될 때마다 따로 만들어지는 변수입니다.
    • 객체를 생성한 후 접근할 수 있다.
    • name 변수는 각 객체마다 별도로 저장된다.
    class Person {
            String name; // ✅ 인스턴스 변수
    }
    public class Main {
        public static void main(String[] args) {
    
            Person p1 = new Person(); // p1 객체 생성
            p1.name = "gygim"; // ✅ p1 객체의 데이터에 접근
    
            Person p2 = new Person(); // p2 객체 생성
            p2.name = "Steve"; // ✅ p2 객체의 데이터에 접근
        }
    }
    • name 이라는 변수가 p1 과 p2 에 별도로 저장되는 걸 볼 수 있다.

    2. 인스턴스 메서드

    • 객체의 속성을 활용하는 메서드이다.
    • 객체가 생성된 후에만 사용할 수 있다.
    class Person {
            String name;
    
            void printName() { // ✅ 인스턴스 메서드
                    System.out.println("나의 이름은 " + this.name + "입니다.");
            }
    }
    public class Main {
        public static void main(String[] args) {
    
            Person p1 = new Person(); 
            p1.name = "gygim";
            p1.printName(); // ✅ p1 객체의 메서드 실행
    
            Person p2 = new Person();
            p2.name = "Steve";
            p2.printName(); // ✅ p2 객체의 메서드 실행
        }
    }

    3️⃣ 클래스 멤버(클래스 변수 + 클래스 메서드)

    • 클래스 자체에 속하는 변수와 메서드를 의미한다.
    • static 키워드를 사용해서 선언한다.
    • 해당 클래스로 만들어진 객체가 공유해서 사용할 수 있다.
    • 클래스가 로드될때 Method Area 에 적재된다.
    • 객체 생성 없이 사용 가능하다.

    1. 클래스 변수

    • 클래스가 로드될 때 한 번만 생성됩니다.
    • 모든 객체가 공유하는 변수입니다.
    • Heap 이 아니라 Method Area 에 저장됩니다.
    • 객체를 만들지 않아도 클래스명.변수명으로 접근가능합니다.
    class Person {
            static int population = 0; // ✅ 클래스 변수
    }
    public class Main {
        public static void main(String[] args) {
    
            // ✅ 객체 생성 전에도 클래스 레벨에서 직접 접근가능
            System.out.println("현재 인구 수: " + Person.population);
    
            Person p1 = new Person();
            Person p2 = new Person();
    
            // ✅ 모든 객체가 하나의 값을 공유
            System.out.println("현재 인구 수: " + Person.population);
        }
    }
    • 코드를 보다시피, 객체 생성을 하지않아도 Person.population에 접근할 수 있다.

    2. 클래스 메서드

    • 클래스에 속하는 메서드이다.
    • 객체 없이 사용할 수 있다.
    • 클래스 변수만 사용할 수 있고 인스턴스 변수는 사용할 수 없다.
    class Person {
            static int population = 0;
    
            public Person(String name) {
                    this.name = name;
                    population++; // 생성자 호출시 populataion 1 증가
            }
    
            static void printPopulation() {
                    System.out.println("현재 인구 수: " + population); // ✅ 클래스 메서드, static으로 선언된 변수 용
            }
    }
    public class Main {
        public static void main(String[] args) {
    
                // ✅ 객체생성 여부에 상관없이 사용 가능
            Person.printPopulation(); // 현재 인구 수: 0
    
            Person p1 = new Person("gygim"); // 생성시마다 population 1 증가
            Person p2 = new Person("Steve"); // 생성시마다 population 1 증가
    
            Person.printPopulation(); // 현재 인구 수: 2
        }
    }

    4️⃣ Static 사용시 주의사항

    • static 은 공유가 필요한 곳에 사용해야한다.

    - Static 메서드에서는 인스턴스변수에 접근할 수 없다.

    • 인스턴스 멤버를 사용하기 위해서는 먼저 객체가 생성되어야 한다.
    • 객체 생성없이 사용할 수 없다는 것이다 따라서, 접근도 당연히 안된다.

    - static 변수와 메모리는 프로그램이 종료될 때까지 메모리에 유지됩니다.

    • 너무 많은 static 남용하면 메모리 낭비로 이어집니다.

    '코딩 공부 > Java' 카테고리의 다른 글

    [Java] Chpater 2- 06) 인터페이스 - 표준화의 시작  (0) 2025.02.25
    [Java] Chpater 2- 05) final - 변하지 않는 값  (0) 2025.02.25
    [Java] Chpater 2- 03) 레퍼클래스 (기본형 참조형)  (0) 2025.02.25
    [Java] Chpater 2- 02) JVM 메모리 영역  (0) 2025.02.25
    [Java] Chpater 2- 01) 클래스와 객체  (1) 2025.02.25
    '코딩 공부/Java' 카테고리의 다른 글
    • [Java] Chpater 2- 06) 인터페이스 - 표준화의 시작
    • [Java] Chpater 2- 05) final - 변하지 않는 값
    • [Java] Chpater 2- 03) 레퍼클래스 (기본형 참조형)
    • [Java] Chpater 2- 02) JVM 메모리 영역
    sintory-04
    sintory-04
    🚀🚀🚀
    • sintory-04
      Sintory Dev Blog
      sintory-04
      글쓰기 관리
    • 전체
      오늘
      어제
      • 분류 전체보기 (289)
        • 백엔드 부트캠프 (111)
          • TIL (97)
          • WIL (0)
          • 문제풀이 (7)
          • 기타 (6)
        • 백엔드 부트캠프[사전캠프] (35)
          • TIL (16)
          • 문제풀이 (17)
          • 기타 (1)
        • Troubleshooting (11)
        • 코딩 공부 (118)
          • Java (28)
          • Baekjoon-Java (24)
          • Programmers-Java (40)
          • Spirngboot (11)
          • typescript (1)
          • JavaScript (6)
          • Spring 입문 (8)
        • 프로젝트 (8)
          • ToDoApp(FireBase) (3)
          • ToDoApp(Spring) (5)
        • 기타 (4)
    • 블로그 메뉴

      • 소개
      • Github
    • 최근 글

    • 최근 댓글

    • hELLO· Designed By정상우.v4.10.3
    sintory-04
    [Java] Chpater 2- 04) static - 클래스가 공유하는 공간
    상단으로

    티스토리툴바