Dart 기본 문법(3)
Mixin
- 여러 클래스 계층에서 클래스의 코드를 재사용하는 방법이다. Mixin을 사용하게 되면 다중 상속의 문제를 해결할 수 있고 컴퍼지션을 사용하지 않고 다른 클래스의 코드를 재사용할 수 있다.
추상 클래스란?
- 추상 클래스는 추상 메서드를 가지고 있다.
추상 클래스를 사용하는 이유는 수많은 객체를 추상화하는 공통 부모를 만들 수 있기 때문이다.
- 추상 클래스 Animal을 사용하여 Dog, Cat클래스를 Animal 타입으로 묶을 수 있다. 이것을 다형성이라 한다.
다형성을 이용하여 추상 클래스의 함수를 호출했을 때 자식 클래스에서 함수를 오버라이드(무효화)하게 되면 자식의 함수가 동적으로 실행된다.
컬렉션
List
- 데이터의 중복이 가능하고 순서가 있는 자료를 담는 컬렉션이다.
- 자료는 순차적으로 index(번호)를 생성하여 쌓이게 된다. 이때 <>타입을 사용하게 되는데 제네릭 타입이라고 한다.
ex) 타입 지정 List<int> nums = [1,2,3,4];
타입추론 var nums = [1,2,3,4];
Map
- 키(key)와 값(value)의 쌍으로 이루어진 컬렉션이다.
- List는 index 번호로 값을 찾지만 Map은 키(key)로 값을 찾아낸다.
Set
- 집합을 표현하는 컬렉션이다.
- 데이터의 중복이 허용되지 않기 때문에 로또 번호 생성기 등을 만들 때 유용하게 사용할 수 있다.
- List와는 다르게 Set은 순서가 없다.
반복문
for 문
- 반목문을 작성하게 해준다.
map 함수
- 반복되는 값을 하나씩 변형하기 위해 사용한다.
map 함수 사용 예)
- 컬렉션에 담긴 데이터를 반복해서 플러터 위젯에 담고 화면에 출력할 때 사용한다.
이때 for 문을 사용하지 않는 이유은 for문은 값을 return하지 못하기 때문이다.
- 컬렉션에 담긴 데이터를 반복해서 플러터 위젯에 담는데 그 값을 조금씩 변형해야 할 때 사용한다.
- map 함수는 lterator 타입을 return 하기 때문에 끝에 toList() 함수를 추가하여 List 타입으로 반환하는 것이 좋다.
List 타입이 lterator 타입보다 활용하기 좋다.
where 연산자
- 반복되는 값에서 필요 없는 값을 필터링하거나 필요한 값을 찾을 때 사용한다.
- 조건을 필터링할 때 사용하기 때문에 컬렉션에 담긴 데이터를 삭제할 때 많이 사용한다.
스프레드 연산자
- ...연산자는 컬렉션에 담긴 데이터를 흩뿌리는(spread) 연산자이다.
- 컬렉션을 깊은 복사할 때 사용한다.
- 컬렉션에 데이터를 추가할 때 사용한다.
- 컬렉션에 특정 데이터를 수정할 때 사용한다.
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 키워드를 생성자 파라미터의 변수명 앞에 붙이게 되면 선택적 파라미터이지만 값을 무조건 받아야된다.
Null Safety(?) 적용하기