///////
Search

17_클래스변수와메소드_조문주

인스턴스 변수 앞에 static이 붙은 변수
static 변수 = 클래스 변수 = 공용 변수 = 정적변수
모든 인스턴스에 공통적으로 사용되는 클래스 변수
클래스 변수는 인스턴스를 생성하지 않고도 사용 가능
인스턴스를 생성하지 않고도 static 자원에 접근 가능
메모리에 고정적으로 할당되어 프로그램이 종료될 때 해제됨

static 변수의 클래스 접근

1.
클래스 내부 접근
static 변수가 선언된 클래스 내에서는 이름만으로 직접 접근 가능
2.
클래스 외부 접근
private으로 선언되지 않으면 외부에서도 접근 가능
접근 수준 지시자가 허용하는 범위에서 접근 가능
클래스 또는 인스턴스의 이름을 통해 접근

예시

class InstCnt { static int instNum = 0; // static 변수 (cv) InstCnt() { instNum++; System.out.println("인스턴스 생성: " + instNum); } } class ClassVar { public static void main(String[] args) { InstCnt cnt1 = new InstCnt(); InstCnt cnt2 = new InstCnt(); InstCnt cnt3 = new InstCnt(); } }
Java
복사

Static 메서드

인스턴스를 생성하지 않고도 호출이 가능
static 메서드 내에서는 인스턴스 변수를 사용할 수 없음

예시

class StaticTest { static int cv; // 클래스 변수 int iv = 0; // 인스턴스 변수 // static 메서드 static int max(int num) { iv += num; // 에러. static 메서드 내에서는 인스턴스 변수 사용 불가 } }
Java
복사
객체가 생성되지 않아도 사용할 수 있는 static 메서드와 달리 iv 변수는 객체가 생성되기 전에는 메모리에 존재하지 않기 때문에 에러 발생

Static 변수 & Static 메서드의 메모리 저장 영역

static으로 생성된 멤버들은 static영역에 할당된다 모든 객체가 메모리를 공유할 수 있다는 장점이 있지만 garbage collector의 관여가 없어 프로그램이 종료될 때까지 메모리에 값이 유지되기 때문에 너무 많이 사용한다면 프로그램이 무거워진다는 단점도 있다
Plain Text
복사

public static void main(String[] args) { }

public : 모든 클래스가 접근할 수 있게 하는 접근 제어자
static : 인스턴스 생성과 관계 없이 가장 먼저 호출되도록 함
프로그램이 실행되면 main 메서드가 제일 먼저 호출되기 때문에 객체 없이 바로 작업을 수행할 수 있도록 static 사용
void : 메인 메서드에서 호출하는 JVM에서 리턴 값을 요구하지 않기 때문에 사용
String[] args : 프로그램 실행시 매개변수를 보내서 실행할 수 있다는 뜻
한개를 사용할 수도 있고 여러 개를 사용할 수도 있기 때문에 배열을 사용

Static 변수

인스턴스 변수 앞에 static이 붙은 변수
static 변수 = 클래스 변수 = 공용 변수 = 정적변수
모든 인스턴스에 공통적으로 사용되는 클래스 변수
클래스 변수는 인스턴스를 생성하지 않고도 사용 가능
인스턴스를 생성하지 않고도 static 자원에 접근 가능
메모리에 고정적으로 할당되어 프로그램이 종료될 때 해제됨

static 변수의 클래스 접근

1.
클래스 내부 접근
static 변수가 선언된 클래스 내에서는 이름만으로 직접 접근 가능
2.
클래스 외부 접근
private으로 선언되지 않으면 외부에서도 접근 가능
접근 수준 지시자가 허용하는 범위에서 접근 가능
클래스 또는 인스턴스의 이름을 통해 접근

예시

class InstCnt { static int instNum = 0; // static 변수 (cv) InstCnt() { instNum++; System.out.println("인스턴스 생성: " + instNum); } } class ClassVar { public static void main(String[] args) { InstCnt cnt1 = new InstCnt(); InstCnt cnt2 = new InstCnt(); InstCnt cnt3 = new InstCnt(); } }
Java
복사

Static 메서드

인스턴스를 생성하지 않고도 호출이 가능
static 메서드 내에서는 인스턴스 변수를 사용할 수 없음

예시

class StaticTest { static int cv; // 클래스 변수 int iv = 0; // 인스턴스 변수 // static 메서드 static int max(int num) { iv += num; // 에러. static 메서드 내에서는 인스턴스 변수 사용 불가 } }
Java
복사
객체가 생성되지 않아도 사용할 수 있는 static 메서드와 달리 iv 변수는 객체가 생성되기 전에는 메모리에 존재하지 않기 때문에 에러 발생

Static 변수 & Static 메서드의 메모리 저장 영역

static으로 생성된 멤버들은 static영역에 할당된다 모든 객체가 메모리를 공유할 수 있다는 장점이 있지만 garbage collector의 관여가 없어 프로그램이 종료될 때까지 메모리에 값이 유지되기 때문에 너무 많이 사용한다면 프로그램이 무거워진다는 단점도 있다
Plain Text
복사

public static void main(String[] args) { }

public : 모든 클래스가 접근할 수 있게 하는 접근 제어자
static : 인스턴스 생성과 관계 없이 가장 먼저 호출되도록 함
프로그램이 실행되면 main 메서드가 제일 먼저 호출되기 때문에 객체 없이 바로 작업을 수행할 수 있도록 static 사용
void : 메인 메서드에서 호출하는 JVM에서 리턴 값을 요구하지 않기 때문에 사용
String[] args : 프로그램 실행시 매개변수를 보내서 실행할 수 있다는 뜻
한개를 사용할 수도 있고 여러 개를 사용할 수도 있기 때문에 배열을 사용