brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Mar 01. 2020

다트 연산자 (Dart Operator)

플러터를 위한 다트 프로그래밍

다트의 연산자

다트는 다수의 전통적인 프로그래밍 언어에서 사용하는 기본 연산자를 동일하게 제공한다. 추가적으로 모던 언어에서 차용한 연산자도 제공하고 있다. 지금까지 살펴본 내용 중 타입 추론이나 변수, 함수의 특징에서 느꼈을지 모르겠지만 다트도 모던 언어 중 하나이다.


연산자 종류는 다음과 같다.


(산술, 할당, 관계, 논리, 비트, 시프트, 타입 검사) 연산자, 조건 표현식, 캐스케이드 표기법



다트로 프로그래밍 언어를 입문하는 사람은 거의 드물 것이라고 생각한다. 또한 여기서 다루는 내용은 플러터를 시작하기 위한 다트 프로그래밍 기본이다. 따라서 기본적인 연산자는 자세한 설명 생략하도록 하겠다.


1. 산술 연산자

거의 모든 프로그래밍에서 제공하는 기본적인 연산자이다. 말 그대로 산술을 하는 연산자이다. 종류는 다음과 같다.


+, -, *, /, ~/, %, ++, --


~/는 생소한 연산자이다. (나만 그럴지도...) 이 연산자는 정수를 결괏값으로 가진다. 따라서 % 연산자가 나머지를 구한다면~/ 연산자는 몫을 구하는 연산자이다.


다음 예제처럼 11/5를 하면 연산 결과는 2.2이다. 이때 몫은 2이고 나머지는 1이다.


2. 할당 연산자

할당 연산자의 종류는 다음과 같다. 특별할 것이 없다.


=, +=, -=, *=, /=, ~/= 등


+=는 좌항 자신의 값에 우항의 값을 더한다는 의미이다.

예를 들어 a += 1 은 a = a + 1 과 동일하다.


3. 관계 연산자 (비교 연산자)

관계 연산자는 비교 연산자라고도 한다. 조건문에서 사용한다. 조건문은 아직 다루지 않았지만 다른 언어와 크게 다를 게 없다.


==, !=, >, <, >=, <=


a == b는 a와 b가 같은지 확인하는 것이다. 같다면 참(true)이다. 아래 예제는 다르기 때문에 거짓(false)이므로 else 문으로 분기되어 a != b가 출력된다. a != b는 a와 b가 다르면 참이다.


4. 비트 & 시프트 연산자

일반적인 모바일 앱 개발을 할 때는 자주 사용할 일이 없다. 특정 로직을 수행할 때 더 빠른 속도를 낼 수 있으며 로우 레벨에서 레지스트리를 다룰 때 유용하다.


&, |, ^, ~, <<, >>


&, | ,^,~는 각각 AND, OR, XOR, NOT를 의미한다. 해당 논리 게이트의 진리표는 생략한다.


다음 예제는 비트 시프트와 AND 게이트를 다룬다. a는 3이므로 이진수로 0011이다. 이것을 왼쪽으로 1칸 비트 시프트 하면 0110이 된다. 따라서 십진수로 6이 된다. 반대로 0011에서 오른쪽으로 1칸 시프트 하면 0001이 되어 1이 출력된다. &(AND) 연산은 두 게이트가 1일 때만 1이다. 0011과 0001에서는 마지막 비트만 동일하여 0001이 된다.


5. 타입 검사 연산자

타입 검사 연산자는 다음 3종류가 있다.


as : 형 변환

is : 객체가 특정 타입이면 true

is! : 객체가 특정 타입이면 false (=특정 타입이 아니면 true)


as는 다른 타입으로 변환은 되지 않고 상위 타입으로 변환할 수 있다.

is는 특정 객체가 특정 타입이면 true이다.

is!는 특정 타입이면 false, 즉 특정 타입이 아니면 true이다.


다음 예제는 Person 클래스를 상속한 Employee 클래스와 Student 클래스를 통해 형 변환 및 타입 검사를 하는 예제이다.


위 예제에서 만약 다음과 같은 조건문이 있다면 결과는 무엇일까?


if (employee is Person) {
  print('employee is Person');
} else {
  print('employee is not Person');
}


employee 객체는 상위 타입인 Person에도 속하기 때문에 true가 된다.

따라서 employee is Person이 출력된다.


6. 조건 표현식

조건 표현식은 크게 3가지가 있다. 먼저 삼항 연산자로 익히 알고 있는 형태가 있다.


조건 ? 표현식1 : 표현식2;

ex) (a>0) ? '양수' : '음수';


if문으로 치면 다음과 같은 형태다.


if (a>0) {

return '양수';

} else {

return '음수';

}


다음은 null 체크를 편하게 해주는 조건적 멤버 접근(Conditional member access) 연산자이다. 이 연산자는 좌항이 null이면 null을 리턴하고 아니면 우항의 값을 리턴한다. (코틀린의 안전 호출 연산자와 형태와 의미가 동일하다.)


좌항?.우항

ex) employee?.name


if문으로 치면 다음과 같은 형태다.


if (employee == null) {

return null;

} else {

return employee.name;

}


마지막으로 조건적 멤버 접근 연산자보다 좀 더 훌륭한 ?? 연산자가 있다. 이 연산자는 null 체크뿐만 아니라 null일 경우에 대한 처리까지 가능하다. 좌항이 null이 아니면 좌항 값을 리턴하고 null이면 우항 값을 리턴한다. (코틀린의 ?:(앨비스 연산자) 와 같다.)


좌항 ?? 우항

ex) employee.name ?? 'new name'


if문으로 치면 다음과 같은 형태다.


if (employee.name != null) {

return employee.name;

} else {

return 'new name';

}



if문의 형태로 보면 이해가 쉽다. 다음 예제도 if문으로 생각해서 결과와 비교해보면 조건 표현식에 익숙해지는 데 도움이 될 것이다.


7. 캐스케이드 표기법

캐스케이드 표기법(..)은 한 객체로 해당 객체의 속성이나 멤버 함수를 연속으로 호출할 때 유용하다. 매번 객체를 표기하고 호출하는 불필요한 과정을 줄여주기 때문이다.


ex)

Employee employee = Employee()

..name = 'Kim'

..setAge(25)

..showInfo();


다음 예제를 보면 employee 객체를 생성한 후 캐스케이드 표기법을 이용하여 해당 객체의 name, setAge(), showInfo()에 연속적으로 접근하고 있다.


만약 캐스케이드 표기법을 사용하지 않는다면 7~9 라인과 같이 객체를 매번 표기하여 호출해야 한다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari