카테고리 없음

[Flutter] Dart 클래스

연나연 2024. 4. 30. 11:42

목차
1. 클래스 선언
2. 객체생성
3. 객체를 통해 멤버 사용
4. 생성자
5. 프라이빗 변수
6. 생성자 작성시 매개변수 작성 부분에서 멤버변수를 지정하면 전달되는 값이 멤버변수에 담긴다

 

Dart의 객체지향프로그래밍은 JAVA와 비슷하다. 고로 문법적인 부분만 좀 살펴보도록 한다.

 

1. 클래스 선언

-객체를 만들기 위해 클래스를 선언해봅시다.
-this 키워드를 사용하지 않고 name 변수에 접근하고 싶다면 해당 메서드 안에서 동일한 변수명이 없으면 ${name} 만으로 값 접근이 가능합니다.

void main(){
  // 클래스를 통해 객체를 생성한다.
  // new 키워드를 이용해 객체를 생성한다.
  var t1 = new TestClass1();
  // dart 언어 버전이 업데이트 되면서 new는 생략 가능하도록 변경되었다.
  var t2 = TestClass1();

  print("t1.member_a1 : ${t1.member_a1}");
  print("t1.member_a2 : ${t1.member_a2}");
  t1.showMember();

  print("t2.member_a1 : ${t2.member_a1}");
  print("t2.member_a2 : ${t2.member_a2}");
  t2.showMember();
}

// 클래스
// class 클래스이름
class TestClass1{
  // 맴버 변수
  // 객체를 생성해야지만 사용이 가능하다
  int member_a1 = 100;
  int member_a2 = 200;

  // 맴버 메서드
  // 객체를 생성해야지만 사용이 가능하다.
  void showMember(){
    print("member_a1 : $member_a1");
    print("member_a2 : $member_a2");
  }
}​


<출력결과>

 

2. 객체생성

객체의 주소값을 담을 변수 = new 클래스명()
new는 생략 가능하다.
객체의 주소값을 담을 변수 = 클래스명 ()

 

3. 객체를 통해 멤버 사용

멤버 변수나 메서드 사용시에는, 연산자를 통해 접근한다

 

4. 생성자

-생성자는 클래스의 인스턴스를 생성하는 메서드입니다.
생성자를 이용하여 인스턴스를 처음 만들 때 변수를 초기화할 수 있습니다.

기본 생성자
-일반적으로 생성자로 초기화 되는 내부 변수는 final로 선언한다고 합니다.
인스턴스화 한 다음에 변수의 값을 변경하는 실수를 막기 위함입니다.

void main(){
  // 생성자를 가지고 있는 클래스의 객체 생성
  var t3 = TestClass2();
  print("t3 : $t3");
  
  // 호출되는 생성자에 값을 전달한다.
  var t4 = TestClass3(100);
  print("t4.member_a1 : ${t4.member_a1}");
}

class TestClass2{
  // 생성자
  // 클래스 이름과 동일하게 작성해준다.
  TestClass2(){
    print("생성자 호출");
  }
}

// 생성자를 통해 맴버 변수에 값을 넣어준다.
class TestClass3{
  // late 을 붙혀주면 지연 초기화가 가능하다.
  // 변수에 값을 나중에 넣어줄 수 있다.
  late int member_a1;
  late int member_a2;

  // 생성자
  // this를 사용하면 맴버 변수에 접근할 수 있다.
  // 멤버 변수에 값을 담는 코드만 있는 생성자는 한 줄로 작성이 가능하다.
  /*TestClass3(member_a1){
    this.member_a1 = member_a1;
  }*/

  // 매개변수의 타입을 생략하며녀 dynamic이 된다.
  TestClass3(member_a1,member_a2) :
        this.member_a1 = member_a1,
        this.member_a2 = member_a2;
}​

 

5. 프라이빗 변수

프라이빗 변수는 변수명을 _ 기호로 시작하여 선언합니다.
일반적으로 다른 언어에서는 클래스 내부에서만 사용하도록 변수 접근을 제한을 하는 개념인데 다트에서는 같은 파일에서만 접근 가능한 변수입니다.

