코드먹방

[플러터 첫 시작]Do it! 깡샘의 플러터 & 다트 4~5장 정리

by codeEater

4장 데이터 타입과 널 안전성

책의 내용 중 몰랐던 부분이나 중요하다고 생각되는 부분을 위주로 정리할 예정이다.

추가적으로 책 외의 내용은 

변수 | Dart (dart-ko.dev)

 

변수

Dart의 변수에 대해 학습합니다.

dart-ko.dev

해당 사이트를 참고해서 작성할 예정이다.

 

플러터 타입 클래스

기본적인 타입 클래스는 다른 언어와 유사하게 

bool, double, int, num, String 등이 있다.

이 중 num은 double과 int의 상위 클래스이다.

 

 

 

int와 double의 형변환은 서로 불가능하지만 num 타입을 통해 형변환을 하면 가능하다.

 

int와 double의 경우

 

num으로 지정한 경우

 

 

플러터의 변수, 상수

플러터의 타입 유추형 변수는 vardynamic타입이 있다.

 

var 타입은 초기 선언된 타입에 따라 결정되고 초기 선언을 하지 않으면 dynamic과 동일하다.

main () {
	var no = 10;
	no = 20;
	no = 'hi';
}

위 경우는 no가 int로 예상이 되어 오류가 발생한다.

 

main () {
	var no2;
    no2 = 10;
    no2 = 'hi';
}

위 경우는 var의 초깃값을 대입하지 않아 dynamic과 동일하게 적용되어 오류가 발생하지 않는다.

 

dynamic 타입은 var와 유사하게 타입을 지정하지 않고 쓸 수 있으며 초깃값과 상관없이 모든 타입 대입이 가능하다.

 

그 외 타입

컬렉션 타입으로 주로 쓰는 List, Set, Map이 있지만 다른 언어들과 유사하여 설명을 추가하진 않겠다.

 

널 안정성 (Null Safety)

플러터는 기본적으로 null 값에 대한 safety를 다룰 수 있게 한다. 

다른 언어를 다루다보면 null pointer exception 이라는 오류를 자주 접하게 되는데 이를 방지하고자 할 때 유용할 것으로 보인다.

 

main () {
	int? a = 10;
    a = null; 
    
    int b = 10;
    b = null; //오류
    
    var? c = null; //오류
    var d = null;
    
    var e;
}

기본적으로 변수 타입 우측에 ?를 통해 nullable로 할지 말지를 지정할 수 있다.

 

var 타입, dynamic 타입의 경우를 보면 var 타입은 기본적으로 타입을 추측하기에 nullable이 적용되지 않는다.

하지만 dynamic 타입의 경우는 nullable 타입이다.

 

따라서 var타입은 nullable 선언이 되지 않으며 초깃값으로 null을 대입할 경우

dynamic 타입으로 전환되어 nullable이 가능하다.

 

5장 함수와 제어문

다트의 함수는 오버로딩을 제공하지 않는다.

그 이유는 다트는 옵셔녈 매개변수를 제공하기 때문이다. (추후 설명할 예정)

class MyClass {
	void add(int a,int b){
    }
   	void add(int a){ //함수 이름 중복 오류
    }
}

 

1줄짜리 함수는 arrow function을 통해 사용한다.

void printHello() => print('hello');

 

 

명명된 매개변수

void add(int a, {int b}){
	
}

main () {
	add(1,3); //오류
    add(1, b: 3); //성공
}

위와 같이 함수 매개변수에 {}를 통해 이름을 선언하고 무조건 해당 이름을 통해 데이터값을 전달해야한다.

 

옵셔널 매개변수

void add(int a,[int b, String sign='+']){
}

main(){
	add(1); //성공
    add(1,b:3,sign:'-'); //오류
    add(1,3,'-') //성공 
}

옵셔녈 매개변수는 일반 값은 생략해선 안 되고, 이름을 전달하면 오류가 난다. 또한 타입이 맞지 않아도 오류가 난다.

 

명명된 매개변수 vs 옵셔녈 매개변수

- 반드시 변수의 이름이 들어갈 경우 (헷갈림 방지) -> 명명된 매개변수 

- 추가적인 옵션을 위해 사용할 경우 (보통 overload 경우) -> 옵셔녈 매개변수

 

getter와 setter 함수

게터와 세터는 어떤 데이터를 가져오거나 변경하는 함수로 쓰이며, 변수처럼 사용한다

String get test {
	return _test.toUpperCase();
}

String set test (value){
	_test = value;
}

_로 시작하는 변수명은 private 즉 해당 라이브러리에서만 공유가 된다는 명명 규칙이 있다. //추후 다룰 수 있으면 다룰 예정

 

main(){
	test = 'hi';
    print('hi: $hi');
}

위와 같이 test get set를 사용할 경우 출력 결과는 'HI'로 나온다.

 

흐름 제어문

다트의 흐름 제어문은 반복, switch case, 예외 처리 등이 있다.

 

반복문은 java와 비슷하게 

for (var i =0; i< 5; i ++) {}

과 같이 쓴다.

 

또는 리스트나 특정 범위가 지정된 변수를 사용한다면

var list = [1,2,3];
for (var x in list){}

in 을 통해 간략하게 사용할 수 있다.

 

switch case의 경우

swtich(a){
	case 1:
    	print('hi');
    case 2:
    	print('bye');
        break;
}

위와 같이 첫 번째 문에 break, continue, return, throw 등과 같은 흐름 제어가 없다면 다음 case가 실행되는 게 아닌

오류가 발생한다.

 

try catch의 경우 

main(){
	try{
    	print('test');
    }on FormatException catch(e){
    	print('format test: $e');
	} finally {
    	print('final');
	}
}

 

try on (catch) finally로 사용하며 타 언어의 try catch문과 내부 구조 및 사용은 동일하다.

블로그의 정보

코드먹방

codeEater

활동하기