Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions Week1/Week1.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,3 +121,20 @@ Flutter
- named parameter : 파라미터를 중괄호로 감싸면 named parameter가 되어 이름으로 파라미터를 전달할 수 있음
- optional parameter : 파라미터를 대괄호로 감싸면 선택형 인자를 설정할 수 있음
- default parameter : = 연산자를 이용해 파라미터의 기본값을 정의할 수 있음
- 클래스
- 속성과 행위를 갖는 객체를 추상화 시킨 것
- 객체지향 프로그래밍에서의 필수 요소
- 속성은 변수, 행위는 함수와 대응
- 생성자를 사용하면 객체를 만들기 위한 코드를 줄일 수 있음
- 상속
- 객체지향 프로그래밍의 특징인 다형성을 위해 사용되는 중요한 개념
- 부모 클래스가 가지고 있는 모든 것을 자식 클래스가 물려받아 같이 공유하며 나아가 확장하는 개념
- 부모클래스는 super class, 자식클래스는 sub class라고 표현
- super
- 부모 클래스를 참조하는데 사용
- super() : 부모 클래스의 생성자를 호출
- super.메소드명 : 부모 클래스에 있는 메소드를 호출
- 단일상속
- dart언어에서는 다중 상속을 지원하지 않음
- expends 키워드를 통해 여러개의 부모 클래스를 가질 수 없음
- 오버라이딩 : 부모 클래스의 메소드를 자식 클래스에서 재정의하여 사용 가능
133 changes: 133 additions & 0 deletions Week2/Week2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# Week 2
## 1. 인터페이스 (abstract class)
### 추상 클래스
-----
- Dart에는 abstract class라는 형식의 추상 클래스를 제공
- 동작을 구현하지 않은 기능을 정의하고, 상속을 받아 실제 동작에 대한 내용을 구현(재정의)
```
abstract class Coffee { // 추상클래스 Coffee
int price = 0;
int shot = 0;

Coffee(this.shot) {
price = shot * 1000;
}

void describe() { // 완전한 메소드인 describe
print(price);
}

void description(); // 불완전한 메소드인 description
} // 추상클래스에서는 완전한 메소드와 불완전한 메소드를 모두 선언할 수 있음

class Americano extends Coffee { // 추상클래스 Coffee를 상속받은 하위 클래스 Americano
Americano(int shot) : super(shot);

@override
void description() { // 하위 클래스는 추상클래스의 불완전한 메소드를 완성시켜주어야함
print("Americano는 에스프레소에 물을 타서 희석시킨 커피입니다.");
}
}

void main() {
var americano = new Americano(2);
americano.describe();
americano.description();
}
```

