Flutter

[Flutter] Static 키워드 - 클래스의 변수는 멤버 변수랑 뭐가 다른데?

futuregunmulju 2024. 11. 3. 04:09
반응형

Static을 설명하기 전에 Class(클래스)Instance(인스턴스)를 이해해야된다.
 
 
우선 클래스(Class)도안, 도면,블루프린트이다.

건물 지을 때 쓰는 도면
갑자기 인간이 나오셔서 놀라셨나요...?ㅎㅎ '인간 도안' 이라고 치니까 나왔다
너무 대표적이어서 클래스 == 붕어빵틀 로 외우는 사람 있을 것 같다. 출처 : https://blog.hexabrain.net/104

 
 
이런 도안(=Class)들로 우리는 여러 인스턴스(Instance)를 생성한다. 기본 데이터를 넘기면 서로 다른 인스턴스를 생성할 수 있다.

위의 첫번째 사진 건물 도면에서 바닥, 창, 천장 등등등... 에 서로 다른 재료인, 철재, 타일, 시멘트, 벽지를 사용하면 서로 다른 건물이 지어진다. 똑같은 도면을 썼는데!
 
두번째 사진에서도 만약 신이 인간 클래스(Human Class)를 만들어서
인간이면 갖는 기본적인 값들, 멤버 변수(혹은 property 라고도 부름) 를 피부색, 눈동자색, 머리카락색, 곱슬강도, 성별, 다리의 길이, 팔의 길이, 성격 등등등등... 을 선언했다 (물론 예외는 무시). 그리고 너에게,

피부색 = Color(0xFFEBCBB6);
성별 = Gender.female;
다리길이 = 100;
성격 = [Personality.착함, Personality.순함, Personality.야망적임]
눈동자색 = Colors.black;
입술모양 = Lips.plumpy;

이렇게 독특한 값들을 줬다고 하면 하나의 아름다운 인간 인스턴스가 생성된거다.

똑같은 도안인간 클래스(Human Class)를 사용했는데 지구상의 80억명의 서로 다른 인스턴스를 각자만의 특성을 갖고 찍어낼 수 있는거다.
(실제 신이 우리를 이렇게 만든거 아니야....?!)

인간 클래스로 만든 아름다운 인간 여성 인스턴스 3명. 멤버 변수는 서로 다른 값을 갖는다.

 
여기서 저 멤버변수의 값은 '인스턴스를 만들어야지만' 넣을 수가 있다.
따라서 인스턴스를 생성하지 않으면, 클래스 안에 있는 멤버변수가 생성되지도 않고, 사용할 수도 없다.
 

근데 static 변수도안, 즉 클래스에 그려놓은 변수이다. 이미 도안 안에 “박아둔”, 선언해둔 변수이기 때문에 인스턴스를 생성하지 않고도 사용할 수 있다.

 

따라서, static 변수는 클래스에 속하는 변수이므로, 모든 인스턴스가 같은 메모리 공간을 공유한다. 왜냐면 모든 인스턴스는 클래스를 고대로 가지고 만드니까!!

같은 클래스를 통해 생성된 모든 인스턴스가 같은 데이터를 공유해야 하는 경우에 static을 사용된다.

예를 들어) 모든 인간은 호흡을 하고(메소드), 뇌가 있고(멤버 변수), 늙어가는 것(메소드)처럼. 인간이라면 모두 다 이 행동과 데이터가 있어야되니까!
 
 
이런 변수나 메소드를 static으로 선언하면,
- static 변수 : 모든 인스턴스가 공유하는 변수로, 클래스 자체에 속함.
- static 메소드 : 클래스 이름으로 '직접' 호출 가능한 메소드로, 다른 static 멤버들만 접근 가능.
 
 
 
그러면 이런 질문도 할 수 있을 것 같다. 

static은 모든 인스턴스가 다 동일하게 가지는 값이며 메소드이라면, final이랑 const로 선언해도 문제가 되지 않지 않나? 라고 생각할 수도 있을 것 같다.

 
결론부터 말하면, staticfinal, const 같은 상수는 서로 다른 목적을 가지고 있기 때문에 동일하게 사용할 수 없다.
static 변수는 모든 인스턴스가 동일한 하나의 값을 “가리키고” 있어서 만약 static 변수 값을 수정하면 모든 인스턴스에 있는 값이 수정된다.
반면 finalconst로 선언된 변수로 여러 인스턴스를 생성하면, 동일한 값일지어도 인스턴스 각자 다른 메모리를 참조하고 있어서 엄밀히 말하면 서로 다른 개개인의 값이다.
또한, finalconst는 한번 초기화하는 과정이 있어서 인스턴스를 더 다채롭게 만들 수 있지만 static은 초기화하는 과정 없이 그냥 애초에 이미 정해진 값이다(클래스를 수정하지 않는 이상). 
 
 
 
 
 
 
 
 
 
 
여기까지이다! 질문이 있으시다면 언제든 댓글 남겨주시면 후다닥 달려오도록 하겠다.🩷
 
 
P.S 플러터 공부한지 꽤 됐는데 노션에 있는 내용 언제 다 옮기냐...

반응형