티스토리 뷰

플러터

Dart 언어

하몬드 2023. 7. 23. 12:33

웹 IDE

 

DartPad

 

dartpad.dev

SDK나 IDE 설치 없이도 Dart 및 Flutter 코드를 Web browser 환경에서 실행할 수 있는 무료 오픈 소스 온라인 편집기이다.

 


객체지향 프로그래밍

 

Dart는 객체지향 프로그래밍을 사용한다.

여기서 객체지향이란 코드의 단위를 클래스로 나눠 작성하는 기법이다.

 

객체지향 프로그래밍 관련 용어들

//클래스 예시
class Person{

  //속성
  String name;
  int age;
  
  //메서드
  getName(){
    return name;
  }
}

 

1. 클래스: 객체 생성을 위한 템플릿, 내부에 정의된 변수(멤버)와 함수(메서드)로 구성되어 있다.
2. 객체: 클래스 내의 모든 구성요소
3. 메서드: 클래스 내부에서 선언된 함수
4. 상속: 만들어진 클래스(부모)를 기반으로 몇 가지 기능을 추가한 새로운 클래스(자식)를 만드는 것
5. 오버라이딩: 클래스를 상속 받았을 때 부모 클래스의 메서드를 수정해서 사용하는 것

 

 

 

Dart에서의 객체지향 프로그래밍

 

//Dart 객체지향 예시
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(children:[
      Text('1. 안녕하세요', textStyle: TextStyle(fontSize: 14)),
      Text('2. 반갑습니다', textStyle: TextStyle(fontSize: 19)),
    ]);
  }
}

 

1. StatelessWidget이라는 부모클래스를 상속받는다.

2. @override로 부모 클래스의 메서드인 Widget build()를 오버라이딩한다.

3. Text() 클래스를 통해 객체를 2개 만든다.

 

 

 

비동기 프로그래밍

 

이미지 100개를 서버로부터 받아서 갤러리 형태로 보여주는 앱을 만들어라

 

 

비동기 프로그래밍은 이런식으로 접근한다.

 

1. 이미지 100개 서버에 요청
2. 이미지가 모두 도착하기 전까지 다른 작업 수행
3. 도착한 결과 화면에 표시

 

비동기 프로그래밍은 앞서 실행된 작업이 오래 걸릴 경우 다른 작업을 수행하며 이와 동시에 다음 단계까지 수행한다.

이런 방식을 Future라는 키워드로 정리한다.

 

 

Dart에서의 비동기 프로그래밍 

 

//이미지 가져오는 함수
Future<List<Image>?> fetchImages() async {
  List<Image>? results = await fetchImagesFromServer();
  return results;
}

 

async는 비동기 처리를 진행하는 함수이다.

그리고 함께 사용되는 await는 오래 걸리는 작업 앞에 붙는 키워드이다.

 

async와 await를 사용해 작성한 비동기함수는 결과값으로 List<Image>를 가져올 것이다.

그러나 서버로부터 데이터를 받아오는 과정 중 에러나 예기치 못한 작업 중단 이벤트가 발생할 수 있다.

이런 사태를 방지하기 위해 비동기함수의 return타입은 항상 Future 타입으로 포장된다.

 

함수가 정상적으로 동작했다면 미래에 List<Image>타입으로 반환할 수 있지만,

그렇지 않을 수도 있다는 것을 표현한 키워드가 Future이다.

 

 

Null Safety

 

Null Safety는 Null이 발생할 만한 코드에 미리 에러를 띄워

Null이 발생하지 않도로고 예외처리를 강제하는 것이다.

 

Null Safety의 주요 컨셉은 nullable, non-nullable로 정리할 수 있다.

 

//nullable 변수
String? data;
int? value;

 

nullable은 변수타입에 '?'를 붙어 지정할 수 있다.

해당 변수들은 nullable 변수이므로 변수값이 null 일 때도 에러가 뜨지 않는다.

 

//non-nullable 변수
String data = "asdf";
int value = "0";

non-nullable은 nullable과 반대되는 개념으로 ?를 붙이지 않은 변수는 모두 non-nullable이다.

non-nullable 변수는 null 값을 허용하지 않으며 변수를 만들 때 초기값을 꼭 넣어야 한다.

 

//클래스 생성자
class Person() {
  String name;
  int age;

  Person({this.name, this.age});
}

 

Null-Safety 도입 이전엔 위와 같이 클래스를 선언해도 문제가 없었으나

이런 식으로 클래스를 선언하면 name과 age에 null이 들어갈 수 있다.

 

//required 키워드
class Person() {
  String name;
  int age;

  Person({required this.name, required this.age});
}

 

그래서 required라는 키워드를 붙여 해당 값이 꼭 필요한 값임을 명시해야 한다.

 

//nullable 멤버
class Person() {
  String name;
  int age;
  string? profileImg;

  Person({required this.name, required this.age, this.profileImg});
}

 

하지만 클래스 내 모든 변수들에 초기값이 들어가지 않는 경우도 있다.

예를 들어 프로필 이미지의 경우엔 사용자가 나중에 직접 등록하는 구조이다.

이와 같은 변수는 nullable로 선언하면 된다. 

 

//null check 표기법
String? age;
age = age! + 1;

 

null check는 변수뒤에 '!'를 붙여 간단하게 할 수 있다.

!는 age가 null인지 확인하며, null이 아니라면 해당 연산을 수행하겠다는 조건문의 역할을 수행한다.

 

//late 키워드
class _CounterState extends State<Counter> {
  late int count;

  @override
  void initState() {
    super.initState();
    count = 0;
  }
}

 

non-nullable 변수는 late라는 키워드를 적용해서 해당 변수의 초기화를 미룰 수 있다.

 

해당 코드에선 count라는 non-nullable변수 앞에 late라는 키워드를 붙여 초기값을 넣지 않았다.

대신 initState() 함수에서 초기화를 진행하였다.

 

이를 통해 초기화를 강제하는 non-nullable 변수의 규칙을 거부하고

원하는 타이밍에 변수를 초기화 할 수 있다.

'플러터' 카테고리의 다른 글

도서 목록 앱  (0) 2023.07.31
플러터로 상태관리  (0) 2023.07.31
플러터 화면 전환 구현  (0) 2023.07.30
플러터 기초쌓기  (0) 2023.07.24
플러터 실습환경 구축  (0) 2023.07.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함