Java

[ java ] static 변수와 static 메서드 연습하기/클래스 메서드/클래스 변수

JooKit 주킷 2020. 12. 17. 22:19
목차 접기
728x90
반응형

클래스 변수

  • 앞서 이야기한 것처럼 static 변수는 인스턴스를 생성할 때마다 만들어지는 것이 아니고 클래스를 선언할 때 특정 메모리에 저장되어
    모든 인스턴스가 공유하는 변수이다.

  • static 변수는 인스턴스 생성과는 별개이므로 인스턴스보다 먼저 생성된다.

    그러므로 인스턴스가 아닌 클래스 이름으로도 참조하여
    사용할 수 있다.
    

예시) 클래스이름.static 변수명

  • static 변수를 인스턴스 참조 변수로 사용한다면 아래쪽에 노란색 줄이 보인다.
  • 이것은 오류가 아니고 이 변수가 static 변수이므로 인스턴스 참조 변수가 아닌 클래스 이름으로 직접 참조하라는 뜻이다.
  • 이클립스에서 static 변수와 static 메서드는 이탤릭체로 나타난다.

static 변수 공통된 이름 3가지

  • static 변수
  • 정적 변수
  • 클래스 변수

자바에서 static 변수를 클래스 변수라고 하는 이유

  • 인스턴스마다 생성되는 변수가 아니라 클래스에 속해 한 번만 생성되는 변수이고 이를 여러 인스턴스가 공유하기 때문이다.

클래스 메서드

  • 일반 멤버 변수를 위한 메서드가 존재하듯이 static 변수를 위한 메서드도 존재한다.
  • 이런 메서드를 static 메서드 또는 클래스 메서드(class method)라고 한다.
  • static 메서드 또한 static 변수처럼 인스턴스 참조 변수가 아닌 클래스 이름으로 직접 호출할 수 있다.
  • 클래스 메서드 내부에서는 인스턴스 변수를 사용할 수 없다.

지역 변수

  • 메서드 내부에서 선언한 변수를 그 지역에서만 사용한다고 해서 지역 변수(local variable)라고 한다.
  • 지역 변수는 메서드가 호출될 때 메모리에 생성되어 메서드가 끝나면 사라지는 변수이다.
  • (위와 같은 말 : studentName처럼 인스턴스가 생성되어야 메모리에 할당되는 인스턴스 변수는 클래스 메서드에서 사용할 수 없다.)

클래스 메서드 안에서 멤머 변수를 선언하면 오류 발생

  • 클래스의 멤버 변수는 인스턴스가 생성될 때 만들어지는 인스턴스 변수이기 때문에
  • 인스턴스 생성과 상관없는 static 메서드(클래스 메서드) 안에서는 사용할 수 없다.

클래스 메서드 정리하기

  • 클래스 메서드 내부에서 지역 변수와 클래스 변수는 사용할 수 있지만, 인스턴스 변수는 사용할 수 없다.
  • 또한 클래스 메서드에서 인스턴스 변수를 사용할 수는 없지만 반대로 일반 메서드에서 클래스 변수를 사용하는 것은 전혀 문제가 되지 않는다.
  • 왜냐하면 일반 메서드는 인스턴스가 생성될 때 호출되는 메서드이고, 클래스 변수는 이미 만들어진 변수이기 때문에
    일반 메서드에서도 클래스 변수를 호출할 수 있기 때문이다.

package algo2;

public class Student3 {


private int studentCardNum;
private int studentID;
private String name;
private static int serialNum = 0;

public Student3() {
    serialNum++;
    studentID = serialNum;
    studentCardNum = studentID + 100;
}

public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public static int getSerialNum() {
    return serialNum;
}

public static void setSerialNum(int serialNum) {
    Student3.serialNum = serialNum;
}

public int getStudentID() {
    return studentID;
}

public int getStudentCardNum() {
    return studentCardNum;
}

}
package algo2;

public class Main {


public static void main(String[] args) {

    Student3 studentA = new Student3();

    studentA.setName("홍길동");
    System.out.println("serialNum : " + Student3.getSerialNum());
    System.out.println(studentA.getName() + "의 학번은 " + studentA.getStudentID() + "이고, 카드번호는 "
            + studentA.getStudentCardNum() + " 입니다.");

    Student3 studentB = new Student3();

    studentB.setName("개똥이");
    System.out.println("serialNum : " + Student3.getSerialNum());
    System.out.println(studentB.getName() + "의 학번은 " + studentB.getStudentID() + "이고, 카드번호는 "
            + studentB.getStudentCardNum() + " 입니다.");


    Student3 studentC = new Student3();

    studentC.setName("임꺽정");
    System.out.println("serialNum : " + Student3.getSerialNum());
    System.out.println(studentC.getName() + "의 학번은 " + studentC.getStudentID() + "이고, 카드번호는 "
            + studentC.getStudentCardNum() + " 입니다.");



}


}

static 메서드 내부에서는 멤버 변수를 사용할 수 없지만, 일반 메서드 내부에서는 static 변수를 사용할 수 있다.

728x90
반응형
LIST