본문 바로가기
자바

객체지향 프로그래밍 정리 3. static 메소드 (클래스 메소드)

by 호놀롤루 2022. 3. 31.

1. 개요

static 메소드는 static 변수를 사용하는 메소드다. 특징으로는

  • 인스턴스의 생성과 무관하게 클래스 이름으로 호출할 수 있다. 
  • 인스턴스 생성 전에 호출할 수 없으므로 static 메소드 내부에서는 인스턴스 변수를 사용할 수 없다. (
    인스턴스 생성 전부터 사용할 수 있어야 하는데 인스턴스 변수를 사용하면 없는 변수를 사용하려는 경우가
    생기기에 막아놓은 것이다.)

2. 사용 예

public class Employee {

    private static int serialNumber = 1000;

    private int Id;
    private String name;
    private String department;

    public Employee() {
        Id = serialNumber++;
    }

    public static int getSerialNumber() {
        int i = 0;

        employeeName = "kim";

        return serialNumber;
    }

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }
}

일단 이 코드에선 에러가 발생한다.

getSerialNumber 메소드를 보면 int i = 0 이라는 코드가 포함되어 있다. 

여기까진 괜찮다. 어차피 메소드가 호출될 때, i라는 지역변수가 생성되고 그걸 사용하는 건 전혀 문제가 되지 않는다.

하지만, employeeName = "kim" 이라는 부분은 문제가 있다.

 

이 static 메소드가 사용될 때, 생성된 인스턴스가 없다면 employeeName이란 게 존재하지 않기 때문이다.

 

정리하면 getSerialNumber 메소드를 보면 지역변수, 인스턴스 변수, 스태틱 변수 3가지 변수가 있다.

지역변수와 스태틱 변수는 괜찮지만 인스턴스 변수가 들어가면 에러가 일어난다.

 

2-2. static 변수의 유효 범위와 메모리

변수의 유효 범위(scope)와 생성과 소물(life cycle)은 각 변수의 종류마다 다르다.

지역변수, 멤버 변수, 클래스 변수는 유효범위와 life cycle, 사용하는 메모리도 다르다.

변수 유형 선언 위치 사용 범위 메모리 life cycle
지역 변수
(local variable)
함수 내부에 선언 함수 내부에서만 사용 스택 함수가 호출될 때 생성되고함수가 종료되면 소멸
멤버 변수
(instance variable)
클래스 멤버 변수로 선언 클래스 내부에서 사용하고 private가 아니면 참조 변수로 다른 클래스에서 사용가능 인스턴스가 생성될 때 힙에생성되고, GC가 메모리를 수거할 때 소멸
static 변수
(class variable)
static 예약어를 사용하여 클래스 내부에 선언 클래스 내부에서 사용하고 private가 아니면 클래스 이름으로 다른 클래스에서 사용 가능 데이터 영역 프로그램이 처음 시작될 때상수와 함께 데이터 영역에생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸

그리고 추가로

  • static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은
    비효율적임
  • 클래스 내부의 여러 메소드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음
  • 멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당 되는 경우도 있음
  • 상황에 따라 적절하게 변수를 골라서 사용

이정도로 정리할 수 있다.

댓글