Dart Class & Object & instance

이서혁·2023년 11월 29일
0

Dart

목록 보기
2/6
post-thumbnail

오브젝트 (object) : 현실 세계의 모든 객체

클래스 (class) : 오브젝트를 가상세계 용으로 구체화 한 것 (붕어빵 틀)

인스턴스 (instance) : 클래스를 활용 해 메모리 상에 만들어 낸 것 (붕어빵)

Class

Object의 데이터와 기능이 정의 되어 있는 설계도
Abstract class(추상클래스), Class, Polymorphism(다형성), Inheritance(상속성) 로 나눌 수 있다.

Class 구성요소

클래스와 멤버변수의 네이밍 컨벤션

Object

데이터 혹은 기능이 정의되어 있으며 프로그램상에서 다룰 수 있는 어떤 것
Interfaces, Object 로 나눌 수 있다.

🔶 Inheritance & Polymorphism

업로드중..

Class 실습 코드 1

class Person{
  var name;
  var age;
  
  Person(this.name, this.age);
  
  void printInfo(){
    print('name: $name , age: $age');
  }
}

void main() {
  var person = Person('John Doe', 30);
  person.printInfo();
}

🔶 Interface & Abstract Class

Dart 언어는 Interface를 사용하지 않는다.

🔶 Abstract Class & Mixin

Dart class는 암시적으로 인터페이스의 역할을 할 수 있다.
Dart는 Mixin을 통해 class에 기능을 추가할 수 있다.
Abstract와 인터페이스는 역할이 어느 정도 겹치기 때문에 Abstract 키워드를 사용해 원하는 메서드를 구현하도록 할 수 있다.

Class 실습 코드 2

class IronMan {
  String name;
  int powerLevel;

  IronMan(this.name, this.powerLevel);

  void shoot() {
    print('$name is shooting guns!');
  }
}

class IronManMK3 extends IronMan {
//MK3는 리펄서를 쏘고 하늘을 날수 있게 해보세요
//shoot() 메서드를 오버라이드 합니다.
//비행고도 값을 추가한뒤
//fly() 메서드를 추가하세요
  var flyheight;
  
  IronManMK3(String name, int powerLevel, this.flyheight):super(name,powerLevel);
  
  
  void shoot() {
    print('$name is shooting Laser!');
  }
  
  
  void fly() {
    print('$name is fly in $flyheight!');
  }
}

void main() {
  IronMan mk1 = IronMan("mk1", 10);

  IronManMK3 mk3 = IronManMK3("mk3", 20, 1000);

  mk1.shoot();

  mk3.shoot();
  
  mk3.fly();
}

🔶 Abstract Class 실습

Class 실습 코드 3

//추상클래스를 사용하여 IronMan Class에 method를 구현하기 
abstract class IronMan {
  var name;
  var suitColor;
  
  IronMan(this.name, this.suitColor);

  // This is an abstract method. It must be implemented by subclasses.
  void fly();

  // This is an abstract method. It must be implemented by subclasses.
  void shootLasers();

  // This is an abstract method. It must be implemented by subclasses.
  void withstandDamage();
}

//@override 구문을 사용하여 abstract method 구현
class Mark50 extends IronMan {

  Mark50(String name, String suiteColor):super(name,suiteColor);
  
  
  void fly(){
    print('$name is flying');
  }
  
  
  void shootLasers(){
    print('$name is shoot Laser!');
  }
  
  
  void withstandDamage(){
    print('$name is make huge Damage!');
  }
}

void main(){
  var mark50 = Mark50('Mark50', 'red');
  
  mark50.fly();
  mark50.shootLasers();
  mark50.withstandDamage();
}

🔶 mixin 실습

Class 실습 코드 4

mixin Flyable on Animal {
  void fly() {
    print('I am flying!');
  }
}

class Animal {
  String name;

  Animal(this.name);
}

class Bird extends Animal with Flyable {
  // Bird는 Animal의 모든 속성과 메소드를 가지며,
  // Flyable mixin에서 제공하는 fly() 메소드도 가지고 있다.

  Bird(String name) : super(name);
}

void main() {
  var bird = Bird('Bird'); // "Bird"라는 이름을 가진 Bird 객체 생성
  bird.fly(); // "I am flying!"을 출력합니다.
}

Dart Concurrency(동시 실행)

🔶 Async & Await & Future & Stream

