프로그래밍/플러터

Getters and Setters

스루나루 2024. 2. 18. 17:07
728x90
728x90

 

 

 

서론

 

 플러터 세미나 듣다가 제대로 알지 못했던 부분이라 정리하려고 한다.

 보통 setter나 getter를 쓰긴해도 변수에서 받을 때 set , get 이렇게 작성한 적이 없다보니 확실하게 정리해보자

 

 

Getter

 

 - 값을 가져올 때 사용 

 - 매개 변수가 없음 

 - 프라이빗 변수를 가져 올 수 있음 

 - 자바에서는 getName() 이런 식으로 사용했으나 다트에서는 좀 다름 

Class Membership {
    int _id;
    
    int get id {
    	return this._id;
    }
}

 

 

Setter

 - 값을 세팅할 때 사용 

 - 요즘은 불변성을 추구한다고 하여 set으로 객체의 필드값을 변경하는 것은 좋지 않음 

 - 파라미터가 있어 해당 필드 값을 변경 

 

Class Membership {
    int _id;
    
    int set id(int id) {
    	return this._id = id ;
    }
}

 

 

사용법 1 

 

 - 자바에서는 함수 호출로 getter , setter를 사용하지만 다트에서는 변수처럼 사용한다. 

 - 값을 할당 = set , 출력 및 조회 = get  

 - 즉 그냥 변수를 쓰면 자연스럽게 set , get이 적용되는 것이다. print로 id를 출력하려고 print(membership.id) 를 사용하면 자동으로 get이 호출 되는 거고 id를 변경하려고 membership.id = 4; 로 변경하면 자동으로 set이 사용되어 지는 것 

 

 

Class Membership {
    int _id;
    
    int set id(int id) {
    	return this._id = id ;
    }
    
    int get id {
    	return this._id;
    }
}

 

 

근데 우린 보통 get ,set 저거 지정하지 않고도 잘만 객체에서 값 꺼내 쓰거나 조회하거나 잘 해왔는데 뭐 때문일까?

 

Implicit Getters and Setters

다트에서는 기본적인 속성에 대한 get, set을 자동으로 생성해주는 기능이 있음 
해당 기능이 적용되어 있으니까 get, set 작성하지 않아도 클래스의 속성에 직접 접근 및 값의 변경이 가능하다고 한다. 
다만 프라이빗의 경우는 명시적으로 작성해야 하는 듯 

 

class Person {
  String _name;
  int _age;
  
  String get name {
    return _name;
  }
  
  void set name(String value) {
    _name = value;
  }
}

void main() {
  Person person = Person();

  person._age = 30; // 에러 발생: '_age'는 클래스 외부에서 접근할 수 없음
}

 

 

사용법 2 

 

 어플에서 값이 변화하거나 조회할 때마다 자동으로 get , set이 호출되는 형식이다 보니 값으 변화 혹은 로그를 남길 때 사용할 수도 있다. 

 turns라는 변수의 값의 변화에 대해 로그를 남기기 위해서 print를 남겨두면 해당 turns의 값이 갱신될 때마다 set함수가 호출되고 안에 있는 print도 호출되어 로그가 남게된다.

 

  // 빌드 함수 안에 두면 늘 초기화 되니까 빌드 밖에
  double _turns = 0.0;

  double get turns => _turns;

  set turns(double newTurns) {
    // 내가 원하는 동작 수행
    print("현재 $newTurns번째 회전");
    _turns = newTurns;
  }

  void rotateButton() {
    setState(() {
      turns = turns + 1.0;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            AnimatedRotation(
              duration: const Duration(milliseconds: 500),
              turns: turns,
              child: IconButton(
                  onPressed: rotateButton, icon: const Icon(Icons.refresh)),
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: showBottomModal,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

 

 

참고

https://dart.dev/language/methods

 

Methods

Learn about methods in Dart.

dart.dev

 

728x90
728x90