static 무엇인가?

Java에서 Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미합니다.
이를 정확히 이해하기 위해서는 메모리 영역에 대한 이해가 필요합니다.

  • 일반적으로 우리가 만든 Class는 Static 영역에 생성되고, new 연산을 통해 생성한 객체는 Heap영역에 생성됩니다.
  • 객체의 생성시에 할당된 Heap영역의 메모리는 Garbage Collector를 통해 수시로 관리를 받습니다.
  • 하지만 Static 키워드를 통해 Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만,
  • Garbage Collector의 관리 영역 밖에 존재하므로 Static을 자주 사용하면 프로그램의 종료시까지 메모리가 할당된 채로 존재하므로 자주 사용하게 되면 시스템의 퍼포먼스에 악영향을 주게 됩니다.
  • 정적 멤버 (정적필드 - Static변수 / 정적메소드 - Static메소드 / 정적클래스 - Static 클래스)

정적(Static) 필드 사용 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Number{
static int num = 0; //클래스 필드
int num2 = 0; //인스턴스 필드
}

public class Static_ex {

public static void main(String[] args) {
Number number1 = new Number(); //첫번째 number
Number number2 = new Number(); //두번쨰 number

number1.num++; //클래스 필드 num을 1증가시킴
number1.num2++; //인스턴스 필드 num을 1증가시킴
System.out.println(number2.num); //두번째 number의 클래스 필드 출력 1
System.out.println(number2.num2); //두번째 number의 인스턴스 필드 출력 0
}
}

정적(Static) 메서드 사용 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Name{
static void print() { //클래스 메소드
System.out.println("내 이름은 홍길동입니다.");
}

void print2() { //인스턴스 메소드
System.out.println("내 이름은 이순신입니다.");
}
}

public class Static_ex {

public static void main(String[] args) {
Name.print(); //인스턴스를 생성하지 않아도 호출이 가능

Name name = new Name(); //인스턴스 생성
name.print2(); //인스턴스를 생성하여야만 호출이 가능
}
}

static변수 :

static변수는 클래스변수가 된다(클래스의 모든 객체가 공유할 수 있게됨 : 일반적인 멤버변수는 하나의 객체 내에서만 전역 변수처럼 사용됨)
static변수는 클래스 객체의 생성 없이도 호출하여 사용할 수 있음 :

static 메소드:

  • static메소드는 클래스메소드가 된다. 어느 객체의 내용에도 의존적이지 않은 하나의 작업을 수행하기 때문
  • (일반적으로 main메소드가 static으로 선언됨 : public static void main(String[] args){} )
  • static메소드가 포함 된 클래스를 부모로 상속받은 자식클래스는, 해당 static메소드(부모클래스의 메소드)를 오버라이딩을 통해 재정의 할 수 없음(final메소드와 비슷하지만, static메소드는 메소드 숨김이 일어난다).
  • static메소드는 클래스메소드답게, 객체의 레퍼런스를 통한 call이 아닌 클래스의 이름으로 메소드를 호출할 수 있음 (static변수와 유사)

static 클래스:

상속 불가 클래스를 의미.

cf) final ??

  • final은 상속불가 또는 불변의 상수 선언에 사용됨

final 변수 :

  • final로 선언된 변수는, 값의 초기화만 가능하고 그 값의 변경 및 새로운 할당이 불가능한 상수가 됨(반드시 초기화 해 주어야함).
  • 일반적으로 final이 붙은 상수 변수는 static을 함게 붙여서 사용함.
  • final 상수로 선언된 변수에 값을 넣어주면 error가 발생함.

final 메소드:

  • final메소드가 포함 된 클래스를 부모로 상속받은 자식클래스는, 해당 final메소드(부모클래스의 메소드)를 오버라이딩을 통해 재정의 할 수 없음(메소드가 불변성을 띄게 됨).

final 클래스:

  • 상속 불가 클래스를 의미.
  • 클래스에 붙는 예약어로 final과 abstract은 함께 사용할 수 없음
  • (abstract클래스 : abstract 메소드가 1개 이상인 클래스) : abstract는 추상클래스를 생성할 때 사용하므로 상속이 강제적이므로 상속 불가를 나타내는 final과는 쓸 수 없음.

참고자료1
참고자료2