_
를 변수 앞에 붙여 private으로 사용코틀린과 마찬가지로 형 변환이 엄격하다
int num1 = 10;
//double num2 = num1; //error
//type casting 필요 --> 이건 오류 .!!!
double num3 = num1 as double;
.toDouble로 해야 한다.
dynamic
타입을 사용해야만 변수 타입을 바꿀 수 있다.
dynamic h2 = "2";
print(h2);
h2 = 22.0;
둘 다 상수를 의미하지만 final은 runtime에 값이 결정되는 상수도 가능하나, const는 complie time에서 값이 지정되어야 하므로 오류가 난다.
is(같은 타입이면 true)는 코틀린과 똑같지만
is의 반대는 is! 이다.
var model = ['TV', '냉장고','에어콘'];
// !! java, kotlin은 set(index, object)로 삽입. 여긴 insert
model.add("test");
model.insert(0, "x");
배열에 값 변경할 때 set 대신 insert를 사용한다.
if, else, for, while 모두 기존 코틀린 코드와 별다른 차이 없다.
for(int i=0;i<model.length;i++){
print(model[i]);
}
// !! 탐색. for
for(String j in model){
print(j);
}
//foreach
model.forEach((element) {print(element);});
익명함수를 만들고 인자를 넣어 변수에 할당 가능하다.
var result= (num3){
return num3 % 2 == 0;
}(10);
print(result);
람다함수 역시 -> 대신 fat arrow=>
로 생성할 수 있다.
// !! 변수에 함수 assign
var test = (int i) {
return i * i;
};
print(test(10));
// !! 람다 함수. fat arrow
var test2 = (int i) => i * i ;
print(test2(20));
매개변수를 넣지 않으면 default 값을 넣어주는 선택 매개변수를 쓸 수 있다.
void showInfo(String name, int age){
print('name : ${name}, age : ${age}');
}
void showInfo1(String name, {int? age}){
print('name : ${name}, age : ${age}');
}
void showInfo3({String name ='string', int? age}){
print('name : ${name}, age : ${age}');
}
{}로 묶은 변수는 값을 주지 않으면 default 값, 혹은 nullable이면 null값이 들어가도록 할 수 있다. 선택 매개변수를 사용할 때는 age:
와 같이 사용할 매개변수의 이름과 함께 값을 할당한다.
showInfo('김길동', 28);
// showInfo(name: '김길동', age: 28);
showInfo1('나간다', age:10);
showInfo3(name :'ㅇㅇ', age : 10);
와 같이 호출한다.
showInfo1처럼 필수 매개변수와 선택 매개변수가 같이 있다면, 필수 매개변수가 무조건 앞에 와야 한다!
[]로 감싸서, 역시 입력하지 않아도 되는 변수를 뜻하는데, 선택 매개변수와 함께 쓸 수 없다. 또한 사용할 경우 변수명을 함께 입력하지 않아도 된다.
// optional paramter.. 입력해도 되고, 하지 않으면 default가 된다.
// 값을 입력할때는 기존 방식과 같이, 변수 이름 없이 입력해야 한다.
// showInfo2('홍길동');
// showInfo2('홍길동', 25);
void showInfo2( String name, [int age = 20]){
print('name : ${name}, age : ${age}');
}
함수를 값으로 취급 가능-> 변수에 함수 대입 가능
다른 함수의 인수로 함수를 전달하거나 반환받기도 가능
함수 변수 할당
void calc(int a, int b){
print(a + b);
}
void main(){
var fun = calc;
fun(4,5);
}
인자로 함수 사용
void calc2(Function(int a) f){
f(20);
}
void main(){
calc2((a){
print(a);
});
}
list 타입을 깊은복사하여 새로운 컬렉션을 만들어줌
var newList = data.toList();
print(newList);
data[0] = "algorithm";
print(newList);
data의 값을 바꿔도 newList값에는 영향이 없음.
where내의 return 값이 true인 것들만 반환한다. kotlin의 filter와 비슷한 개념
var numList = [3, 4, 5, 6];
// 결과 : 4, 6 출력됨
numList.where((e) {
print("..$e");
return e % 2 == 0;
}).forEach(print);
..3
..4
4
..5
..6
6
들어오는 값들을 원하는 다른 형태로 변환한다.
//map 사용 안한 코드
var numList1 = [3, 4, 5, 6];
// for (int i = 0; i < numList1.length; i++) {
// if (numList1[i] % 2 == 0) {
// print('결과 : ${numList1[i]}');
// }
// }
//map 사용 =============================
numList1.where((e) => e % 2 == 0).map((e) => '결과 : $e').forEach((print));
결과 : 4
결과 : 6
var numList2 = [4, 5, 6, 8, 10];
//3의 배수가 있는지 확인
var result = numList2.any((e) => e % 3 == 0);
print(result); //true 출력
값에 맞는 게 하나라도 있으면 true 반환
true
반복요소를 줄여가며 결과를 만들 때 사용.
0,1 번 index부터 시작한다.
fold
는 reduce와 달리 초기값을 주고 시작한다.
//reduce 이용 코드
var numList3 = [3, 1, 5, 2, 6, 4];
var myMax1 = numList3.reduce((v, e) {
print('v is $v e is $e');
return max(v, e);
});
print(myMax1);
v is 3 e is 1
v is 3 e is 5
v is 5 e is 2
v is 5 e is 6
v is 6 e is 4
6
new 키워드 생략 가능
자바, 코틀린과 마찬가지로 .
연산자를 사용하여 객체의 프로퍼티에 접근 가능하다.
class Teacher{
String? name;
String? _subject;
String? get subject => _subject;
set subject(sub) {
this._subject = sub;
}
}
void main(){
var stu = Student();
stu.id = '20200101';
stu.name = '홍길동';
stu.study("Android");
var tea = Teacher();
tea.name = '홍길동';
tea._subject = '하이브리드';
print(tea.subject);
}
_
를 붙이면 private이라고 했는데, 자바와 조금 다르게 같은 파일 내에서는 _
변수에 접근이 가능하다. 하지만 다른 파일에서는 접근이 불가하므로 위처럼 getter, setter을 만들어 사용한다.
선택매개변수, 옵션매개변수 등을 활용하여 생성자 생성
class Product {
String? serNo;
String? name;
//선택 매개변수 사용함
// !! 선택 매개변수 테스트 진행.
Product({String? serNo, String? name}) {
this.serNo = serNo;
this.name = name;
}
String toString() {
return 'Product{serNo: $serNo, name: $name}';
}
}
void main() {
var pro1 = Product();
print(pro1);
var pro2 = Product(serNo: "1234", name: "TV");
print(pro2);
}
Product{serNo: null, name: null}
Product{serNo: 1234, name: TV}
기본적으로 단일상속을 지원하는데 다중상속을 위해서는 with
키워드로 메서드를 오버라이딩한다.
class Fly{
void doSomething(){
print("Fly");
}
}
class Person{
void doSomething(){
print("Person");
}
}
//Teacher는 상속 받은 기능외에 Fly의 기능도
//가지고 있다.
//!! polymorphism 테스트
class Teacher extends Person with Fly{
//do Something ~
void doSomething(){
print("Teacher");
}
}
void main(){
Fly f = new Teacher();
f.doSomething();
Person p = new Teacher();
p.doSomething();
Teacher t = new Teacher();
print(f is Teacher);
print(t is Person);
print(p is Fly);
print(p is Teacher);
print(t is Fly);
t.doSomething();
}
Teacher
Teacher
true
true
true
true
true
Teacher
https://snowdeer.github.io/flutter/2020/06/13/flutter-extends-and-with/
null이 아니면 정상 수행, null 이면 에러 대신 null 반환
String? data = null;
//?. 연산자
var result = data?.length;
print(result); //null 출력됨
코틀린의 엘비스프레슬리 연산자와 유사. null 인 경우 뒤의 값을 반환
String? data1 = null;
var result1 = data1?.length ?? 0;
print(result1); //0 출력