-
- 외부에서 접근을 할 수 없도록, Private하게 사용할 수 있는 멤버 변수(또는 멤버 함수 등)를 지정하는 방법이 있다. Dart에서는 Private 멤버 변수를 어떻게 설정하는지 알아보고 정리하시오.
- 이때, Private으로 멤버변수를 설정시 얻는 이점에 대해서도 추가적으로 고민하여 정리하시오.
Private 변수
Dart에서는 변수명 앞에 _(underscore)를 추가함으로써, Private 변수를 생성할 수 있다. 클래스안에서만 Private 변수가 사용 가능한 다른 언어와는 달리, Dart에서는 클래스가 정의된 파일에서는 Private 변수에 접근할 수 있다.
예를들어,
class Idol{ //Private 변수 선언 String _name; Idol(this._name); } void main(){ Idol blackPink = Idol('블랙핑크); print(blackPink._name); }
결과
블랙핑크
Private으로 멤버변수를 설정시 얻는 이점은 프로젝트를 진행할 때, 나홀로 진행하는 것이라면 상관없지만 다수가 함께 참여하여 진행하는 프로젝트의 경우 해당 자료를 보호할 수 있도록 private 멤버 변수를 사용하는것이 좋다.
2. 클래스에서는 부모의 힘과 기능을 사용할 수있도록 extends가 존재한다. extends를 사용하게되면 super의 키워드도 간혹볼 수 있는데, 이 때 super의 기능은 무엇인지 정리하시오.
extends
extends는 클래스의 자식 클래스를 생성할때 사용한다.
기본형태
class 부모클래스 { constructor(변수1,변수2){ this.변수1 = 변수1; this.변수2 = 변수2; } 메소드(){ //기능 ... } } class 자식클래스 extends 부모클래스 { constructor(변수1, 변수2, 변수3){ //super키워드로 부모클래스 생성자 호출 super(변수1,변수2); this.변수3 = 변수3; } 메소드2(){ //부모 클래스의 메소드 호출 super.메소드(); //추가할 자식 클래스만의 기능 ... } }
샘플예제
//부모 클래스 class Score { constructor(math,english,korean){ this.math = math; this.english = english; this.korean = korean; } sum() { return this.math + this.english + this.korean; } avg(){ const sum = this.sum(); console.log('평균 점수 (3과목) : '+ sum / 3); } } //자식 클래스 class Student extends Score { constructor(math,english,korean,science){ //super키워드를 통해 부모 클래스 생성자 호출 super(math,english,korean); //추가 프로퍼티 초기화 this.science = science; } avg(){ //super.sum()을 통해 부모 클래스의 //메소드 접근 const sum = super.sum() + this.science; console.log('평균 점수 (4과목): '+ sum / 4); } } const stu = new Student(90,90,100,100); stu.avg();
실행결과
평균 점수 (4과목): 95
super()은 부모 생성자를 호출한다.
부모 생성자의 일이 끝난 후 부모가 해결하지 못하는 것은 자식 생성자가 하도록 하는 것이다.
이 super()이 없다면 중복이 될 것을 부모에게 가서 실행시키고 오는것이다.
Score라는 클래스를 사용 하면서 거기서 더 부가적인 기능을 추가해서 이용하고 싶을 때 extends, 상속을 이용한다.
물론 Score 클래스에서 다른 메소드를 넣을 수 있으나, 만일 저 코드가 내 코드가 아니거나 수정하면 참 곤란해지는 것 이라면, 신경쓸게 많아질 것이다.
때문에 어차피 겹치게 될 Score의 생성자를 상속받고 나머지는 자식인 Student의 sum,avg만 호출하여 결국 자식의 콘솔로그만 출력이 되는 것이다.
3. GetPage의 URL방식 네비게이션을 활용한 페이지 접근은 원하는 데이터를 포함시키어 다음 페이지로 이동시킬 수 있다. 다음의 결과물은 이 전 페이지(MainPage)에서 Get.toNamed를 활용하여 DetailPage로 이동된 결과다.
lib/page/detail_page.dart (코드보기)
import 'package:flutter/material.dart'; import 'package:get/get.dart'; class DetailPage extends StatelessWidget { const DetailPage({super.key}); static const String route = '/detail'; @override Widget build(BuildContext context) { var params = Get.parameters; var arguments = Get.arguments; return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('$params'), Text('$arguments'), ], ), ), ); } }
- Get.Parameter가 무엇을 의미하는지, Get.toNamed를 활용하여 Parameter를 넘길 수 있는 방법에 대해 연구하고 코드를 제시하시오.
사용법
Get.toNamed('/papa/value');
value 값이 param 값으로 전달된다.
ex)
Get.toNamed('/papa/1234');
1234가 param 값으로 전달,
- param값을 받으려면
Get.parameters['param']
마찬가지로 쿼리도 다음과 같은 방식으로 사용할 수 있다.
Get.toNamed('/papa/value?id=123&name=침착맨');
받는 방법은
Get.parameters['param'] => value 값
Get.parameters['id'] => id 값, 즉 123
Get.parameters['name'] => name 값, 즉 침착맨이다- Get.arguments가 무엇을 의미하는지, Get.toNamed를 활용하여 arguments를 넘길 수 있는 방법에 대해 연구하고 코드를 제시하시오.
페이지 이동 시 argument를 전달해야 하는 상황을 구현한 코드
//방법1 Get.toNamed('/next', arguments: 'Hello'); //방법2 맵 방식을 보냅니다. Get.toNamed('/next', arguments: {'name': '제로', 'age': '31'}); //방법3. custom하게 만든 객체도 보냅니다. Get.toNamed('/next', arguments: User(name: '제로', age: 35)); class User { String name; int age; User({required this.name, required this.age}); }
전달되는 argument를 화면에 출력
// 방법1: 전달받은 argument를 변수에 담습니다. var arg = Get.arguments; // 방법 2: 전달받은 argument를 바로 ui 화면에 표시합니다. Text('${Get.arguments}'), // 방법3: 여러 arguments가 담겨있는 경우 아래처럼 화면에 표시합니다. Text('이름 : ${Get.arguments['name']} 나이 : ${Get.arguments['age']}'), //방법 3: 여러 arguments가 담겨있는 경우 아래처럼 화면에 표시합니다.2 Text('이름 : ${(Get.arguments as User).name} 나이 : ${(Get.arguments as User).age}'),
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
lib/util/pages.dart
import 'package:myapp31/page/detail_page.dart'; import 'package:myapp31/page/main_page.dart'; import 'package:myapp31/util/routes.dart'; class AppPages { static final pages = [ GetPage(name: AppRoutes.detail, page: () => DetailPage()), GetPage(name: AppRoutes.main, page: () => MainPage()), ]; }
lib/util/routes.dart
import 'package:myapp31/page/detail_page.dart'; import 'package:myapp31/page/main_page.dart'; class AppRoutes { static const detail = DetailPage.route; static const main = MainPage.route; }
main.dart
import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:myapp31/page/main_page.dart'; import 'package:myapp31/util/pages.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return GetMaterialApp( getPages: AppPages.pages, home: MainPage(), ); } }
lib/page/main_page.dart
import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:myapp31/util/routes.dart'; class MainPage extends StatelessWidget { const MainPage({super.key}); static const String route = '/main'; @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( onPressed: () => Get.toNamed('${AppRoutes.detail}/value?a=3', arguments: 'Hello World'), child: Text('DetailPage 이동')), ), ); } }
lib/page/detail_page.dart
import 'package:flutter/material.dart'; import 'package:get/get.dart'; class DetailPage extends StatelessWidget { const DetailPage({super.key}); static const String route = '/detail'; @override Widget build(BuildContext context) { var params = Get.parameters; var arguments = Get.arguments; return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('$params'), Text('$arguments'), ], ), ), ); } }
결과 [참고]
https://zzingonglog.tistory.com/33
https://goodmemory.tistory.com/121
https://jae04099.tistory.com/entry/JavaScript-%EC%83%81%EC%86%8D-extends-super
- 외부에서 접근을 할 수 없도록, Private하게 사용할 수 있는 멤버 변수(또는 멤버 함수 등)를 지정하는 방법이 있다. Dart에서는 Private 멤버 변수를 어떻게 설정하는지 알아보고 정리하시오.