### 인터페이스
-----
- Interface를 이용하면 추상클래스에 선언된 모든 함수들을 재정의 하도록 규제할 수 있고, 상속에서 불가능했던 다중상속을 가능하게 할 수 있음
- 다른 언어에서는 Interface 키워드를 사용하거나 별도의 파일에 정의하여 상속받아 사용하지만 dart에서는 일반적인 class처럼 선언해서 사용함(Implicit interfaces)
- 상속 관계는 부모-자식의 계층관계를 만들어내지만, 인터페이스의 구현(implements)은 계층관계를 만들지 않음 → implements 개념을 사용하면 어떠한 기능의 틀을 만들어 두고 각각의 클래스가 이들을 상속받도록 할 수 있음
```
abstract class Ice {
void addIce(); // 추상클래스 Ice는 불완전 함수 선언 가능
}

class BlackSugar {
void addBlackSugar(){} // 일반 클래스 BlackSugar은 완전한 함수만 선언 가능
}

abstract class Coffee {
int price = 0;
int shot = 0;

Coffee(this.shot) {
price = shot * 1000;
}

void describe() {
print("Price is $price.");
}

void description();
}

class Americano extends Coffee implements Ice, BlackSugar { // implements를 사용하여 Implicit interfaces를 사용할 수 있고, 일반 클래스도 implements가 가능
Americano(int shot) : super(shot);

@override
void description() {
print("Americano는 에스프레소에 물을 타서 희석시킨 커피입니다.");
}

@override
void addIce() {
this.price += 500;
}

@override // 일반 클래스에서 구현한 내용은 상속받은 클래스에서 사용되지 않음 → 사용하기 위해서는 "상속"또는 "추상클래스"를 활용
void addBlackSugar() { // implements를 사용하면 일반 메소드도 하위 클래스에 재정의해야함(추상 클래스를 implements 할 때도 똑같음)
this.price += 300;
}
}

void main() {
var americano = new Americano(2);
americano.description();
americano.describe();

americano.addIce();
americano.describe();

americano.addBlackSugar();
americano.describe();
}
```
## 2. 확장 (Extension)
-----
- 확장 메소드를 만들면 IDE에서 일반 메소드와 같이 확장 메소드도 같이 제안
- 사용방법 : extension \<extension name> on \<type> { (\<member definition>)* }
```
extension StringExtension on String {
String numberFormat() {
final formatter = NumberFormat("#,###");
return formatter.format(int.parse(this));
}
}

print('5000'.numberFormat());
// 5,000

print('1000000'.numberFormat());
// 1,000,000
// String 객체 뒤에 . 을 표시하고 정의한 확장 메소드인 numberFormat() 함수를 사용
```
## 3. 제네릭
-----
- 매개변수의 인자 값이 타입
- TypeScript와 같이 해당 타입의 값만 넣을 수 있는 객체가 생성됨
- 코드를 중복으로 선언하지 않아도 된다는 이점이 있음
```
List<String> colors = List(); // String타입의 값만 들어갈 수 있는 List
colors.add("Red");
```
- extends를 사용해서 특정 클래스를 지정하면 매개변수화 타입을 제한 할 수 있음 → 해당 특정 클래스와 그 클래스의 자식 클래스가 실제 타입 매개변수가 될 수 있음(다형성)
- 클래스 뿐만 아니라 메소드의 리턴타입, 매개변수를 제네릭으로 지정할 수 있음

