Dart 문법

Dart 문법(5)

hamiric 2024. 11. 1. 12:00

## 해당 글은 강의를 들으면서 알고있던것을 적는게 아닌, 모르고 있던것을 알았을때 적어 놓은것임

 

클래스 (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