Flutter Instagram Clone #14 Dart 기본 문법

jakeseo_me·2020년 7월 31일
0

Flutter-Instagram-Clone

목록 보기
14/14

Flutter Instagram Clone #14 Dart 기본 문법

원본 강의

https://www.inflearn.com/course/flutter-%EC%9E%85%EB%AC%B8/dashboard

여기서 유료 결제를 해서 듣고있는 강의의 내용을 개인적인 공부 목적으로 지식 위주로 정리해봅니다.

Dart 기본 문법

Java + Javascript의 느낌을 갖고 있음. Java를 안다는 전제 하에 Java에 없는 문법만 설명함.

String의 표현

void main() { // main 함수의 기본 형태
  print('Hello World'); // 작은 따옴표 큰 따옴표 차이 없음, 문서에서는 작은 따옴표 많이 사용
  print("Hello World");
}

타입

공식 문서의 타입 관련 부분은 여기에 나와있다.

기본적으로 많이 쓰이는 타입

String, int, double 등 다양한 타입이 있음.

var

var라는 형태로 선언하여 다양하게 컴퓨터가 추론하게 만들 수 있음.

dynamic

특이하게 dynamic이라는 타입이 있음. 함수의 파라미터 타입으로 dynamic이라는 타입을 주면 파라미터로 어떤 타입이든 받을 수 있음.

num

num이라는 타입이 있는데, 이 타입은 intdouble을 둘 다 포함하는 타입임.

타입캐스팅에 관련하여 Java에서는 double로 선언된 변수 내에 int를 넣을 수 있지만, Dart에서는 double로 선언된 변수에 int를 넣을 수 없다. 그래서 num을 사용한다.

const, final

constfinal이 둘 다 존재한다. const는 컴파일타임에 메모리에 고정이 되는 반면, final은 동적 메모리 할당으로 메모리 재할당이 가능하다.

List

List<Type>과 같이 List를 선언하는 것은 Dart에서는 그냥 var a = [...]을 하면 List<Type>과 같이 적용된다.

Set

Set{}와 같이 꺾인 괄호로 묶어주면 된다.

Map

Map은 javascript Object와 비슷하게 처리 var itemMap = {'key': 'value'}와 같은 형식으로 하면 된다.

spread operator

... 이라는 스프레드 연산자가 있다.

var items = [1, 2, 3];
var items2 = [...items, 4, 5];

위와 같이 사용하면, items2 = [1, 2, 3, 4, 5]와 같이 적용된다.

옵션 파라미터

void something({String name}){

}
void main() {
  something(name: '홍길동');
}

위와 같이 옵션을 지정하여 파라미터를 줄 수 있다.

something()에서 괄호 사이에 커서가 가있는 상태에서 Ctrl+Enter를 누르면 어떤 옵션을 넣을지 후보를 보여준다.

만일 필수로 할 것이 있으면,

  1. {}에서 빼서 그냥 파라미터로 주면 된다.
  2. 혹은 something({@required String name})과 같은 형식으로 주면 된다.

메소드

Dart에서 메소드는 1급 객체이다. 파라미터로 넘기는 등의 변수가 할 수 있는 것은 무엇이든 할 수 있다.

자바8의 메소드 레퍼런스와 흡사한 형태이다.

타입 비교

타입을 비교할 때는 is 키워드를 쓸 수 있다.

var a = 10;

if (a is int) {
	print('정수임');
} else {
	print('정수가 아님');
}

반대로 비교하고 싶다면 is! 키워드를 사용하면 된다.

타입 캐스트

타입캐스트 시에는 as 키워드를 사용한다.

var a = 10;
var b = a as double;

?? 키워드 (null 다루기)

null일 때 기본값을 주고 싶다면?

var name;
name = name ?? '기본값';

자세한 설명

Optional Chaining (null 다루기)

String name;
print(name.toLowerCase());

위와 같은 코드가 있다고 하면, 원래는 null을 참조하여 toLowerCase() 메소드를 수행하려 하기 때문에, Error 이후 프로그램의 작동이 중지되는데,

String name;
print(name?.toLowerCase());

위와 같이 작성되면, null인 경우에는 참조하지 않기 때문에 에러가 나지 않고 null이 그냥 출력된다. 물론 프로그램도 종료되지 않는다.

클래스 다루기

클래스 생성

class Person {
  String name;
  int age;
}

위와 같이 Java와 거의 똑같이 할 수 있다. 그리고 클래스를 인스턴스화 할 때는 ...

클래스 인스턴스화

void main() {
  var person = Person();
}

위와 같이 가능한데, 자바에서는 new 키워드가 필요한 반면에 Dart에서는 new 키워드를 생략할 수 있다.

클래스 생성자

class Person {
  String name;
  int age;
  
  Person(String name, int age){
    this.name = name;
    this.age = age;
  }
}

위와 같이 일반적인 Java의 방식으로도 할 수 있지만, 길고 귀찮기 때문에...

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}

위와 같은 방식으로 축약할 수 있다.

Getter Setter

클래스 내부에서 마우스 우클릭 > Generate 항목에서 만들 수 있다.

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
  String get name => '제 이름은 : $_name';
}

위와 같이 작성하면, print(person.name)의 결과가 '제 이름은 ...'의 형태가 된다.

..으로 메소드 체이닝

var person = Person()
  ..setName('홍길동')
  ..setAge(19);

위와 같이 한줄로 setName, setAge등을 불러올 수 있다.

비동기

Future networkRequest() async {
  print('네트워크 요청 시작');
	await Future.delayed(Duration(seconds: 3));
  print('네트워크 요청 끝');
}

void main() {
  print('시작');
  networkRequest();
  print('끝');
}

위와 같은 방식으로 수행할 수 있다.

프린트 순서는 시작 -> 네트워크 요청 시작 -> 끝 -> 네트워크 요청 끝 과 같은 순서로 수행된다.

Stream

Stream을 사용할 때는 StreamController라는 타입으로 변수를 하나 만든다.

StreamController _counterController = StreamController<int>();

위와 같은 형태로 선언 가능하다. Stream은 상태를 모니터링한다. 다 사용한 후에는 모니터링을 중지시키기 위해 close를 반드시 해줘야 한다.

StreamBuilderstream 파라미터에 _counterController.stream과 같은 형식으로 스트림을 넣어주면 된다.

StreamController의 값을 바꾸고 싶다면

_counterController.add(0);

위와 같은 형식으로 코드를 작성하면 된다.

StreamBuilder<int>(
	stream: _counterController.stream,
    builder: (context, snapshot){
    	return Text(
        	'${snapshot.data}',
            style: Theme.of(context).textTheme.display1
        );
    }
)

위와 같이 코드를 작성하게 되면, _counterControlleradd를 통해 들어간 값에 따라 그 부분이 재랜더링되며 화면이 바뀌는데 setState와는 차이가 있다.

setState로 화면을 재랜더링하면 build 메소드가 전체적으로 한번 재실행되는데, StreamBuilder는 딱 그 부분을 재랜더링 하기 때문에 리액트에서 memo와 느낌이 비슷하다.

Document에 보이는 주석 달기

/// 슬래시 세개짜리 주석을 달면, 클래스나 메소드를 문서화할 수 있다.

profile
대전에 있는 (주) 아이와즈에서 풀스택 웹개발자로 일하고 있는 서진규입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. Javascript를 좋아합니다.

0개의 댓글