퀴즈앱4; 캡슐화
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'를 출력하게될것이다.
캡슐화를 통해 이를 방지할 수 있다.
속성'q' private 정의
우선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')
클래스내에 'private'속성 반환하는 함수 정의
'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')
'
'
'questionNumber' 변수 'private' 정의
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;
'
'
클래스내에 'private'속성 이용하는 함수 정의
다음과 같이, 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();
'
'
Author And Source
이 문제에 관하여(퀴즈앱4; 캡슐화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dbscks1239/퀴즈앱4-캡슐화-feat.Flutter저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)