1. 연산자 오버로딩 (Operator Overloading)
1.1 연산자 오버로딩이란?
연산자 오버로딩은 우리가 일반적으로 사용하는 수학적 연산자(예: +, -, *, / 등)를 클래스에서 재정의할 수 있는 기능입니다. 이 기능을 사용하면, 객체를 더하거나 빼는 등의 연산을 클래스 내에서 정의한 대로 사용할 수 있습니다.
1.2 연산자 오버로딩 예제
예를 들어, Vector라는 2D 벡터를 나타내는 클래스를 만들고 벡터끼리 더하는 기능을 구현해 보겠습니다.
class Vector {
final double x;
final double y;
Vector(this.x, this.y);
// + 연산자 오버로딩
Vector operator +(Vector other) {
return Vector(x + other.x, y + other.y);
}
@override
String toString() => 'Vector($x, $y)';
}
void main() {
var v1 = Vector(2, 3); // (2, 3) 벡터 생성
var v2 = Vector(4, 5); // (4, 5) 벡터 생성
var result = v1 + v2; // 벡터 덧셈
print(result); // 결과: Vector(6, 8)
}
위 예제에서 Vector 클래스는 x와 y라는 두 개의 좌표를 가집니다. operator + 메서드는 두 벡터를 더하는 방법을 정의합니다. v1 + v2를 호출하면, v1과 v2의 각 좌표를 더한 새로운 벡터가 생성됩니다.
2. 메소드 체이닝 (Method Chaining)
2.1 메소드 체이닝이란?
메소드 체이닝은 객체에서 여러 메서드를 연속적으로 호출할 수 있는 방법입니다. 각 메서드는 자기 자신을 반환하여 다음 메서드 호출을 가능하게 합니다. 이를 통해 코드가 더 깔끔하고 직관적으로 보입니다.
2.2 메소드 체이닝 예제
예를 들어, 문자열을 여러 줄로 추가하는 Builder 클래스를 만들어보겠습니다.
class Builder {
String _result = ''; // 문자열을 저장할 변수
// 문자열 추가 메서드
Builder add(String value) {
_result += value; // 문자열을 추가
return this; // 자기 자신을 반환
}
// 줄 바꿈을 추가하는 메서드
Builder addLine(String value) {
_result += value + '\n'; // 줄 바꿈을 추가
return this; // 자기 자신을 반환
}
// 결과 문자열을 반환하는 메서드
String build() {
return _result;
}
}
void main() {
var builder = Builder();
var result = builder
.add('Hello') // 문자열 'Hello' 추가
.addLine('World') // 'World' 추가 후 줄 바꿈
.add('!') // 문자열 '!' 추가
.build(); // 최종 문자열을 빌드
print(result); // 결과: Hello\nWorld\n!
}
위 예제에서 Builder 클래스는 문자열을 추가하고 최종 결과를 빌드하는 기능을 제공합니다.
add와 addLine 메서드는 문자열을 추가한 후 this(자기 자신)를 반환하여 메소드 체이닝을 가능하게 합니다.
이렇게 하면 메서드를 연속적으로 호출하여 문자열을 쉽게 구성할 수 있습니다.
3. 연산자 오버로딩과 메소드 체이닝의 장점
- 연산자 오버로딩의 장점
- 직관성 향상: 연산자를 사용하여 객체 간의 연산을 직관적으로 표현할 수 있습니다.
- 코드 간결성: 복잡한 연산을 간단하게 표현할 수 있어 코드가 더 깔끔해집니다.
- 메소드 체이닝의 장점
- 코드 가독성 향상: 여러 메서드를 한 줄로 연속적으로 호출할 수 있어 코드가 더 깔끔하고 읽기 쉽습니다.
- 유연성: 객체의 상태를 단계별로 구성할 수 있어 복잡한 객체 생성 및 조작이 더 쉬워집니다.
4. 연산자 오버로딩과 메소드 체이닝의 활용
4.1 연산자 오버로딩 활용 사례
- 수학적 계산: 복잡한 수학적 계산을 수행하는 클래스에서 연산자를 오버로딩하여 직관적인 수식을 작성할 수 있습니다.
- 벡터 연산: 벡터나 행렬 같은 수학적 개념을 구현할 때 유용합니다.
4.2 메소드 체이닝 활용 사례
- 빌더 패턴: 객체의 설정을 단계별로 구성할 때 메소드 체이닝을 사용하여 가독성을 높일 수 있습니다.
- 데이터 조작: 데이터베이스 쿼리나 문자열 조작과 같은 연산에서 메소드 체이닝을 활용하여 코드를 간결하게 작성할 수 있습니다.
Dart에서 연산자 오버로딩과 메소드 체이닝은 코드의 가독성을 높이고, 사용자 정의 타입의 연산을 보다 직관적으로 처리할 수 있게 해줍니다.
연산자 오버로딩을 사용하여 클래스에서 기본 연산자를 재정의하고, 메소드 체이닝을 통해 메서드 호출을 연속적으로 연결하여 코드의 효율성과 가독성을 개선할 수 있습니다.
이 두 가지 기법을 적절히 활용하여 더 나은 코드 디자인을 구현해보세요.
구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
'Dart > Dart Programming language' 카테고리의 다른 글
[고급] Dart제네릭 프로그래밍/ 제네릭의 한계와 제약 조건 (0) | 2024.09.08 |
---|---|
[고급] Dart제네릭 프로그래밍/ 제네릭 클래스와 함수 작성 방법 - 단계별 예제와 설명 (0) | 2024.09.08 |
[중급] Dart 클래스 심화/ 팩토리 생성자와 Singleton 패턴 활용법 (1) | 2024.09.06 |
[중급] Dart 클래스 심화/Mixins와 with 키워드 활용법 (0) | 2024.09.06 |
[중급] Dart 클래스 심화/ 추상 클래스와 인터페이스 이해하기 (0) | 2024.09.06 |