예외, 파일 조작, 직렬화

허준호·2025년 6월 27일
0

dart 언어 공부

목록 보기
9/16
post-thumbnail

예외

프로그램을 설계할 때 실행시에 예외 상황이 발생 할 가능성이 있는 것을 예측하여, 사전에 예외 처리가 되도록 구현해야 한다.

에러의 종류

  • 문법 에러(syntax error)
  • 실행 시 에러(runtime error)
  • 논리 에러(logic error)

에러 상황별 처리

이름syntax errorruntime errorlogic error
원인코드의 형식적 오류실행 중에 예상외의 사태가 발생하여 동작 중단기술한 처리 내용에 논리적인 오류가 존재
확인방법컴파일 시 에러실행 시 강제 종료실행 시 예상외의 값을 도출
해결방법컴파일 에러를 확인한 후 수정에러원인을 스스로 찾아서 해결

예외적인 상황들

  • 메모리 부족
  • 파일을 찾을 수 없음
  • 네트워크 통신 불가 등

일반적인 예외 처리

try {
	// 에러 도출 가능성이 있는 코드 작성
} catch(e) {
	// 에러가 발생할 때 구현할 코드 작성
	// e : 에러의 정보를 담고 있는 객체
	// switch문이나 if-else문을 이용해서 에러별 처리 코드를 작성할 수 있다
}

try-catch 예시

void main() {
	try {
	  someError(); // 1. someError 메소드 실행
	} catch (e) {
	  print(e); // 3. FormatException: '에러가 발생했다' 출력
	}
}

void someError() {
  throw FormatException('에러가 발생했다'); // 2. 강제로 FormatException 예외 발생
}

특정 예외처리 예시

try {
	someError();
} on FormatException {
	print('FormatException이 발생했습니다');
}
  • try 문에서 someError 메소드를 실행한다
  • someError 메서드 실행 후 FormatException 에러가 발생하면 on FormatException 문 실행

try-catch와 try-on 차이점

  • 둘 다 예외 처리 구현 시 이용 가능하다
  • catch문은 Error 객체를 받아와서 에러 종류에 따라 처리 코드를 구현할 수 있다
  • on문은 해당 예외가 발생한 경우에만 처리 코드를 구현할 수 있다

finally

try-catch문에서 같이 사용 가능하며, 에외 상관없이 무조건 실행되는 코드이다

try {
	// 에러 발생 가능성 있는 코드
} catch(e) {
	// 에러 처리 코드
} finally{
	// 무조건 실행되는 코드
} 

파일 조작

Dart 내 File 클래스를 통해 다양한 조작이 가능하다. 반드시 dart:io를 import 해야한다

파일 정의

File file = File('경로');

내용 쓰기

file.writeAsStringSync('내용')

내용 추가

file.writeAsStringSync('내용', mode: FileMode.append)

내용 읽기

file.readAsStringSync()

직렬화(Serialization)

JSON

시스템에서 구문 분석할 수 있는 방식으로 데이터를 저장하고 교환하기 위한 텍스트 기반 형식

  • 현재 네트워크 통신에서 가장 많이 사용되는 방식이다
  • XML에 비해 용량이 적다
  • []로 리스트, {}로 객체를 표현한다
  • 키(key): 값(value) 형태이다
{
	"이름": "홍길동",
	"나이": 30,
	"성별": "남",
	"특기": ["농구", "축구"],
	"가족관계": {"아버지": "홍판서", "어머니": "김미영"}
}

컴퓨터 세계에서 직렬화의 의미

  • 데이터 구조나 객체 상태를 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정
  • 객체를 파일의 형태 등으로 저장하거나, 통신하기 쉬운 포맷으로 변환하는 과정을 의미
  • 클래스 내부의 필드에 다른 클래스가 있다면 모두 직렬화 처리를 해 줘야 한다

toJson

객체를 Json으로 직렬화하는 메소드로서, Map<String, dynamic> 타입으로 반환한다

실제로 서버와 통신할 때에는 jsonEncode() 메서드를 사용해서 파싱해줘야 한다

class User {
	String name;
	int age;
	
	User({required this.name, required this.age});
	
	Map<String, dynamic> toJson() {
		return {"name": name, "age": age};
	}
}

fromJson

Json을 객체로 역직렬화하는 메소드이다

서버에서 받아온 json 파일을 사용할 때에는 jsonDecode() 메서드로 파싱해줘야 한다

class User {
	String name;
	int age;
	
	User({required this.name, required this.age});
	
	User.fromJson(Map<String, dynamic> json)
		: name = json['name'], age = json['age'];
}
profile
후추랑 소금 좋아하는 개발자

0개의 댓글