본문 바로가기
Programming/Java * Spring

[Java] 05. static 멤버의 접근 방법과 활용

by 고막고막 2019. 3. 20.

static 멤버의 접근 방법

1) 클래스 내부에서 자유롭게 접근

2) 클래스 이름으로 접근

3) 객체 이름으로 접근

class AccessWay{
	static int num=0;
	AccessWay(){
		incrCnt();
	}
	public void incrCnt() {
		num++;
	}
}
public class ClassVarAccess {
	public static void main(String[] args) {
		AccessWay way = new AccessWay();
      	// 생성자 안에 있는 매서드가 호출됨(num+1)
		AccessWay.num++;
      	// 클래스명으로 접근(num+1)
		way.num++;
      	// 객체로 접근(num+1)
		System.out.println("num = "+AccessWay.num);
	}
}

위의 세가지 방법이 있지만 객체 이름 방식보다는 클래스 이름으로 접근하는 방식을 선호한다.

왜냐? static은 객체별로 생성되는 변수가 아니고 클래스에 유일하게 공유할 수 있는 변수이므로 클래스 소속으로 호출하는 것이 더 명확하다.


언제 static으로 만들어야할까?

1) 모든 객체가 동일한 정보를 공유해야할때

2) 클래스에서 바로 호출해야할 필요성이 있을때

3) 범용적인 멤버일 경우

class StudyClass {
	static int schoolNum = 0; 
	// 학교 전체 학생수 -> 클래스에 1개만 존재하고 공유되는 정보이므로 static
	int cNum = 0; 
	// 해당 반 학생수 -> 반마다 다른 수가 입력되므로 instance
	String className; 
	// 해당 반 이름 -> 반마다 다른 이름이 입력되므로 instance

	StudyClass(int num, String cName) {
		className = cName;
		cNum = num;
		schoolNum += num;
	}

	void showStudyClassInfo() {
		System.out.println(className + " : " + cNum + "명");
	}

	static void showSchoolInfo() {
		System.out.println("학생수: " + schoolNum);
	}
}

public class School {
	public static void main(String[] args) {
		StudyClass sc1 = new StudyClass(15, "1반");
		StudyClass sc2 = new StudyClass(20, "2반");
		StudyClass sc3 = new StudyClass(24, "3반");
		sc1.showStudyClassInfo();
		sc2.showStudyClassInfo();
		sc3.showStudyClassInfo();
	}

 static 멤버

  instance 멤버

  • 객체를 만들지 않아도 처음부터 메모리에 로딩
  • 프로그램 종료시까지 계속 메모리에 존재하므로 메모리의 낭비가 발생
  • 모든 객체가 동일한 데이터를 유지해야 할 때 사용
  • 최초의 객체생성 시 메모리에 로딩, 이후의 객체들은 재사용
  • 나중에 객체가 소멸되면 인스턴트 변수도 소멸되기 때문에 중복되는 메모리가 없다
  • 객체별로 데이터를 다르게 유지하고 싶을 때 사용