스태틱 (static) 정적변수, 정적메서드 ,final
static (값이 변하지 않는)
객체를 생성하지 않아도 접근할 수 있는 요소에 static을 붙힌다.
ex) 책 : 사각형 (고정) , 사람 : (고정)
객체를 지정하지않아도 고정되어있는 값에 static을 붙힐 수 있다.
ex)
신용카드의 모양 (고정) (static)
신용카드의 표지, 신용카드 번호 (변할 수 있는 값 : non-static)
닭이먼저냐 달걀이 먼저냐

static에 달려있는 필드나 메서드는 일반적인 필드나 메서드보다 먼저생성된다.
static필드,메서드가 먼저 만들어지고 그 이후에 non- static 필드,메서드 가 만들어진다.
main이 실행되야 그 안에서 변수를 생성하든 반복문을 생성하든 변수를 참조하든 해야한다.
하지만 main함수는 non-static이기때문에 void main앞에 필수로 static이 붙을 수 밖에 없다.

정적(static) 변수: 클래스에 속한 변수를 정의할 때 사용된다. 정적 변수는 해당 클래스의 모든 객체들이 공유하는 변수로, 한 번 생성되면 객체의 개수와 상관없이 메모리에 유지된다.
static은 클래스로도 접근이 가능하고 객체로도 접근이 가능하지만
스태틱은 스태틱 요소로 접근해야한다.
n1은 아직 객체가 생성되지 않았기 때문에 참조될 수 없다.
n2는 스태틱 필드이기때문에 객체가 없어도 참조가 가능하다.
에러메시지 : Cannot make a static reference to the non-static field Test1.n1

에러는 아니지만 static 요소는 가급적이면 static으로 접근해야한다는 메세지다.
The static field Test1.n2 should be accessed in a static way

정적(static) 메서드: 클래스에 속한 메서드를 정의할 때 사용된다.
정적 메서드는 인스턴스 변수에 접근하지 않고도 호출할 수 있는 메서드로,
클래스의 인스턴스를 생성하지 않고도 클래스 이름을 통해 호출할 수 있다
static n1은 non-static필드다. non-static필드는 스태틱 함수를 참조할 수 없다.
에러메시지 : Cannot make a static reference to the non-static field n1


static 은 클래스에 소속되어 있는 필드 및 메서드
클래스가 객체보다 먼저 메모리에 로드된다.
클래스가 로드되는 시점에서 static 요소는 생성되어 있다.
클래스만 로드된 시점에서 아직 객체는 생성되지 않았다.
따라서 static요소는 non-static요소를 정상적으로 참조할 수 있다는 보장이 없다.

count가 static이기때문에 class에 속해있기때문에
ob1(이지은)이 입장하든 ob2(홍진호)가 입장하든 count는 늘어나게된다.



final : 변경할 수 없다. 마지막 값이다
지역변수, 멤버필드,클래스,메서드의 데이터를 고정 시킨다.
지역변수에 사용가능 . 처음 설정한 값을 이후 변경할 수 없다
멤버필드에 사용가능, 처음 설정한 값을 이후 변경할 수 없다
메서드에 사용가능 , 함수의 내용을 변경할 수 없다 (오버라이딩불가)
클래스에 사용가능, 클래스의 구성을 변경할 수 없다(상속 불가)

에러메세지: n2의 값을 변경할 수 없습니다.
The final local variable n2 cannot be assigned. It must be blank and not using a compound assignment
에러메세지 : 멤버필드 n4가 초기화 되지 않았습니다.
The blank final field n4 may not have been initialized

final 멤버필드는 생성자를 통해서 초기화가 가능하다.

접근제한자로 final n5 변수를 선언해준다
final필드에 대해서 getter는 생성할 수 있지만
setter는 값을 대입해주는 함수이므로 생성자체가 안된다.

멤버필드에도 final을 지정할 수 있다.
하지만 클래스에 절대 지정된 값이라서 절대 바꿀 수 없다.


주석처리하고 실행시켜보자.

접근제한자 private은 멤버변수의 값을 임의로 바꿀 수는 없지만
getter ,setter 내장함수를 통해서 값을 새로 대입시키고 호출할 수 있지만
final은 getter함수로 "호출만" 가능하다. 어떤 경우에도 바꿀 수 없다.
아래코드는 각기 트럼프 카드의 크기와 값이 모두 다르다
코드를 수정해서 카드에 담긴 하트, 스페이드, 클로버 의 개수와 크기를 같게 만들어보자.
단, static, final을 써야한다.
수정전 코드




수정한 코드
num의 값을 static 으로 3 으로 고정시켜준다.
width 변수와 height 변수를 5로 고정시키고 final , 즉 상수화 시킨다.

setCardProperty의 매개변수 int num을 빼버린다.

기존에 있던 setSize 함수를 삭제하고
setCardProperty함수를 새로생성해준다.

완성!
