goal : 캡슐화를 통해 앱을 안전하게 보호하자.
'quiz'객체의 'q'속성을main.dart
파일에서 자유롭게 변경할 수 있다면, 앱은 안전을 보장하지 못한다.
예를들어, 다음의 상황을 가정해보자.
onPressed: () {
quiz.q[questionNumber].questionanswer = true; // 추가한코드
if (quiz.q[questionNumber].questionanswer == true) {
print('correct');
} else {
print('not correct');
}
이와같이, 'quiz.q[questionNumber].questionanswer'에 'true'값을 임의로 치환한다면, 무조건 'correct'를 출력하게될것이다.
캡슐화를 통해 이를 방지할 수 있다.
우선quiz.dart
파일의 'Quiz' 클래스의 'q'속성을 'private'으로 정의하자.
※ 'dart'에서는 정의하려는 속성에 '__'를 붙히면 된다. ※
import 'question.dart';
class Quiz {
List<Question> _q = ['''''];
이제 'q'는 'private'하므로 'q'가 속한 'Quiz' 클래스 내에서만 사용가능하다. ※ main.dart
파일에서는 이제 'q'를 사용하지못한다. ※
즉, main.dart
파일의 'q'가 적용된 부분들의 코드수정이 필요하다.
main.dart
파일child: Text(
quiz.q[questionNumber].questiontext,
'
'
onPressed: () {
if (quiz.q[questionNumber].questionanswer == true) {
print('correct')
'
'
onPressed: () {
if (quiz.q[questionNumber].questionanswer == false) {
print('correct')
'q'를main.dart
파일 내에서 사용하지 못하므로quiz
파일의 'Quiz' 클래스내에 함수를 추가하여 대체하자.
class Quiz {
'
'
'
String gettext(int questionNumber) {
return _q[questionNumber].questiontext;
} // 'main.dart'파일의 'quiz.q[questionNumber].questiontext' 대체할 함수
bool getanswer(int questionNumber) {
return _q[questionNumber].questionanswer;
} // 'main.dart'파일의 'quiz.q[questionNumber].questionanswer' 대체할 함수
}
main.dart
파일 수정main.dart
파일'
'
child: Text(
quiz.gettext(questionNumber),
'
'
onPressed: () {
if (quiz.getanswer(questionNumber) == true) {
print('correct')
'
'
onPressed: () {
if (quiz.getanswer(questionNumber) == false) {
print('correct')
'
'
main.dart
파일의 'questionNumber' 변수를 'Quiz' 클래스내에서 'private'하게 정의하자.
class Quiz {
'
'
int _questionNumber = 0;
'
'
이제main.dart
파일에서 'questionNumber' 변수를 사용하지 못하므로 'questionNumber' 변수가 적용된 코드는 수정이 필요하다.
main.dart
파일'
'
child: Text(
quiz.gettext(questionNumber),
'
'
onPressed: () {
if (quiz.getanswer(questionNumber) == true) {
print('correct')
'
questionNumber += 1;
'
'
onPressed: () {
if (quiz.getanswer(questionNumber) == false) {
print('correct')
'
questionNumber += 1;
'
'
다음과 같이, quiz.dart
파일의 'Quiz' 클래스를 다음과 같이 변경해주자.
class Quiz {
List<Question> _q = ['''];
int _questionNumber = 0;
void addNumber() {
if (_questionNumber < _q.length - 1) {
_questionNumber++;
}
} // q의 길이는 13이므로 'questionNumber'는 13이상의 값을 가지면 에러를 유발한다.
String gettext() {
return _q[_questionNumber].questiontext;
}
bool getanswer() {
return _q[_questionNumber].questionanswer;
}
}
main.dart
파일 수정main.dart
파일'
'
child: Text(
quiz.gettext(),
'
'
onPressed: () {
if (quiz.getanswer() == true) {
print('correct')
'
quiz.addNumber();
'
'
onPressed: () {
if (quiz.getanswer() == false) {
print('correct')
'
quiz.addNumber();
'
'