JAVA기초

스태틱 (static) 정적변수, 정적메서드 ,final

LRWoo 2023. 6. 2. 18:19
728x90
반응형

 

static (값이 변하지 않는)
객체를 생성하지 않아도 접근할 수 있는 요소에 static을 붙힌다.

 

ex) 책 : 사각형 (고정) ,  사람 : (고정) 
객체를 지정하지않아도 고정되어있는 값에 static을 붙힐 수 있다. 
ex)
신용카드의 모양  (고정) (static) 
신용카드의  표지, 신용카드 번호 (변할 수 있는 값 : non-static)

 
 
 
닭이먼저냐 달걀이 먼저냐 

 
 
 

static에 달려있는 필드나 메서드는 일반적인 필드나 메서드보다 먼저생성된다.
static필드,메서드가  먼저 만들어지고 그 이후에 non- static 필드,메서드 가 만들어진다. 

 
 
main이 실행되야 그 안에서 변수를 생성하든  반복문을 생성하든 변수를 참조하든 해야한다.  
하지만 main함수는 non-static이기때문에 void main앞에 필수로 static이 붙을 수 밖에 없다. 

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요소를 정상적으로 참조할 수 있다는 보장이 없다.

 
 
 
 
 

Guest클래스

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

main 함수 안

 
 

 

클래스에 바로 점을 찍어서 사용할 수 있다면 static이다.

 
 
 
 
 
 

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을 지정할 수 있다.
하지만 클래스에 절대 지정된 값이라서 절대 바꿀 수 없다.
Test2클래스 내부에서 final 멤버필드 선언

 

main함수안에서 값을 재지정.      ACADEMY_NAME은 바꿀 수 없다.

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

 
 

접근제한자 private은  멤버변수의 값을 임의로 바꿀 수는 없지만
getter ,setter 내장함수를 통해서  값을 새로 대입시키고 호출할 수 있지만 
final은 getter함수로  "호출만" 가능하다.  어떤 경우에도 바꿀 수 없다.

 
 

아래코드는 각기 트럼프 카드의 크기와 값이 모두  다르다
코드를 수정해서  카드에 담긴 하트, 스페이드, 클로버 의 개수와 크기를 같게 만들어보자.
단, static, final을 써야한다. 

 

수정전 코드 

 

멤버변수

 

 


 
 
 
 

수정한 코드 

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

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

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

 
완성!

 

728x90
반응형