UI를 제작하는데 어려움을 느끼는 개발자들은 기본적으로 UI를 쉽게 제작해주는 툴(프레임워크)를 이용하는 것이 편리하다. 팀이 있어 분업화되어 있으면 모를까? 혼자 개발하는 경우에는 자율성을 보장해주는 개발툴 보다는 기본적으로 제공하는 컴포넌트가 많은 툴을 이용하는 것이 오히려 생산성도 좋고, 결과(제품)을 만들 수 있다.

Flutter에 대해서는 UI기반을 쉽게 만들수 있는 프로토 타입용이라고만 알고 있었지만, 이번에 혼자 책을 보면서 알아가고 있다. 책들의 내용은 기본적으로 UI를 어떻게 하면 이쁘게 뽑아낼 수 있을까? 어떻게 만들까? 하는 부분에 집중되어 있지 코딩을 자세히 알려주지 않는다. 결국 Flutter는 개발자를 위한 툴이라는 생각이 든다. 하지만 내가 정작 원하는 기능 구현을 하기 위해서는 한계나 복잡도가 높다고 하는데, 지금 당장 내가 원하는 것은 결과물을 만드는 것이라, 인내하기로 했다.

생존코딩책을 읽으면서, 기본적인 문법은 Skip하고, 나중에 참고할만한 사항을 위주로 정리하고자 한다. 그리고 이동하면서 만들 수 있기에 Github for Desktop으로 소스 관리를 하고자 한다.

* 타입검사( is, is! 키워드) : if( a is int) { } , if ( a is! int) { }
* 출력시 $를 이용하여 쉽게 표현 : print('hello $greet ');
* 출력시 $, {} 이용하여 쉽게 표현 : print('hello {_student.name}, bro'}, print('10y later , {$_age + 10} year ')
* 익명함수 : ([인수명]) { [동작 또는 반환값] } : (number) { return number%2==0; };
* 람다식 : ([인수명]) => [동작 또는 반환값]
ex ) (number) => number%2== 0; (위의 익명함수와 동일한 결과)
* 선택 매개변수 : 함수 호출시 매개변수를 {}으로 감싸 선택적으로 입력 가능
ex) void something( {String name, int age}) {}
something(name : '홍길동', age : 10); OK
something(name : '홍길동') OK
something(age : 10) OK
something() OK
* 선택 매개변수와 필수 매개변수 혼합시 필수를 먼저!!!
ex) void something( String name, {int age}) {}
something(name : '홍길동', age : 10); OK
something(name : '홍길동') OK
something(age: 10) Fail
* 선택 매개변수는 기본값 설정 가능
ex) void something( String name, {int age =10}) {}
something(name : '홍길동'); OK & age = 10
* 삼항 연산을 이용한 분기 : [조건] ? [참일 때 값] : [거짓일 때 값]
ex) age > 20 ? 'adult' : 'child'
* 접근 지정자 : 변수명 앞에 _기호를 붙이지 않으면 외부에서 접근 가능하고, 붙이면 접근 불가능(캡슐화). 어쩐지 예제들 보면, _ 기호를 붙인 예제들이 많음
ex ) person._age = 10; Fail 접근 불가
person.age = 10; OK 접근 가능
* 클래스를 생성할 때, 생성자를 만들지 않으면 기본 생성자를 사용할 수있고, 사용자 정의 생성자를 추가하면 기본 생성자를 사용할 수 없다. 다만, 사용자 정의 생성자 정의시 선택 매개변수를 사용하면 동일하게 이용 가능
ex ) class Person {
String name,
int _age;
Person ( { this.name, this._age} );
}
* 믹스인(with) : 상속하지 않고 다른 클래스의 기능을 가져오거나, 오버라이드할 수 있음
ex ) class Goblin implements Monster { }
class DarkGoblin extends Goblin with Hero { }
* Map, Set, List
* 함수를 변수에 대입 :
ex ) void greeting(String text) {
print (text);
}
var f = greeting;
f('hello');
* forEach() : ( E element ) {} 형태의 함수를 인수로 받음.
ex) items.forEach(print); // 1, 2, 3, 4, 5
items.forEach( (e) { // 1, 2, 3, 4, 5
print(e)
} );
items.forEach( (e) => print(e));
* where 조건 이용 : filter 기능
ex) items.where ( (e) => e%2 == 0).forEach(print); // 2, 4
* map : 반복되는 값을 다른 형태로 변환하는 방법 제공
ex) items.where ( (e) => e%%2 ==0).map( (e) => '숫자 $e').forEach(print);
* toList : 다트에서 함수형 프로그래밍을 지원하는 함수 대부분은 Iterable<T> 라는 인터페이스 타입 인스턴스를 반환하는데, 실제 코딩할 때는 리스트를 많이 활용함
ex ) final result = items.where ( (e) => e%2 == 0).toList();
* toSet : List에서 집합의 특성인 중복을 제거하는 방법
ex ) final result = items.where ( (e) => e%2 == 0).toSet().toList();
* any() : 리트스에 특정 조건을 충족하는 요소가 있는지 검사할 때 유용함
ex) print ( items.any((e)=> e%2==0)); // true
* 계산식 표기법(임수변수를 만드는 단계 생략)
ex) print(items..add(6)..remove(2)); // 출력시 6추가 2삭제지만, items값은 변경없음.
* 컬렉션 if : 컬렉션 내부에 if문을 이용할 수있어 소스가 간결함
ex ) print( [ 1, 2, 3, 4, 5, if (promoActive) 6] ); // promoActive 값에 따라 6 포함여부 결정
* 컬렉션 for
var listOfStrings = [
'#0',
for (var i in listOfInts) '#$i'
];
* null처리 : 컴파일러가 소스 분석해서 오류를 예측할는데, 객체의 속성 접근시 . 연산자 대신 ?. 연산자를 사용하면 객체가 null 일때, 에러를 발생하는 대신 null 반환
ex ) print (name?. length) ; 또는
print(name?. length ?? 0 ) 으로 기본값 처리 가능.
* null safety : 버전이 올라가면서 널값 체크하는 기능이 강화되어, if문으로 확실히 널값에 대한 예외처리를 해줘야 하지만, 개발자가 로직상 null이 올수 없다고 판단이 되면, . 연산자가 아니라, !. 연산자로 접근하면 문제 없음.
ex ) print(name!.length);

책은 전체적으로 입문용으로 복잡하지 않고 쉽게 기본 앱 구조에 대해 설명하고 있어 훌륭함. DB연동 등을 복잡하게 하지 않고, 페이지도 구조화하기 보다는 1source로 쉽게 접근할 수있게 구성되어 있음. 다만, Java 등 오래된 언어와 달리 Python처럼 버전에 따른 문법 변경이 있어서 인터넷에서 원인을 찾아야 할 경우가 종종 있음.
대표적인 오류가 RaisedButton 버튼이 deprecated되어 ElevatedButton 로 교체해야 하거나, Null Safety 정책으로 !. 를 이용해야 하는 경우이다.

 

 

 

 

 

Posted by 목표를 가지고 달린다
,