## 해당 글은 강의를 들으면서 알고있던것을 적는게 아닌, 모르고 있던것을 알았을때 적어 놓은것임
클래스 (Class)
class Person {
// 속성
String name;
int age;
// 생성자
Person(this.name, this.age);
// 메서드
void introduce() {
print('안녕 ? 나는 $age살 $name !');
}
}
예외 (Exception)
프로그램이 실행되는 동안 발생할 수 있는 예외적인 상황을 '예외' 라고 한다.
Exception에 대한 처리는 Exception 클래스를 상속받은 객체로 다룰 수 있다.
일반적으로 이 기능은, 예외를 처리할 수 있는 개발자에게 유용한 기능이며, 해당 기능을 통해 오류 상황에 대한 로그를 얻는데 유용하게 이용할 수 있다.
일반 사용자한테는 보다 친숙한 메세지를 보여줌으로써, 프로그램 오류상황에 대한 불편함을 덜어주는데 역할을 하기도 한다.
< Dart가 미리 정의해 둔 예외 >
이름 | 호출시점 |
DeferredLoadException | 필요한 시점에 로드되도록 설정한 라이브러리가 로드되지 못 했을 경우 |
FormatException | 데이터가 처리가능한 형태가 아니어서 데이터를 처리하기 어려울 경우 (타입이 다를때) |
IOException | 입출력 관련 동작 도중 발생하는 오류 |
(IOException 하위 클래스) | FileSystemException, HttpException, ProcessException, SignalException, SocketException |
" | StdinException, StdoutException, TlsException, WebSocketException 등등.. |
OSError | 운영체제 레벨에서 발생하는 오류 |
TimeoutException | 비동기 결과를 기다리는 동안 특정 시간이 초과되었을 경우 발생하는 오류 |
< 커스텀 예외 >
// 오류 상황 정의
class CustomException implements Exception {
final String msg;
CustomException(this.msg);
@override
String toString() => msg ??
}
// 사용 예시
// 함수에서 오류가 발생하면 CustomException을 호출
void printException(int num){
if (num < 0) {
throw CustomException(null);
}
print(num);
}
void main() {
try {
printException(-8);
} catch (e) {
print(e);
}
}
예외에서 사용되는 키워드
- try
try 코드 블록을 실행하는 도중 예외가 발생하면, 예외가 발생한 이후의 코드들은 실행되지 않고 catch 문으로 넘어간다!
// 해당 try 문에서 예외가 발생할 경우 코드 흐름
// 코드 1 실행 - 예외 발생 - catch문 (코드 2은 실행되지 않음)
try {
// 코드1
// 예외가 발생할 수 있는 코드
// 코드2
}
- catch
try 코드 블록이 실행하는 도중 예외가 발생했을때, 실행할 코드를 넣는 부분
try 에 예외가 없을 경우는 실행되지 않는다.
여기서 매개변수 e 는 Object 타입으로써, e 를 통해 예외 상황에 대한 정보를 확인할 수 있다.
catch (e) {
// 오류가 발생한 경우 실행되는 코드
}
- on
try 코드 블록에서 발생할 수 있는 예외 중 특정 타입의 예외를 다루기 위해 사용
try {
// 예외 발생
} on IOException catch (e) {
// ~
}
- finally
예외 발생 여부와 상관 없이 실행할 코드를 넣는 부분으로, try - catch 를 모두 거친후 실행된다.
finally {
// 예외 처리 후 실행할 코드
}
- throw
예외를 의도적으로 발생시키고 싶은 경우 사용하는 키워드
void printException(int num){
if (num < 0) {
throw CustomException(null);
}
print(num);
}
오류 (Error)
주로 프로그램 외부의 환경이나 시스템 레벨에서 발생하는 문제
프로그램이 정상적으로 작동하지 않는 심각한 문제를 주로 다룬다.
< Dart가 미리 정의해 둔 오류 >
이름 | 호출시점 |
ArgumentError | 허용되지 않는 인자를 함수에 전달했을 때 발생 |
AssertionError | 디버그 함수인 assert() 문에 매개변수에 전달하는 조건문이 거짓일 때 발생 |
RangeError | 허용되지 않는 범위의 값이 매개변수로 전달되었을 때 발생 |
IndexError | 허용되지 않는 범위의 Index값을 사용했을때 발생 |
NoSuchMethodError | 함수나 메서드를 실행할 수 없는 경우 발생 |
OutOfMemoryError | 프로그램이 시스템 메모리를 너무 많이 써서 더 이상 할당할 수 없을 때 발생 |
StackOverflowError | 스택 오버플로우가 발생했을때 발생 |
StateError | 객체의 현재 상태로는 특정 동작 수행이 불가능한 경우 발생 |
TypeError | 예상한 타입과 타입이 맞지 않은 경우 발생 |
UnsupportedError | 객체를 통해 실행될 수 없는 동작일때 발생 |
< 커스텀 오류 >
class CustomError extends Error {
final String? message;
CustomError(this.message);
@override
String toString() => message ?? 'CustomError 가 발생';
}
## 상속키워드 extends vs implemets
- extends
클래스 간의 상속 관계를 정의할때 사용하며, 부모 클래스의 모든 속성과 메서드를 자식 클래스가 모두 물려 받게 된다.
또한 자식 클래스는, 부모 클래스의 메서드를 override 할 수 있다.
단일 상속 만 가능 하기 때문에, 하나의 클래스만 상속할 수 있다.
// 부모 클래스
class Animal {
void eat() => print("Animal is eating");
}
// 자식 클래스
class Dog extends Animal {
void bark() => print("Dog is barking");
}
void main() {
Dog dog = Dog();
dog.eat();
dog.bark();
}
- implemets
인터페이스(메서드만 있는 클래스) 구현을 정의할 때 사용하며, 해당 키워드를 통해 인터페이스를 상속받은 클래스는 반드시 인터페이스에서 정의된 모든 메서드를 구현해야만 한다. 주로 특정 기능을 제공하는 역할을 수행하도록 강제할때 사용된다.
다중 상속 이 가능하므로, 여러개의 인터페이스를 하나의 클래스에서 구현할 수도 있다.
abstract class Swimmer {
void swim();
}
abstract class Flyer {
void fly();
}
class Duck implements Swimmer, Flyer {
@override
void swim() => print("Duck is swimming");
@override
void fly() => print("Duck is flying");
}
void main() {
Duck duck = Duck();
duck.swim(); // Duck is swimming
duck.fly(); // Duck is flying
}
'Dart 문법' 카테고리의 다른 글
클래스 생성자 방식 (0) | 2024.11.18 |
---|---|
Dart 문법(6) (0) | 2024.11.04 |
Dart 문법(4) (0) | 2024.10.28 |
Dart 문법(3) (0) | 2024.10.28 |
Dart 문법(2) (0) | 2024.10.28 |