Flutter Study Day 2 Dart Class & Object 1

정정원·2023년 11월 29일
0

Flutter Study

목록 보기
2/17

Class

Dart는 클래스와 mixin 기반 상속을 지원하는 객체지향언어입니다. 모든 객체는 클래스의 인스턴스이고, Null을 제외한 클래스는 모두 Object에서 비롯합니다. Mixin 기반 상속이란 말은, 모든 클래스가 하나의 부모 클래스를 가지고 있지만 (최상위 클래스인 Object를 제외한) 클래스의 바디는 다양한 클래스 계층에서 재사용 될 수 있음을 의미합니다. 확장 메서드는 서브 클래스를 생성하거나, 클래스를 바꾸지 않고 클래스에 기능을 추가하는 방법입니다. 클래스 제어자를 사용하여 라이브러리가 클래스를 서브타입하는 방법을 제어할 수 있습니다.

  • class는 object (객체)를 찍어 내는 틀
  • object : 현실 세계의 모든 객체
  • class : 오브젝트를 가상 세계 용으로 구체화 한 것으로 인스턴스를 생성하기 위한 틀 (붕어빵 틀)
  • instance : 클래스를 이용해 메모리 상에 만들어 낸 것 (붕어빵)

클래스 멤버 사용법

객체들은 함수와 데이터 (각각 메서드, 인스턴스 변수)로 이루어진 멤버를 가집니다. 메서드를 호출 할 때, 객체에서 함수를 호출합니다: 메서드는 해당 객체의 함수와 데이터에 접근 할 수 있습니다.

점 (.)을 사용하여 인스턴스 변수나, 메서드를 사용한다.

var p = Point(2, 2);

// y의 값을 얻음.
assert(p.y == 2);

// p의 distanceTo() 메서드 호출.
double distance = p.distanceTo(Point(4, 4));

만약 왼쪽 피연산자가 null 일 수도 있다면, .대신 ?.을 사용한다.

// p가 non-null이라면, a의 값을 p의 y의 값으로 설정합니다.
var a = p?.y;

네이밍 컨벤션

클래스명필드명메소드명
명사단어의 맨 처음은 대문자 (pascal)Hero, MonsterInfo
명사최초 이외의 단어의 맨 처음은 대문자 (camel)level, items, itemList
동사최초 이외의 단어의 맨 처음은 대문자 (camel)attack, findWeakPoint

생성자 사용법

생성자를 사용하여 객체를 생성 할 수 있습니다. 생성자의 이름은 ClassName 또는 ClassName.identifier가 될 수 있습니다. 예를 들면, 다음의 예제에서 Point 객체를 Point()와 Point.fromJson() 생성자를 사용하여 생성합니다.

var p1 = Point(2, 2);
var p2 = Point.fromJson({'x': 1, 'y': 2});

//다음 코드는 같은 결과를 생성하지만, 생성자 이름에 선택적인 키워드인 new를 사용하였다.
var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});

몇몇 클래스는 상수 생성자를 제공한다. 상수 생성자를 사용하여 컴파일 타임 상수를 생성하고 싶다면, 생성자 이름 앞에 const를 사용하면된다.

var p = const ImmutablePoint(2, 2);
// 두개의 동일한 컴파일 타임 상수를 생성하는 것은, 하나의 동일한 인스턴스를 생성
var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);

assert(identical(a, b)); // 둘은 같은 인스턴스입니다!

//다음 코드는 같은 결과를 생성하지만, 생성자 이름에 선택적인 키워드인 new를 사용하였다.
var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});

상수 컨텍스트 (constant context) 안에서, 생성자나 리터럴 뒤의 const는 생략이 가능하다.

// 불필요한 const 키워드가 많습니다.
const pointAndLine = const {
  'point': const [const ImmutablePoint(0, 0)],
  'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
};
// 상수 컨텍스트를 만들어주는 하나의 const만 사용하면 됩니다.
const pointAndLine = {
  'point': [ImmutablePoint(0, 0)],
  'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};

상수 생성자가 상수 컨텍스트의 밖에 존재하고 const 없이 호출되면, 상수가 아닌 객체 (non-constant object) 가 생성된다.

var a = const ImmutablePoint(1, 1); // 상수를 생성합니다
var b = ImmutablePoint(1, 1); // 상수를 생성하지 않습니다.

assert(!identical(a, b)); // 둘은 같은 인스턴스가 아닙니다!

객체 타입 검출

런타임에서 객체의 타입을 얻고 싶다면, Type 객체를 반환하는 Object의 프로퍼티인 runtimeType을 사용하세요.

print('The type of a is ${a.runtimeType}');

객체의 타입을 테스트하려면, runtimeType 대신 타입 테스트 연산자를 사용하기를 권장한다. 프로덕션 환경에서, object is Type 테스트가 object.runtimeType == Type 테스트 보다 더 안전하다.

0개의 댓글