대부분 프로그래밍 언어는 비슷한 연산자를 제공합니다. 사칙 연산자 +,-,*,/를 제공하며 대입 연산자 =, +=, -=, /=, 비교 연산자 ==, != 등을 제공합니다. 이런 연산자들은 다트 언어에서도 똑같습니다. 이번 절에서는 이런 기초 연산자를 제외하고 몇 가지 연산자를 살펴보겠습니다.
나누기 연산자 - ~/
다트에서 나누기 연산자는 /와 ~/이 있습니다. / 연산자는 나누기 결과를 실수로 반환하며, ~/ 연산자는 나누기 결과를 정수로 반환합니다. 즉, ~/ 연산 결과는 소수점 아래를 버립니다.
// 나누기 연산자
main() {
int a = 8;
print('a / 5 = ${a / 5}');
print('a ~/ 5 = ${a ~/ 5}');
}
▶ 실행 결과
a / 5 = 1.6
a ~/ 5 = 1
타입 확인과 변환 - is, as
is 연산자는 타입을 확인해 true나 false로 알려 주고, as 연산자는 타입을 바꿔 줍니다.
// 타입 확인과 캐스팅
class User {
void some() {
print("User...some()...");
}
}
main() {
Object obj = User();
// obj.some(); 오류
if (obj is User) { // 타입 확인, 자동 형 변환
obj.some();
}
Object obj1 = User();
(obj1 as User).some(); // 명시적 형 변환
}
다트에서 최상위 클래스는 Object입니다. User라는 클래스의 객체를 생성해서 Object 타입 변수에 대입했는데, 이때에는 하위에서 상위로 형 변환이므로 자동으로 이뤄집니다. 그리고 if 문에서 obj is User 처럼 is 연산자로 obj 객체가 User 타입인지를 확인합니다. 그 결과는 true입니다. 이처럼 is 연산 결과가 true이면 자동으로 형 변환이 이뤄집니다. 따라서 obj is User 구문 이후에 obj 객체가 User 타입으로 바뀌므로 obj.some() 호출에 문제가 없습니다.
또한 obj1 as User 구문은 Object 타입인 obj1 객체를 User 타입으로 바꾸는데 이렇게 상위에서 하위로 바꿀 때는 명시적 형 변환을 해야 하며 이때 as 연산자를 사용합니다.
첫 obj.some()이 오류가 나는 이유를 GPT에게 물어본 결과!!
obj는 Object 타입으로 선언되었기 때문에 User 클래스의 some() 메서드에 접근할 수 없습니다.
Dart에서는 타입 시스템이 엄격하여, Object 타입의 변수는 기본적으로 Object 클래스에 정의된 메서드들만 접근할 수 있습니다 (toString(), hashCode, ==, runtimeType 등).
obj가 실제로 User 타입의 인스턴스를 가리키고 있더라도, Dart는 타입 시스템에 의해 이를 자동으로 확인하지 않습니다.
반복해서 접근하기 - .., ?..
.. 혹은 ?.. 연산자는 같은 객체를 반복해서 접근할 때 편리하게 사용할 수 있는 캐스케이드 연산자입니다. 예를 들어 다음처럼 User 클래스를 선언했다고 가정해 보겠습니다.
// User 클래스 선언
class User{
String? name;
int? age;
some() {
print('name: $name, age: $age');
}
}
이 클래스의 객체를 생성해 멤버에 접근할 때 다음과 같은 코드를 작성할 수 있습니다.
// 객체 생성과 멤버 접근
var User = User();
user.name = 'kkang';
user.age = 10;
user.some();
그런데 같은 객체의 멤버에 여러 번 접근할 때 매번 객체 이름을 작성하는 것이 불편할 수 있습니다. 이럴 때 다음처럼 케스케이드 연산자를 사용합니다. 예에서는 ..연산자만 사용했지만 만일 Nullable 객체일 때는 ?.. 연산자를 사용합니다. 이처럼 케스케이드 연산자를 사용하면 객체의 이름을 생략할수 있어서 편리합니다.
// 캐스케이드 연산자 사용 예
User()
..name = 'kkang'
..age = 30
..some();
'Flutter' 카테고리의 다른 글
클래스와 객체 (0) | 2024.11.13 |
---|---|
실행 흐름 제어하기 (0) | 2024.11.13 |
게터와 세터 함수 (0) | 2024.11.12 |
함수 타입 인수 (0) | 2024.11.12 |
옵셔널 위치 매개변수 (0) | 2024.11.12 |