- private 변수를 사용하는 이유는 변수에 대한 직접적인 접근을 막아 데이터의 무결성을 보장하기 위함이다.
- 변수의 직접적인 접근을 차단하고 메서드을 통해 변수에 값을 담거나 가져올 수 있도록 만들어서 사용하는것이 일반적이다(프로퍼티)

import 'testclass100.dart';

void main(){

  var t5 = TestClass4();
  print("t5.member_a1 : ${t5.member_a1}");
  // private 변수이긴 하나 같은 파일이므로 사용이 가능하다.
  print("t5._member_a2 : ${t5._member_a2}");

  t5.showMember();

  // 다른 파일에 있는 클래스로 객체를 생성한다.
  var t100 = TestClass100();
  print("t100.test100_a1 : ${t100.test100_a1}");
  // 다른파일에 있는 클래스로 만든 객체의 private 변수는 접근이 불가능하다.
  // print("t100._test100_a2 : ${t100._test100_a2}");

  t100.test100Method1();
  // 다른 파일에 있는 클래스에 정의되어 있는 private 메서드는 사용할 수 없다.
  // t100._test100Method2();
}

class TestClass4{

  int member_a1 = 100;
  // 변수 앞에 _ 를 붙혀주면 private 변수가 된다.
  // 같은 파일에서는 자유롭게 사용이 가능하다.
  int _member_a2 = 200;
  int __member_a3 = 300;

  void showMember(){
    // 같은 클래스 내부라면 private 에도 접근이 가능하다.
    print("showMember");
    print("member_a1 : $member_a1");
    print("_member_a2 : $_member_a2");
  }
}​

 

▲main.dart
class TestClass100{
  // 일반 맴버 변수
  int test100_a1 = 100;
  // private 변수
  int _test100_a2 = 200;

  // 일반 멤버 메서드
  void test100Method1(){
    print("test100Method1");
  }

  // private 멤버 메서드
  void _test100Method(){
    print("_test100Method");
  }
}​

▲testclass100.dart

 

6. 게터 세터 (getter, setter)

게터는 값을 가져올 때, 세터는 값을 저장할 때 사용합니다.
최근 객체지향 프로그래밍에서는 변수의 값을 불변성으로 사용하기 때문에 게터는 종종 사용하나, 세터는 거의 사용하지 않는다고 합니다.

dart는 getter나 setter를 만들어주면 변수 사용하듯이 사용할 수 있다.

import 'testclass200.dart';

void main(){
  // setter/getter 사용
  var t200 = TestClass200(100, 200);

  // getter 사용
  print('t200.val1 : ${t200.val1}');
  print("t200.val2 : ${t200.val2}");

  // setter 사용
  t200.val1 = 1000;
  print('t200.val1 : ${t200.val1}');

  t200.val1 = -1000;
  print('t200.val1 : ${t200.val1}');
}​

 

▲main.dart
class TestClass200{
  // private 변수
  int _private_memberA1 = 0;
  int _private_memberA2 = 0;

  // private 변수 중 초기값이 필요한 변수들을 생성자를 통해 초기화 해준다.
  TestClass200(_private_memberA1, _private_memberA2) :
      this._private_memberA1 = _private_memberA1,
      this._private_memberA2 = _private_memberA2;

  // getter
  int get val1{
    return _private_memberA1;
  }

  int get val2{
    return _private_memberA2;
  }

  // setter
  set val1(int v1){
    if(v1>0){
      this._private_memberA1 = v1;
    }
  }
}​

▲testclass200.dart

 

6. 생성자 작성시 매개변수 작성 부분에서 멤버변수를 지정하면 전달되는 값이 멤버변수에 담긴다

void main(){

  var t500 = TestClass500(100,200);
  print("t500.memberA : ${t500.memberA}");
  print("t500.memberB : ${t500.memberB}");
}

class TestClass500{
  late int memberA;
  late int memberB;

  // TestClass500(memberA, memberB){
  //   this.memberA = memberA;
  //   this.memberB = memberB;
  // }

  // 생성자로 전달되는 값이 맴버 변수에 바로 담기게 된다.
  TestClass500(this.memberA, this.memberB);
}