## 4. 콜백 및 고차함수
- 함수의 매개변수에 콜백함수가 들어가는 것을 고차함수라고 함
- 고차함수의 매개변수에 들어가는 함수를 콜백함수라고 함
- 비동기처리와같이 순서가 보장되지 않는 경우, 순차적으로 작업을 실행시키기 위해서 사용
92 changes: 92 additions & 0 deletions Week3/Week3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Week 3
## 1. 플러터 개발환경 구축
### Flutter SDK 다운로드
-----
1. [링크](https://docs.flutter.dev/get-started/install/windows)에서 플러터 SDK 다운로드<br/>
![SDK Download](https://user-images.githubusercontent.com/111935711/204074861-f05b5d44-f593-4490-9df4-d3e27313b549.jpg)

2. 디렉터리 생성
- 접근 권한이 제한된 폴더 사용 지양(ex. C:\\Program Files)
- 디렉터리명을 영어로 설정

3. 환경변수 설정<br/>
![path](https://user-images.githubusercontent.com/111935711/204075180-e69649bf-ad1e-41fc-a7a8-e9006cc1091f.jpg)

4. 의존성 확인<br/>
![의존성 확인](https://user-images.githubusercontent.com/111935711/204075242-21d2c29a-49b9-4a98-baa9-a6597994c754.jpg)

### Android 설정
-----
1. [링크](https://developer.android.com/studio)에서 안드로이드 스튜디오 다운로드
2. Android Studio > Tools > Android > AVD Manager를 실행하고 Create Virtual Device를 선택

### 에디터 설정
-----
1. VS Code를 시작
2. View > Command Palette…를 호출
3. “install”를 입력하고, Extensions: Install Extensions를 선택
4. 확장 검색 필드에서 “flutter”를 입력하고, 리스트에서 Flutter를 선택한 뒤, Install을 클릭(이렇게하면 필수 Dart 플러그인도 함께 설치)<br/>
![extension](https://user-images.githubusercontent.com/111935711/204075578-d82a6e45-43f0-4730-9605-934daddb1ae1.jpg)
5. VS Code를 다시 로드하기 위해 Reload to Activate를 클릭
6. Reload to Activate을 눌러 VS Code를 다시 시작
7. 설정 확인<br/>
![test](https://user-images.githubusercontent.com/111935711/204075718-65d24e3e-4b59-4023-9ec3-4b2d4b514d0f.jpg)

## 2. 시작 프로그램 뜯어보기
### 프로젝트 생성
-----
```
# flutter create [Project Name]
flutter create first_app // 프로젝트명은 소문자와 _를 사용하는 스네이크 케이스(Snake case)를 사용
```
### 주요 폴더 및 파일
-----
1. pubspec.yaml
- Flutter 프로젝트의 메타 데이터를 정의하고 관리하는 파일(Node의 package.json과 비슷한 역할)
- 프로젝트의 버전을 관리하고, 서드파티 라이브러리나 디펜던시를 관리
2. iOS/Android/Web 폴더
- 플랫폼과 관련된 프로젝트와 파일들이 iOS 폴더와 Android 폴더에 저장
- Flutter로 앱을 개발할 때는 이 폴더안에 내용을 수정할 일이 없지만, 앱을 배포할 때는 이 폴더안에 내용들을 수정함
- 최근에는 Flutter가 Web 플랫폼도 지원하게 되었으며, Web 플랫폼을 지원하기 위한 파일과 폴더들은 Web이라는 폴더에 저장
3. lib 폴더
- Flutter 코드 베이스를 저장하는 폴더
- 이 폴더안에 있는 main.dart 파일이 Flutter 프로젝트의 시작 파일(이 파일을 기준으로 앱을 빌드하고 실행)
4. test 폴더
- lib 폴더에 Dart를 사용하여 작성한 Flutter 앱을 테스트하기 위한 코드를 저장하는 폴더


## 3. 위젯이란?
### 위젯이란?
-----
- 특정한 기능을 담당한 부품
- 앱에서 위젯은 클래스로 구현하고 이를 상속받는 다양한 위젯이 존재
- 대표적인 위젯
- Text : 앱에 텍스트를 작성
- Row, Column : flexible한 레이아웃을 만들어줌
- Stack : stack 위젯을 사용하면 수직 또는 수평으로 linearly 하게 위젯을 쌓는게 아닌 페인트를 겹겹이 칠하는 것 처럼 위젯을 구현
- Container : container 위젯은 직사각형의 visual 요소를 만들어 줌

### 위젯 구분
-----
- stateless
- 상태가 없는 위젯
- 변화가 거의 없는 위젯은 이것으로 선언한다
- statefull
- state라는 데이터 변화를 감지하고, state가 변할시 위젯을 rebuild 하는 위젯
- setState라는 함수를 통해 state변화를 감지하여야 함
- 계산기와 같이 숫자가 변화하는 뷰를 만들 경우 앱이 위젯의 상태를 보다가 위젯이 특정 상태가 될 때 알맞은 처리를 수행해야함. 즉 상태가 연결된 동적인 위젯을 statefull 위젯이라고 함
### 위젯 생명주기
-----
![widgetState](https://user-images.githubusercontent.com/111935711/204076593-8ea9e06b-d53f-4002-a66b-36b12d5227db.png)
1. 생성
- createState() 실행 : statefull widget 객체를 생성할 시 가장 먼저 실행되는 함수.(반드시 존재해야하는 함수) State를 실질적으로 만드는 작업을 수행
- buildContext를 할당 후 mounted값을 true로 바꿈 : 모든 위젯들은 mounted 속성 값을 가지고 있으며, buildContext가 정상적으로 할당되었을 경우 mounted 값은 true가 됨
- initState() 실행 : widget이 만들어진 후 가장 처음에 호출되는 함수. 생명주기 단계에서 단 한번만 호출됨
- didChangeDependencies() 실행 : initState()함수 다음에 실행되며, build() 함수가 실행되기 전 반드시 호출되는 함수. State 객체의 종속성이 바뀔 경우 실행
- build() 실행 : 화면에 보여줄 widget 객체를 리턴
2. 수정
- setState() 호출 : 데이터가 변경되었음을 알리며 buildContext에 연결된 widtet들을 새로 만듦
- didUpdateWidget() 실행 : 부모 widget이 업데이트 되었거나, 다시 build() 함수를 실행시켰을 경우 호출. 런타임 상황에서 실행되는 initState()라 생각하면 이해가 쉬움
3. 해제
- deactivate() : State객체가 widget 트리에서 제거되는 순간 호출됨
- dispose() : 모든 작업이 끝난 후 함수를 호출하여 자원을 해제
Loading