| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- firebase
- 단축키
- react
- JQ
- nodejs
- Clean Architecture
- printf
- abap
- scss
- Flutter
- 엡
- java
- JS
- develop
- java 콘솔 출력 차이
- LLM
- 자바 출력 방식
- npm
- println
- riverpod
- lifecycle
- unity
- 배포
- java 출력
- 자바 포맷 출력
- UI/UX
- ListView
- 자바스크립트
- DART
- 앱심사
- Today
- Total
guricode
[자취의 정석] 자취도우미 ai 챗봇 만들기, XOR, Object 키워드, Entity -클린 아키텍쳐 Domain 레이어 본문
[자취의 정석] 자취도우미 ai 챗봇 만들기, XOR, Object 키워드, Entity -클린 아키텍쳐 Domain 레이어
agentrakugaki 2025. 10. 14. 01:47
이전에 Data레이어(데이터소스,임플)를 만들었다
ai챗봇모델을 셋팅하고 외부 api를 연결했다.
Domain 레이어에서는 비즈니스 규칙을 만들것이다.
첫번째로 대화섹션의 핵심 모델인 챗봇 Entity를 만든다.
class ChatMessage {
final String role; // 'user' 또는 'assistant'
final String content;
final DateTime timestamp;
const ChatMessage({
required this.role,
required this.content,
required this.timestamp,
});
//(Firebase 저장용)
Map<String, dynamic> toJson() {
return {
'role': role,
'content': content,
'timestamp': timestamp.toIso8601String(),//DateTime.now()
};
}
//(Firebase 불러오기용)
factory ChatMessage.fromJson(Map<String, dynamic> json) {
return ChatMessage(
role: json['role'] as String,
content: json['content'] as String,
timestamp: DateTime.parse(json['timestamp'] as String),
);
}
@override
String toString() {
return 'ChatMessage(role: $role, content: $content, timestamp: $timestamp)';
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is ChatMessage &&
other.role == role &&
other.content == content &&
other.timestamp == timestamp;
}
@override
int get hashCode {
return role.hashCode ^ content.hashCode ^ timestamp.hashCode;
}
}
Map이나 Set으로 데이터를 넣을때 중복값을 비교
Map,Set은 중복값을 체크할때 객체의 hashcode로 버킷을 선택하고 같은 hashcode가 있으면 동등비교 (==)를통해 값을 비교하고 덮어쓴다.
객체는 생성될때마다 메모리 기준으로 다른 hashcode를 가진다.
같은 내용이라도 다른 객체면 다른 해시코드가 나옴...
하지만 값들은 값 기준으로 hashcode가 결정된다.
따라서 같은 내용인데 객체가 다르면 연산자로 비교했을때 false가 나올수가 있다.
그걸 방지하기 위해 객체의 해시코드를 값 XOR 값 .... 해서 값들의 XOR값으로 고정하는 작업이다.
오버로딩
오버로딩은 Object에서 연산자를 정의하는 키워드같은건데
bool operator (연산자)로 사용한다.
identical은 같은 메모리에 있는 객체인지를 판별하는 함수로 값이 같아도 객체가 다르면 false를 반환한다.
여기서 this는 연산자 == 앞에있는 값, other은 뒤에있는 값이다.
other.role == role은 other.role == this.role과 같은 의미다.
이 구현이 있으면 Set/Map키로 사용,테스트에서 값 비교 등이 직관적으로 동작한다.
hashCode
객체가 가지는 해시코드다.
여기서는 role,content,timestamp를 XOR한 값으로 hashcode를 가지게 했다.
xor은 값이 같으면 같은 값이 나온다 정도만 알고있으면된다.
'앱 > Flutter&Dart' 카테고리의 다른 글
| [Flutter] StatefulWidget의 생명주기(Lifecycle) (0) | 2025.10.19 |
|---|---|
| [Flutter] Flutter 앱에서 상태(state)란 무엇인가 (0) | 2025.10.19 |
| [Dart] 자주쓰는 Object 키워드 (예약어) (0) | 2025.10.14 |
| [자취의 정석] 자취도우미 ai 챗봇 만들기 - api연결, data레이어 작성 (0) | 2025.10.13 |
| [자취의 정석] Flutter 앱에 "전체" 카테고리 탭 추가하기: Clean Architecture 기반 구현 (0) | 2025.10.12 |