
0. DartPad

1. void main 함수
main이 있어야 실행된다.

2. 변수
변수의 type이 존재한다. print함수를 통해 출력한다.
크기가 모든게 4Byte인 reference 변수이다.
함수 안에서 실행되는데 바깥에서 실행 가능. 독립적으로
1. 타입
void main() {
int n1 = 1;
double d1 = 10.1;
bool b1 = true;
String s1 = "홍길동";
print("n1 : ${n1}");
print("d1 : ${d1}");
print("b1 : ${b1}");
print("s1 : ${s1}");
}

2. 타입
void main() {
int n1 = 1;
double d1 = 10.1;
bool b1 = true;
String s1 = "홍길동";
print("n1 : ${n1}");
print("d1 : ${d1}");
print("b1 : ${b1}");
print("s1 : ${s1}");
print(d1.runtimeType);
}

3. 타입추론
var = js의 let
값이 들어갈때 타입이 결정되므로 타입 추론이라고 한다. 따라서 값이 들어오기 전까지는 타입을 모른다.
타입이 결정되면 타입을 변경하는 것이 불가능하다. 타입을 변경하기 위해서는 캐스팅해야 된다.
Object는 부모 타입으로 모든 타입으로 받겠다는 것이기 때문에 타입 추론과는 다르다!


void main() {
// 1. 타입추론
var n1 = 1; // 타입이 int로 결정됨
// n1 = "문자열";
n1 = 3;
print(n1);
print(n1.runtimeType);
// 2. 다이나믹 (타언어 부모타입으로 받기. = Object 타입)
dynamic n2 = 1;
print(n2.runtimeType);
n2 = "문자열";
print(n2.runtimeType);
}
4. 다이나믹


다이나믹 타입의 경우 타입이 결정된 것이 아니므로 계속 변경 가능하다.
runtimeType은 다운캐스팅해서 찾아준 것이지 진짜 int와 String 타입이 아니다. Dynamic 타입이다!!!

3. 연산자
3. 조건문
1. if문
void main() {
// if문
int point = 90;
if (point >= 90){
print("A학점");
} else if (point >= 80){
print("B학점");
}else {
print("F학점");
}
}

= statement
소비자 (받아서 쓰기만 함)
2. 삼항 연산자

리턴을 한다.
expression : 값을 출력/return해줌 결과값을
표현식(값을 출력, 리턴, 결과값을 응답해주는 것)
공급자
3. null 대체 연산자
4. 함수
하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 코드의 집합
void multi(){
int n1 = 10;
int n2 = 20;
int result = n1 * n2;
print(result);
}
void main() {
multi();
multi();
multi();
}
함수 = 외부의 영향을 받지 않는다.
함수는 input과 output이 정해져있기 때문에 항상 실행하면 동일한 결과가 나와야 하는데 외부에 의존하면 동일하지 않은 결과가 나올 수 있다.
이건 함수 아님
int n2 = 20;
void multi(){
int n1 = 10;
int result = n1 * n2;
print(result);
}
void main() {
multi();
}
이건 함수 맞다
void multi(int n2){
int n1 = 10;
int result = n1 * n2;
print(result);
}
void main() {
multi(3);
}
Java에서는 클래스 내부에서
1:23:00
매개변수의 값에 따라서 동일한 값이 나오면 함수
동일X = 메서드
객체지향프로그래밍 = 함수 ? 벗어난 프로그래밍 외부의 영향을 받는
f1 = 제일 바깥에 혼자 있을 수 있는 것 = 1급 객체 = 어디서든지 호출 가능하다
유형2. 매개변수가 있는 함수
유형3. 리턴을 하는 함수
람다
이름이 없는 익명함수 = 이름이 없으면 호출 어떻게? = 여기서만 쓰려고 = 재사용X =
Q.일회성 함수가 필요한 경우 그냥 쓰면 되는데 왜 함수로 만들어서 써?
함수 = 행위
코드 나열 ≠ 행위
행위를 전달하고 싶은데 그냥 코드를 나열하면 안되고 함수 형태여야 한다.
이름이 없는 함수를 만드는 이유? - 나혼자쓸거임
행위를 전달하고 싶어서
행위를 전달하면 실행되지 않는다. 호출시에만 실행된다.
행위를 넘기면 좋은 점은 실행시에 호출된다.
콜백 함수가 필요한 경우
언젠간 자동 실행되어야 하면
버튼이 클릭되면 실행될 행위 → 행위를 전달
클릭되면 무조건 실행되니까 이름 필요X(=바인딩 되었다)
button.addEventListener(”click”, function(){
console.log(”눌렀다!”);
});
람다식 = statement
람다 expression = 리턴
statement 기능+express 기능

행위를 변수에 집어넣은 것
우변 = 이름이 없는 함수 / 이름이 없는 함수를 f1라는 변수에 집어넣은 것

dart 언어는 함수를 전달할 수 있어서 var 변수에 담을 수 잇음

f3은 함수를 가지고 있는 것 1이 아니다
1이 return되는 것일뿐

람다표현식과 그냥 함수의 차이점 = 간결함 가독성
플러터에서 내가 그린 그림이 아니라
내가 뭘 할지 넘겨줄때 함수를 전달해줘야하는데 함수의 이름이 아니라 행위를 전달하는게 편하다
ex. 달력에서 달력 행위만 전달하는게 편하다. 버튼 클릭하면
// 함수 : 람다 (이름이 없는 함수 축약)
// 익명함수
var f1 = () {
print("f1 호출됨");
};
// 람다 문장
var f2 = () => print("f2호출됨");
// 람다 표현식
var f3 = () => 1;
// 함수
int f4() {
return 1;
}
void f5() {
print("f5호출됨");
}
void main() {
f1();
}
f2에서 리턴을 하는게 아닌데 ⇒ 사용 가능 + {} 생략 가능
→ 헷갈리고 가독성 떨어지니까 사용X
익명함수+람다표현식 두 가지만 중요
f2 사용X
class Button{
// 내부적으로 필드의 디자인 들고 있음
// 클릭했을 때 뭘해야하는지 모름
void onClick(Function be){
} // 클래스 안에 존재 = 메서드 != 1급 객체
}
class CheckBox{
// 내부적으로 필드의 디자인 들고 있음
// 클릭했을 때 뭘해야하는지 모름
void onSelected(Function be){
} // 클래스 안에 존재 = 메서드 != 1급 객체
}
void lineDraw(){
print("선 그리기"); // 여기 코드가 20줄 많고 복잡
}
void main() {
Button b = Button();
b.onClick(lineDraw); // 함수의 주소를 전달 - 1급 객체니까 함수 전달 가능
CheckBox cb = CheckBox();
cb.onSelected(lineDraw);
}
()=>1; // 바로 리턴할거야
(){
} // 행위 실행할거야
(){
// 한줄
return abc;
} // 리턴이 필요한데 두 줄이 필요해
// 버튼
class Button {
// 디자인
void onClick(Function be) {
be();
}
}
class CheckBox {
// 디자인
void onSelected(Function be) {
be();
}
}
void main() {
Button b = Button();
b.onClick(() {
print("선 그리기");
});
CheckBox ch = CheckBox();
ch.onSelected(() {
print("점 그리기");
});
}
Share article