Notice
Recent Posts
Recent Comments
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Spring & Java

Static - 클래스가 공유하는 공간 본문

JAVA 객체지향 이해하기

Static - 클래스가 공유하는 공간

dev.hyuck 2025. 12. 9. 21:01

● 메서드 - 모듈화의 시작

● 클래스와 객체

● JVM 메모리 영역

● 래퍼클래스 (기본형 참조형)

● static - 클래스가 공유

● final - 변하지 않는 값

● 인터페이스 - 표준화의 시작

● 객체지향 PART 1 -  캡술 (접근제어자)

● 객체지향 PART 2 -  상속

● 객체지향 PART 3 - 추상화

● 객체지향 PART 4 - 다형성

 

Static - 클래스가 공유하는 공간

 

학습 키워드 점검

Static 키워드

인스턴스 멤버 ( 인스턴스 변수, 인스턴스 메서드 )

클래스 멤버 (클래스 변수, 클래스 메서드 )

 

Static 이란?

● static 키워드는 모든 객체가 함께 사용하는 변수나 메서드를 만들때 사용됩니다.

● 객체(인스턴스) 를 만들지 않아도 클래스 이름만으로 바로 사용할 수 있습니다.

● 모든 객체가 같은 값을 공유합니다.

ㅡ> 공용 게시판이라고 생각하시면 이해하기 쉽습니다.

● static 변수와 메서드는 한 번만 생성되고 Method Area(메서드영역)에 저장됩니다.

 

Static 활용

static 키워드를 활용해 봅시다.

● static 키워드는 변수, 메서드에 붙일 수 있습니다.

● static 키워드로 선언된 변수와 메서드는 MethodArea에 저장됩니다.

● 각 객체(인스턴스)는 클래스영역에 저장된 데이터를 활용할 수 있습니다.

class Person {
		// ✅ static 변수
		static int population = 0; 
		
		// ✅ static 메서드
		static void printPopulation() { 
				System.out.println("현재 인구 수: " + population);
		}
}

System.out.println("static 변수: " + Person.population);
System.out.println("static 메서드: " + Person.printPopulation);

 

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

인스턴스 멤버란?

● 객체를 만들때 마다 생성되는 변수 와 메서드 입니다.

● 객체(인스턴스)를 생성한 후에만 사용할 수 있습니다.

● 각 객체가 개별적으로 값을 가집니다. (공유되지 않음)

● 인스턴스는 Heap 영역에 위치합니다.

 

인스턴스 변수란

인스턴스 변수를 알아봅시다.

● 객체가 생성될 때마다 따로 만들어지는 변수입니다.

● 객체를 생성한 후 접근할 수 있습니다.

● 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 객체의 데이터에 접근
    }
}

 

인스턴스 메서드란?

인스턴스 메서드를 알아 봅시다.

● 객체의 속성을 활용하는 메서드입니다.

● 객체가 생성된 후에만 사용할 수 있습니다.

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 객체의 메서드 실행
    }
}

 

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

● 클래스 자체에 속하는 변수와 메서드를 의미합니다.

● static 키워드를 사용해서 선언합니다.

● 해당 클래스로 만들어진 객체가 공유해서 사용할 수 있습니다.

● 클래스가 로드될때 Method Area에 적재됩니다.

● 객체 생성 없이 사용 가능합니다.

 

클래스 변수란?

클래스 변수를 알아봅시다.

● 클래스가 로드될 때 한 번만 생성됩니다.

● 모든 객체가 공유하는 변수입니다.

● 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);
    }
}

 


클래스 메서드란?

클래스 메더르르 알아봅시다.

● 클래스에 속하는 메서드입니다.

●객체 없이 사용할 수 있습니다.

● 클래스 변수만 사용할 수 있고 인스턴스 변수는 사용할 수 없습니다.

class Person {
		static int population = 0;
		
		public Person(String name) {
				this.name = name;
				population++; // 생성자 호출시 populataion 1 증가
		}
		
		static void printPopulation() {
				System.out.println("현재 인구 수: " + population); // ✅ 클래스 메서드
		}
}

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
    }
}

 

전체 코드 살펴보기

전체 코드와 그림으로 알아봅시다.

● static으로 선언된 변수와 메서드는 객체에서 공용으로 사용가능합니다.

public class Person {
    static int population = 0; // 클래스 변수 (모든 객체가 공유)
    String name; // 인스턴스 변수

    public Person(String name) {
        this.name = name;
        population++; // 생성자 호출시 populataion 1 증가
    }

    public void printName() {
        System.out.println("이름: " + name);
    }

    public static void printPopulation() { // 클래스 메서드
        System.out.println("현재 인구 수: " + population);
    }

}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("gygim");
        Person p2 = new Person("Steve");

        p1.printName();  // 인스턴스메서드는 객체 인스턴스화 이후에 호출 가능
        p2.printName();

        // 클래스 메서드는 클래스 이름으로 호출 가능
        Person.printPopulation();  // "현재 인구 수: 2"
    }
}

 


Static 사용시 주의사항

클래스 변수 사용시 주의 사항

<!> Static은 공유가 필요한 곳에 사용해야합니다.

public class Student {
    static String name; // ⚠️ 모든 객체가 동일한 name을 공유 (위험)

    public Student(String name) {
        this.name = name;
    }

    public void printName() {
        System.out.println("이름: " + name);
    }


}

public class Main {

    public static void main(String[] args) {
        Student s1 = new Student("gygim");
        Student s2 = new Student("Steve");

        s1.printName();  // ⚠️ "이름: Steve"
        s2.printName();  // ⚠️ "이름: Steve"
    }
}


Static 메서드에서 인스턴스 변수에 접근

< ! > Static 메서드 에서는 인스턴스변수에 접근할 수 없습니다.

● 인스턴스 멤버를 사용하기 위해서는 먼저 객체가 생성되어야 합니다.

● 객체 생성없이 사용할 수 없습니다. 접근도 당연히 안됩니다.

public class Person {
    String name;

    public static void staticMethod() {
        System.out.println(this.name);  // ⚠️ 오류 발생
    }
}

public class Example {
    int instanceVar = 10;

    public static void main(String[] args) {
        Example ex = new Example();
        System.out.println(ex.instanceVar);  // ✅ 정상 출력
    }
}

 

Static은 꼭 필요할 때만 사용해야 합니다.

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

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

'JAVA 객체지향 이해하기' 카테고리의 다른 글

인터페이스 - 표준화의 시작  (0) 2025.12.10
final - 변하지 않는 값  (0) 2025.12.10
JAVA 계산기 과제 (1차)  (0) 2025.12.09
래퍼클래스 (기본형 참조형)  (0) 2025.12.08
JVM 메모리 영역  (0) 2025.12.08