동기성(Synchronous)은 작업을 순차적으로 실행하는 방식을 의미한다. 작업 A가 시작되면 작업 A가 완료될 때까지 기다리고, 그 다음에 작업 B를 실행하는 것이다. 즉, 작업들이 순서대로 진행되며, 이전 작업이 완료되기 전까지 다음 작업이 실행되지 않는다. 이러한 방식은 코드가 간단하고 직관적이며, 작업의 의존성을 다루기 쉽다. 하지만 작업이 완료될 때까지 대기해야 하므로 실행 시간이 길어질 수 있고, 작업이 블로킹되면 다른 작업을 처리할 수 없는 단점이 있다.

반면에 비동기성(Asynchronous)은 작업을 동시에 실행하는 방식을 의미한다. 작업 A를 실행하면 작업 A가 완료되지 않더라도 즉시 작업 B를 실행할 수 있다. 이러한 방식은 작업이 독립적으로 실행되며, 작업이 완료되지 않아도 다른 작업을 처리할 수 있다. 비동기 방식은 작업의 완료를 기다리는 동안에도 다른 작업을 처리할 수 있어 전체적인 프로그램의 성능과 응답성을 향상시킬 수 있다. 하지만 작업의 의존성을 다루기가 상대적으로 복잡하며, 동기적인 코드보다 이해하기 어려울 수 있다.
업로드중..
업로드중..
업로드중..

Dart Null Safety

🔶 Simple Null Safety

Class 실습 코드

void main() {
  
  String? name;
  
  String age = '125';
  
  if(name != null){
    print(name.length);
  } else {
    print('It is null');
  }

  print(name?.length);
 
  print(age.length);
}

Summary

· Class를 선언하고 인스턴스화 할 수 있다.
· Class 혹은 abstract Class, Mixin을 사용하여 반복되는 기능의 코드를 재사용할 수있다.
· Async, Await, Future, Stream을 사용하여 비동기 프로그래밍을 작성할 수 있다.
· Null checking operator ("?")와 정적 타입 검사로 null이 될 가능성이 있는 코드를 제거할 수 있다.

인스턴스와 클래스

인스턴스와 클래스는 완전히 다른 것이다. 혼동 하지 말자
가상 세계에서 활동하는 것은 인스턴스 (오브젝트)
인스턴스를 생성하기 위한 틀이 클래스

필드와 메소드

클래스에는 속성을 필드로, 동작을 메소드로 선언한다
final 이 붙은 필드는 상수 필드로서 값이 불변이다

클래스 타입

클래스를 정의하면, 그 클래스 타입의 변수를 선언 할 수 있다
어떤 클래스 타입 변수는 그 클래스의 인스턴스를 담을 수 있다

인스턴스화

new 연산자를 사용하여 클래스로부터 인스턴스를 생성. Dart에서 new 키워드는 생략 가능
어떤 클래스 타입 변수에 인스턴스가 담겨 있을 때 “변수명.필드명" 이나 “변수명.메소드명()” 으로
그 인스턴스의 필드나 메소드를 이용할 수 있다

레퍼런스 타입의 참조

레퍼런스 타입 변수의 안에는 “인스턴스의 정보가 담겨있는 메모리 번지"가 들어 있다
어떤 레퍼런스 타입 변수를 다른 변수에 대입하면, 주소만 복사 된다.
레퍼런스 타입은 필드나 메소드의 인수, 리턴 값의 형으로서도 이용된다

생성자

“클래스명과 동일 명칭으로, 리턴 값의 타입이 명시되어 있지 않은 메소드"는 생성자로 사용된다.
생성자는 new 에 의한 인스턴스화의 직후에 자동적으로 실행 된다. Dart 에서 new는 생략 가능
인수를 가지는 생성자를 정의하면, new 를 할 때에 인수를 지정하여 생성자를 실행할 수 있다
생성자는 오버로드에 의한 복수 정의가 된다.
클래스에 생성자 정의가 1개도 없는 경우에 한해, 컴파일러가 “인수없음, 처리내용없음"의 기본 생성자를 자동정의 해 준다.

정적 멤버

static 키워드가 붙어 있는 정적 멤버(필드 또는 메소드) 는
1. 각 인스턴스가 아닌, 클래스에 실체가 준비된다.
2. 인스턴스를 1개도 생성하지 않아도 이용 가능
정적 메소드는 그 내부에 정적이지 않은 메소드나 필드를 이용하는 것이 불가능하다

profile
hommehyuk

0개의 댓글