[Java] 클래스와 객체 - static 변수, 메서드

나영원·2020년 8월 27일
0

Java_basic

목록 보기
31/60

static 변수

클래스 하나에서 생성되는 여러개의 인스턴스가 하나의 값을 공유할 필요가 있을 때 사용하는 변수로 하나의 변수
인스턴스가 힙메모리에 생성되는 것과는 다르게 다음 그림과 같이 데이터 영역 메모리에 생성되며 인스턴스의 생성과 상관없이 사용할 수 있습니다.

클래스 이름으로 참조되며 Student 클래스에 serialNum이라는 스태틱 변수를 참조한다면 Student.serialNum으로 사용할 수 있습니다.

예제, Student클래스에 학생 인스턴스가 새로 생성될 때 마다 Student ID를 부여하시오

public class Student {
	//1번
	private static int serialNum = 1000;
	private int studentID;
	public String studentName;
	//2번
	public Student(String name) {
		
		studentName = name;
		serialNum++;
           studentID = serialNum;
	}
    //3번
    public int getStudentID() {
	    		    	
	   	return studentID;
    }    
    public static int getSerialNum() {
		
		return serialNum;
	}
 
    }
  • 1번 : 인스턴스가 생성될 때 마다 Student ID를 부여하기 위해서는 기준점이 되는 하나의 값이 필요한데 그것을 static변수로 선언하기 위해 serialNum 변수를 선언하고 초기값을 1000 대입합니다.
  • 2번 : 인스턴스가 생성될 때마다 serialNum이 1씩증가해야 하기 때문에 2개의 Student생성자에 serialNum++을 해줍니다. 그리고 증가된 serailNum을 생성된 인스턴스의 StudentID 값의 대입해줍니다.
  • 3번 : prviate으로 선언한 studentID와 serialNum을 읽기위한 get메서드를 각각 작성해주되 SerailNum은 static변수이니 static 메서드로 작성합니다.
public class StudentIdTest {

	public static void main(String[] args) {
		//1번
		Student studentLee = new Student("Lee");
		System.out.println(Student.getSerialNum());//1001
		Student studentSon = new Student("Son");
		System.out.println(Student.getSerialNum());//1002
		//2번
		System.out.println(studentSon.getStudentID());//1002
		System.out.println(studentLee.getStudentID());//1001
		
	}
  • 1번 : 테스트 하기 위해 Student 인스턴스를 2개만들고 static 변수인 serialNum을 출력하기 위해 클래스명.메서드를 사용하여 출력하였더니 인스턴스가 생성될 때 마다 serailNum이 증가하는 것을 확인 할 수 있었습니다.
  • 2번: studentId를 출력해 보았더니 인스턴스가 생성될때마다 증가된 seriaNum이 잘 대입된 것을 확인할 수 있습니다.

예제의 static변수인 serialNum과 참조변수, 각 인스턴스의 관계는 위의 그림과 같습니다. 그리고 증가된 serailNum이 대입되는 studentID변수는 각각의 인스턴스에 담기게 됩니다.

static 메서드

static 변수를 위한 기능을 제공하는 메서드로 static메서드와 마찬가지로 클래스명.으로 참조해서 사용합니다.

	public static int getSerialNum() {
		int i = 0; // 지역변수는 사용가능
		studentName = "Lee"; //에러 - 멤버변수는 사용불가
		return serialNum;
	}

위의 예제와 같이 static 메서드안에서 int i =0과 같은 지역변수는 함수안에서만 사용하고 소멸되는 변수이기에 사용가능합니다. 하지만 studentName같은 멤버변수는 사용할 수 없는데 그 이유는 static메서드는 인스턴스의 생성여부와 상관없이 사용할수 있는 메서드이지만 멤버변수는 인스턴스의 생성이 필수이기 때문입니다. static메서드를 사용하는 순간에 인스턴스가 없다면 오류가 날수 밖에 없는 변수이기 때문에 사용이 불가능합니다.

프로그램에서 변수의 유형

변수유형 별로 어디에서 어떤 변수를 사용해야 하는지를 배워야 메모리 사용을 최적화 하고 에러를 줄이는 프로그래밍을 할 수 있기에 잘 이해해야 합니다.

profile
배우는 개발 일기

0개의 댓글