SlideShare une entreprise Scribd logo
1  sur  33
Flutter가 몸에
좋은 이유
개발자 건강을 위한 최고의 방법
Flutter Songdo Organizer (2022 ~ )
GDG Songdo Organizer (2020~ 2023)
Tech Lead @bluefrog (2020 ~ )
Android
Flutter
Back-end + DevOps
I’m an App Developer.
Bio
yangsterchief@duck.com
https://github.com/yangster-chief
https://www.linkedin.com/in/sujang-yang
1. 이 발표는 Flutter가 개발자의 삶과 건강에 미치는 긍정적인 영향에 대한 개인적인 견해를 다룹니다. 다른
의견도 존중하며, 여기서 제시된 내용은 일반화하기 어려울 수 있습니다.
2. 발표에서는 Flutter 사용이 작업량 감소, 스트레스 완화, 워크-라이프 밸런스 개선 등을 통해 개발자의 정신
건강에 이점을 제공한다고 주장할 예정입니다.
3. 활발한 Flutter 커뮤니티와 자료가 개발자에게 지원 체계를 제공하여 정신적 안정에 기여한다는 주장을
펼칠 것입니다.
4. 위 내용들은 개인적인 경험과 의견을 바탕으로 한 것이며, 다른 관점과 반론도 있을 수 있음을 인정합니다.
5. 발표 중에는 실제 사례와 개발자 경험담을 활용하여 주장을 뒷받침할 예정이지만, 이러한 경험 사례가
일반화되기 어려울 수 있습니다.
⚠ 주의사항
작업량 감소와 스트레스
완화
요즘 대세라는 명령형 UI
// Imperative style
b.setColor(red)
b.clearChildren()
ViewC c3 = new
ViewC(...)
b.add(c3)
// Declarative style
return ViewB(
color: red,
child: const ViewC(),
);
One Source Multi Use
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class _MyHomePageState extends State<MyHomePage> {
static const platform = MethodChannel('samples.flutter.dev/battery');
// Get battery level.
String _batteryLevel = 'Unknown battery level.';
Future<void> _getBatteryLevel() async {
String batteryLevel;
try {
final int result = await platform.invokeMethod('getBatteryLevel');
batteryLevel = 'Battery level at $result % .';
} on PlatformException catch (e) {
batteryLevel = "Failed to get battery level: '${e.message}'.";
}
...
class MainActivity: FlutterActivity() {
private val CHANNEL = "samples.flutter.dev/battery"
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
call, result -> // This method is invoked on the main thread.
if (call.method == "getBatteryLevel") {
val batteryLevel = getBatteryLevel()
if (batteryLevel != -1) {
result.success(batteryLevel)
} else {
result.error("UNAVAILABLE", "Battery level not available.", null)
}
} else {
result.notImplemented()
}
}
}
}
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let batteryChannel = FlutterMethodChannel(name: "samples.flutter.dev/battery", binaryMessenger: controller.binaryMessenger)
batteryChannel.setMethodCallHandler({
[weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in // This method is invoked on the UI thread.
guard call.method == "getBatteryLevel" else {
result(FlutterMethodNotImplemented)
return
}
self?.receiveBatteryLevel(result: result)
})
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
우리 Flutter 정상영업
합니다
class User {
final String name;
final int age;
User(this.name, this.age);
void printUserInfo() => print('User Name: $name, Age: $age'); // 객체의 정보를 출력하는 메소드
}
Future<String> fetchUserData() {
// 비동기 작업을 시뮬레이션하기 위해 Future.delayed 사용
return Future.delayed(Duration(seconds: 2), () => 'John Doe,30');
}
void main() async {
print('Fetching user data...');
var userData = await fetchUserData(); // 비동기 함수 호출 및 대기
var userDetails = userData.split(',');
var user = User(userDetails[0], int.parse(userDetails[1]));
user.printUserInfo(); // 'User Name: John Doe, Age: 30' 출력
}
66 개국 150개
그룹
Flutter Seoul (서울, 한국(대한민국)) | Meetup
Flutter Songdo (인천, 한국(대한민국)) | Meetup
Flutter Daegu - 플러터 대구 (대구, 한국(대한민국)) | Meetup
Flutter Korea
“여러번 말씀드리지만
여러분들 이제는 Flutter 꼭
하셔야합니다 진짜진짜요”
THANK
YOU!
v

Contenu connexe

Similaire à [Native vs Flutter] Flutter가 몸에 좋은 이유 _ 개발자 건강을 위한 최고의 방법.pdf

Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumerChang Yoon Oh
 
Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2성일 한
 
The Cucumber for Java
The Cucumber for JavaThe Cucumber for Java
The Cucumber for JavaJonghwa Lee
 
Laravel 로 배우는 서버사이드 #3
Laravel 로 배우는 서버사이드 #3Laravel 로 배우는 서버사이드 #3
Laravel 로 배우는 서버사이드 #3성일 한
 
Clean code
Clean codeClean code
Clean codebbongcsu
 
3D 모델러 ADDIN 개발과정 요약
3D 모델러 ADDIN 개발과정 요약3D 모델러 ADDIN 개발과정 요약
3D 모델러 ADDIN 개발과정 요약Tae wook kang
 
[강연] 학생에서 현업 개발자로의 성공적인 변신을 위하여
[강연] 학생에서 현업 개발자로의 성공적인 변신을 위하여[강연] 학생에서 현업 개발자로의 성공적인 변신을 위하여
[강연] 학생에서 현업 개발자로의 성공적인 변신을 위하여Kwangsung Ha
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개
XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개
XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개XpressEngine
 
N02 app engineseminar
N02 app engineseminarN02 app engineseminar
N02 app engineseminarSun-Jin Jang
 
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Spring Cloud Workshop
Spring Cloud WorkshopSpring Cloud Workshop
Spring Cloud WorkshopYongSung Yoon
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
Tizen main loop 이해
Tizen main loop 이해Tizen main loop 이해
Tizen main loop 이해Hermet Park
 

Similaire à [Native vs Flutter] Flutter가 몸에 좋은 이유 _ 개발자 건강을 위한 최고의 방법.pdf (20)

GEF
GEFGEF
GEF
 
Eclipse RCP 2/2
Eclipse RCP 2/2Eclipse RCP 2/2
Eclipse RCP 2/2
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 
Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2
 
The Cucumber for Java
The Cucumber for JavaThe Cucumber for Java
The Cucumber for Java
 
Laravel 로 배우는 서버사이드 #3
Laravel 로 배우는 서버사이드 #3Laravel 로 배우는 서버사이드 #3
Laravel 로 배우는 서버사이드 #3
 
Clean code
Clean codeClean code
Clean code
 
3D 모델러 ADDIN 개발과정 요약
3D 모델러 ADDIN 개발과정 요약3D 모델러 ADDIN 개발과정 요약
3D 모델러 ADDIN 개발과정 요약
 
[강연] 학생에서 현업 개발자로의 성공적인 변신을 위하여
[강연] 학생에서 현업 개발자로의 성공적인 변신을 위하여[강연] 학생에서 현업 개발자로의 성공적인 변신을 위하여
[강연] 학생에서 현업 개발자로의 성공적인 변신을 위하여
 
Nest js 101
Nest js 101Nest js 101
Nest js 101
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개
XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개
XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개
 
N02 app engineseminar
N02 app engineseminarN02 app engineseminar
N02 app engineseminar
 
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
 
Eclipse RCP 1/2
Eclipse RCP 1/2Eclipse RCP 1/2
Eclipse RCP 1/2
 
Android unit testing
Android unit testingAndroid unit testing
Android unit testing
 
Xe hack
Xe hackXe hack
Xe hack
 
Spring Cloud Workshop
Spring Cloud WorkshopSpring Cloud Workshop
Spring Cloud Workshop
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
Tizen main loop 이해
Tizen main loop 이해Tizen main loop 이해
Tizen main loop 이해
 

Dernier

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 

Dernier (6)

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 

[Native vs Flutter] Flutter가 몸에 좋은 이유 _ 개발자 건강을 위한 최고의 방법.pdf

  • 1. Flutter가 몸에 좋은 이유 개발자 건강을 위한 최고의 방법
  • 2. Flutter Songdo Organizer (2022 ~ ) GDG Songdo Organizer (2020~ 2023) Tech Lead @bluefrog (2020 ~ ) Android Flutter Back-end + DevOps I’m an App Developer. Bio yangsterchief@duck.com https://github.com/yangster-chief https://www.linkedin.com/in/sujang-yang
  • 3. 1. 이 발표는 Flutter가 개발자의 삶과 건강에 미치는 긍정적인 영향에 대한 개인적인 견해를 다룹니다. 다른 의견도 존중하며, 여기서 제시된 내용은 일반화하기 어려울 수 있습니다. 2. 발표에서는 Flutter 사용이 작업량 감소, 스트레스 완화, 워크-라이프 밸런스 개선 등을 통해 개발자의 정신 건강에 이점을 제공한다고 주장할 예정입니다. 3. 활발한 Flutter 커뮤니티와 자료가 개발자에게 지원 체계를 제공하여 정신적 안정에 기여한다는 주장을 펼칠 것입니다. 4. 위 내용들은 개인적인 경험과 의견을 바탕으로 한 것이며, 다른 관점과 반론도 있을 수 있음을 인정합니다. 5. 발표 중에는 실제 사례와 개발자 경험담을 활용하여 주장을 뒷받침할 예정이지만, 이러한 경험 사례가 일반화되기 어려울 수 있습니다. ⚠ 주의사항
  • 5.
  • 6.
  • 7.
  • 9.
  • 11. // Declarative style return ViewB( color: red, child: const ViewC(), );
  • 13.
  • 14.
  • 15.
  • 16. import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class _MyHomePageState extends State<MyHomePage> { static const platform = MethodChannel('samples.flutter.dev/battery'); // Get battery level. String _batteryLevel = 'Unknown battery level.'; Future<void> _getBatteryLevel() async { String batteryLevel; try { final int result = await platform.invokeMethod('getBatteryLevel'); batteryLevel = 'Battery level at $result % .'; } on PlatformException catch (e) { batteryLevel = "Failed to get battery level: '${e.message}'."; } ...
  • 17. class MainActivity: FlutterActivity() { private val CHANNEL = "samples.flutter.dev/battery" override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> // This method is invoked on the main thread. if (call.method == "getBatteryLevel") { val batteryLevel = getBatteryLevel() if (batteryLevel != -1) { result.success(batteryLevel) } else { result.error("UNAVAILABLE", "Battery level not available.", null) } } else { result.notImplemented() } } } }
  • 18. @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let controller : FlutterViewController = window?.rootViewController as! FlutterViewController let batteryChannel = FlutterMethodChannel(name: "samples.flutter.dev/battery", binaryMessenger: controller.binaryMessenger) batteryChannel.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in // This method is invoked on the UI thread. guard call.method == "getBatteryLevel" else { result(FlutterMethodNotImplemented) return } self?.receiveBatteryLevel(result: result) }) GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
  • 20.
  • 21.
  • 22.
  • 23. class User { final String name; final int age; User(this.name, this.age); void printUserInfo() => print('User Name: $name, Age: $age'); // 객체의 정보를 출력하는 메소드 } Future<String> fetchUserData() { // 비동기 작업을 시뮬레이션하기 위해 Future.delayed 사용 return Future.delayed(Duration(seconds: 2), () => 'John Doe,30'); } void main() async { print('Fetching user data...'); var userData = await fetchUserData(); // 비동기 함수 호출 및 대기 var userDetails = userData.split(','); var user = User(userDetails[0], int.parse(userDetails[1])); user.printUserInfo(); // 'User Name: John Doe, Age: 30' 출력 }
  • 24.
  • 25.
  • 26.
  • 27.
  • 29. Flutter Seoul (서울, 한국(대한민국)) | Meetup Flutter Songdo (인천, 한국(대한민국)) | Meetup Flutter Daegu - 플러터 대구 (대구, 한국(대한민국)) | Meetup Flutter Korea
  • 30.
  • 31.
  • 32. “여러번 말씀드리지만 여러분들 이제는 Flutter 꼭 하셔야합니다 진짜진짜요”