lan/dart

[Dart] OOP 정리

캄춰 2023. 12. 13. 17:47
728x90
반응형
class로 만든 것이 instance
  constructor(생성자)로 파라메터를 받는 방법
    클래스 이름과 동일하게 하고 괄호 열고 닫고 하면 생성자

    class Idol {
      String name;
      List<String> members;

      // postional
      // this는 현재 클래스의 값을 가져오는 것
      Idol(String name, List<String> members):
            this.name = name,
            this.members = members;

      void sayHello() {
        print('hello~');
      }

      void introduce() {
        print('let me introduce my members~');
      }
    }

    생성자는 더욱 간결하게 생성할 수 있게 되었다.
    Idol(this.name, this.members);

    named constructor - named parameter와 비슷함
      기본 constructor > Idol(this.name, this.members);
      named Idol.fromList(List values):
        this.members = values[0],
        this.name = values[1];

    immutable 변경할 수 없도록 함
      처음 선언한 값이 바뀔 수 없도록 (private한?) final 키워드를 넣음

    생성자 constructor앞에 const를 붙여주게 되면
    한 번 선언시 바뀔 수 없고, build전 값을 알 수 있게 해줌  -> const값만 넣을 수 있음, 변동이 될 수 있는 건 넣을 수 없다. **
    const Idol();

      원래는 instance가 내용이 같아도 서로 같지 않은데
      const로 선언하면 같은 인스턴스가 된다.

        Idol blackPink = const Idol('blackpink', ['jisu', 'jenny', 'risa', 'rose']);
        Idol blackPink2 = const Idol('blackpink', ['jisu', 'jenny', 'risa', 'rose']);
        print(blackPink == blackPink2);   // true

        Idol blackPink = const Idol('blackpink', ['jisu', 'jenny', 'risa', 'rose']);
        Idol blackPink2 = const Idol('blackpink', ['jisuasdfasdf', 'jenny', 'risa', 'rose']);
        print(blackPink == blackPink2);   // false

      내부 내용이 같아야 동일한 인스턴스로 보는 것 같다...?


  [getter - setter]
    String get firstMember {  // 타입을 명시하지 않으면 dynamic타입으로 반환됨
      return this.members.first;
    }
      String getMember() {
        return this.members.first;
      }
      위와 동일한데 왜 'get'을 사용하느냐? 기능적인 차이는 없지만,
      뉘앙스의 차이가 있다.. 데이터를 가공하고 싶은 경우에 사용한다.
      위의 함수 형태는 로직이 들어가는 경우에 사용..

      // setter - 무조건 하나의 파라메터만 받을 수 있음
      // blackPink.firstMember = 'hohoh';
      set firstMember(String name) {
        this.members[0] = name;
      }

  *** private 변수
    class를 private하고 싶은 경우 '언더 스코어'를 붙인다
    class Idol -> (private) -> class _Idol
    무엇이든 앞에 '언더바'를 붙이면 private이 된다.


  inheritance 상속 : extends를 사용하여 상속을 받는다.
    상속을 하게되면 자식클래스는 부모클래스도 될 수 있다.
    하지만 부모는 자식이 될 수 없다.
    class Idol {
      // 이름
      String name;
      // 멤버 수
      int membersCount;

      Idol({
          required this.name,
          required this.membersCount
       });

        void sayName() {
          print("I'm ${this.name}");
        }

        void sayMembersCount() {
          print("My member count:${this.membersCount}");
        }
      }

      class BoyGroup extends Idol {
        // 부모클래스를 지칭하는 키워드를 알아야 함
        // 외부에서 받은 값을 전달해주는 것
        BoyGroup(String name, int membersCount): super(name: name, membersCount: membersCount);

        void sayMale() {
          print("I'm \"man");
        }
      }

      class GirlGroup extends Idol {
        GirlGroup(String name, int membersCount): super(membersCount: membersCount, name: name);

      }

  method overriding
    method란..?(function) : 클래스 내부에 있는 함수를 method라고 부른다
    override : 덮어쓰다.. 우선시하다..
      상속한 클래스의 메서드를 재정의 하는것

      @override
      class TimesTwo {
      final int number;

      TimesTwo(this.number);

      int calculate() {
        return this.number * 2;
      }
    }

    class TimesFour extends TimesTwo {
      TimesFour(int number): super(number);

      @override
      int calculate() {
        return super.number * 4;
      }
    }

      TimesTwo tt = TimesTwo(2);
      print(tt.calculate());

      TimesFour ff = TimesFour(2);
      print(ff.calculate());

      TimesTwo tf = TimesFour(2);
      print(tf.calculate());
      print(tf.runtimeType);  // TimesFour

  [static] : 인스턴스에 귀속하는 것이 아니라 클래스에 귀속된다.
    클래스에 바로 direct로 사용할 수 있음

    class Employee {
    // 알바생이 일하고 있는 건물
    static String? building;  // nullable,

    // 알바생의 이름
    final String name;

    Employee(this.name);

    void printNameAndBuild() {
      print("my name is $name, I work in ${building}'s Building");
    }

    static void printBuilding() {
      print("I work in ${building}'s Building");
    }
  }
main () {
  Employee seulgi = new Employee('seulgi');
  Employee chorong = new Employee('chorong');
  seulgi.printNameAndBuild();
  chorong.printNameAndBuild();

  // seulgi.name = 'code factory';
  Employee.building = 'o2 tower';
  seulgi.printNameAndBuild();
  chorong.printNameAndBuild();
}

my name is seulgi, I work in null's Building
my name is chorong, I work in null's Building
my name is seulgi, I work in o2 tower's Building
my name is chorong, I work in o2 tower's Building


  [interface] ... interface가 있어야지... 이것이 꽃이다..
    dart언어는 똑같이 class를 사용해서 선언한다
    interface라는 타입명을 붙이지 않고 class를 사용한다는 말

    사용하고 싶은 경우엔 'implements'를 사용해서 사용한다.

    그럼 인터페이스로 만든 클래스를 누군가 사용하지 못하도록 하려면 abstract를 붙여준다

 

 

코드 팩토리 최고.. 내가 궁금한 부분들이 적정한 타이밍에 설명해주신다. +_+ 

728x90
반응형

'lan > dart' 카테고리의 다른 글

[Dart] Mixin활용  (0) 2024.01.11
[Dart] Functional 정리  (0) 2023.12.14
[Dart] Dart다트 언어 정리  (0) 2023.12.13
[Dart] Type타입 확인  (0) 2023.12.13
[Dart] Android Studio로 Dart 콘솔 열기  (0) 2023.12.13