flutter/basic

Dart 기본 문법(3)

신주봉 2022. 11. 23. 19:02

Mixin

- 여러 클래스 계층에서 클래스의 코드를 재사용하는 방법이다. Mixin을 사용하게 되면 다중 상속의 문제를 해결할 수 있고 컴퍼지션을 사용하지 않고 다른 클래스의 코드를 재사용할 수 있다. 

Mixin


추상 클래스란?

- 추상 클래스는 추상 메서드를 가지고 있다.

추상 클래스를 사용하는 이유는 수많은 객체를 추상화하는 공통 부모를 만들 수 있기 때문이다. 

동적 바인딩

- 추상 클래스 Animal을 사용하여 Dog, Cat클래스를 Animal 타입으로 묶을 수 있다. 이것을 다형성이라 한다.

다형성을 이용하여 추상 클래스의 함수를 호출했을 때 자식 클래스에서 함수를 오버라이드(무효화)하게 되면 자식의 함수가 동적으로 실행된다. 


컬렉션

List

- 데이터의 중복이 가능하고 순서가 있는 자료를 담는 컬렉션이다. 

- 자료는 순차적으로 index(번호)를 생성하여 쌓이게 된다. 이때 <>타입을 사용하게 되는데 제네릭 타입이라고 한다.

ex) 타입 지정 List<int> nums = [1,2,3,4];

      타입추론 var nums = [1,2,3,4];

List

Map

- 키(key)와 값(value)의 쌍으로 이루어진 컬렉션이다. 

- List는 index 번호로 값을 찾지만 Map은 키(key)로 값을 찾아낸다.

Map

Set

- 집합을 표현하는 컬렉션이다. 

- 데이터의 중복이 허용되지 않기 때문에 로또 번호 생성기 등을 만들 때 유용하게 사용할 수 있다. 

- List와는 다르게 Set은 순서가 없다. 

set 로또 생성


반복문

for 문

- 반목문을 작성하게 해준다.

for 문

map 함수

- 반복되는 값을 하나씩 변형하기 위해 사용한다. 

map

map 함수 사용 예)

- 컬렉션에 담긴 데이터를 반복해서 플러터 위젯에 담고 화면에 출력할 때 사용한다.

이때 for 문을 사용하지 않는 이유은 for문은 값을 return하지 못하기 때문이다.

- 컬렉션에 담긴 데이터를 반복해서 플러터 위젯에 담는데 그 값을 조금씩 변형해야 할 때 사용한다.

- map 함수는 lterator 타입을 return 하기 때문에 끝에 toList() 함수를 추가하여 List 타입으로 반환하는 것이 좋다.

List 타입이 lterator 타입보다 활용하기 좋다. 

 

where 연산자

- 반복되는 값에서 필요 없는 값을 필터링하거나 필요한 값을 찾을 때 사용한다.

- 조건을 필터링할 때 사용하기 때문에 컬렉션에 담긴 데이터를 삭제할 때 많이 사용한다. 

where

스프레드 연산자

- ...연산자는 컬렉션에 담긴 데이터를 흩뿌리는(spread) 연산자이다.

- 컬렉션을 깊은 복사할 때 사용한다.

- 컬렉션에 데이터를 추가할 때 사용한다.

- 컬렉션에 특정 데이터를 수정할 때 사용한다.

값을 가지고 있는 컬렉션 복사 / map을 가지고 있는 컬렉션 복사
컬렉션 데이터 추가 / 데이터 수정


final과 const

- final 과 const는 둘 다 상수를 선언하게 하는 키워드이다. 차이점이 있다면 final은 프로그램이 실행될 때(runtime) 값이 초기화 되지만, const는 컴파일 시점에 값이 초기화 된다.

- 컴파일 시에 초기화되기 떄문에 런타임 때 속도가 빠르다. 동일한 클래스를 객체로 여러 번 만들어야 하는 경우에 생성자 인수의 값이 동일하면 같은 객체이기 때문에 메모리에 만들어진 객체를 재사용한다. 동일한 클래스를 객체로 여러 번 만들어야 하는 경우에 생성자 인수의 값이 다르면 새로운 객체를 생성한다. 

생성자 인수의 값이 동일하기 떄문에 객체 재사용 / 셍성자 인수의 값이 다르기 떄문에 새로운 객체 생성

- hashCode 멤버변수를 사용하면 메모리의 주소를 hashCode로 변경하여 알려주게 되는데 그 코드의 값이 같다는 것은 같은 메모리를 사용한다는 뜻이다. 


Null Safety

- Dart 2.12 버전부터 Null Safety가 적용된다

- 변수 내부에 아무 값이 들어있지 않은 상태를 null상태라고 표현한다.

많은 프로그램에서 런타임 에러 가장 비중을 차지하는 에러가 null 이다.
null safety
가 적용된 코드는 null에 의한 에러를 runtime이 아닌 edit-time에 체크해서 사용자에게 알려주겠다는 의미이다.

- ? 를 클래스 뒤에 붙이면 Null Safety가 적용되어서 null을 받을 수 있는 타입이 된다.

ex) String? name = null;

- ? 를 클래스 뒤에 붙이지 않으면 Null Safety가 적용되지 않아서 null을 받을 수 없다. 

ex) String name = null; //오류

오류

- 생성자 부분의 코드는 오류가 발생한다. 그 이유는 선택적 매개변수는 값을 받을 수도 있고 받지 않을 수도 있는데 String 타입과 int 타입은 null을 허용하지 않는 타입이기 때문이다.

 

required

- required 키워드를 생성자 파라미터의 변수명 앞에 붙이게 되면 선택적 파라미터이지만 값을 무조건 받아야된다. 

required

Null Safety(?) 적용하기

Null Safety