[Flutter] 스나이퍼팩토리 Flutter 중급과정 (1)

GONG·2023년 4월 22일
0
post-thumbnail

22일차 과제 링크 👉 22일차 과제

Class

  • 내가 만들고 싶은 게 무엇인지 정의
  • 클래스를 통해 생성된 결과물은 객체(Object) or 인스턴스(Instance)
  • 하나의 클래스로 여러개의 결과물을 만들 수 있음

클래스의 장점


  1. 코드의 재사용성
    코드를 반복해서 작성하지 않고, 클래스를 만들어서 필요할 때마다 재사용할 수 있음
  1. 코드의 가독성과 유지 보수
    코드가 구조화되어 있고, 클래스의 역할과 책임이 분명하게 정의되어 있기 때문에 가독성이 좋아짐
  1. 데이터 은닉성 (캡슐화)
    클래스 내부의 데이터가 외부에 노출되지 않도록 할 수 있음 (getter, setter 메소드)
  1. 상속과 다형성
    부모 클래스의 속성과 메서드를 자식 클래스가 상속받아 사용할 수 있도록 해줌 (상속)
    부모 클래스 타입으로 자식 클래스의 객체를 참조할 수 있음 (다형성)

Dart class 특징


1. Mixins

  • 다른 클래스에서 코드를 재사용하기 위해 사용

  • 다른 언어에서는 인터페이스와 비슷한 기능을 하지만 Dart에서는 믹스인이 인터페이스보다 더 강력하며 다른 클래스에서 코드를 재사용하기 위해 사용됨

    mixin MyMixin {
      void doSomething() {
        print("Doing something...");
      }
    }
    
    class MyClass with MyMixin {
      // MyClass는 MyMixin의 doSomething() 메서드를 사용할 수 있음
    }
    
    void main() {
      var myClass = MyClass();
      myClass.doSomething(); // "Doing something..." 출력
    }

2. Named constructors

  • 생성자를 특정 이름으로 정의하여 객체를 생성할 때 편리하게 사용할 수 있음

    class MyClass {
      String name;
    
      MyClass(this.name);
    
      // Named constructor
      MyClass.fromInt(int number) {
        name = number.toString();
      }
    }
    
    void main() {
      var myClass = MyClass.fromInt(10);
      print(myClass.name); // "10" 출력
    }

3. Factory constructors

  • 일반적으로 객체를 생성하고 반환하기 전에 추가적인 로직을 수행하려는 경우에 사용됨

    class MyClass {
      String name;
    
      MyClass(this.name);
    
      // Factory constructor
      factory MyClass.fromInt(int number) {
        return MyClass(number.toString());
      }
    }
    
    void main() {
      var myClass = MyClass.fromInt(10);
      print(myClass.name); // "10" 출력
    }

4. Getters and setters

  • Dart 클래스는 자체적으로 getter와 setter를 지원함

  • 객체의 속성을 읽고 쓰는 데 사용됨

    class MyClass {
      String _name;
    
      String get name => _name;
    
      set name(String value) {
        _name = value;
      }
    }
    
    void main() {
      var myClass = MyClass();
      myClass.name = "John";
      print(myClass.name); // "John" 출력
    }

5. Extension methods

  • 클래스의 기능을 확장할 수 있는 extension methods를 통해 기존 클래스에 새로운 기능을 추가할 수 있음

    extension StringExtension on String {
      String capitalize() {
        return "${this[0].toUpperCase()}${this.substring(1)}";
      }
    }
    
    void main() {
      var myString = "hello";
      print(myString.capitalize()); // "Hello" 출력
    }

클래스 구성

  • 멤버변수 해당 클래스의 속성, 객체 내에서 사용할 수 있는 변수들
  • 멤버함수 클래스의 행동, 객체 내에서 사용할 수 있는 함수들
  • 생성자 객체를 초기화하는 함수, 객체를 생성할 수 있는 생성함수

클래스 생성자 (Constructor)

  • 객체를 생성해주는 핵심 함수
  • 생성자가 없으면 객체를 생성해서 변수에 넣어주지 못함
  • 클래스명을 넣고 필수 멤버 변수를 괄호 안에 다 넣어주면 됨

이름 없는 생성자 (Unnamed constructor)

class User {
  // 멤버 변수
  String name;

  // 생성자 함수
  User(this.name);
}

void main() {
	var user1 = User('user1');  // 생성자를 통한 객체생성 및 변수에 할당
  var user2 = User('user2');  // 생성자를 통한 객체생성 및 변수에 할당
}

이름 있는 생성자 (Named constructor)

class User {
  // 멤버 변수
  String name;

  // 생성자 함수
  User.withName(String inputName) : name = inputName;
}

void main() {
	var user1 = User.withName('user1');
}

선택 매개변수

  • 함수 호출 시 선택적으로 전달할 수 있는 매개변수
  • 속성값을 명확히 나타낼 수 있음
    class User {
      // 멤버 변수
      String name;
    
      // 이름 없는 생성자 함수
      User(this.name);
    
      User.withName2({required this.name});
    }
    
    void main() {
      var user1 = User.withName2(name: 'user1');
    }
  • 클래스 만들어보기
    class User {
      String userId;
      String nickname;
      String password;
      List<User> friends;
    
      User(this.userId, this.nickname, this.password, this.friends) {
        print('${this.nickname} 생성');
      }
    
      User.createUser(String nickname, String password)
        : userId = 'newUserID',
          nickname = nickname,
          password = password,
          friends = [];
    }
    
    void main() {
      var user = User('id', '햄버거', '****', []);
    }

멤버 함수 (메소드)

  • 클래스로 만든 객체들이 사용할 수 있는 함수들
class Person {
  String name;
  int age;

  Person(this.name, this.age);

  void sayHello() {
    print("안녕하세요 나는 $age살 $name");
  }

  void incrementAge() {
    age++;
  }
}

void main() {
  var person = Person("홍길동", 12);
  person.sayHello(); // "안녕하세요 나는 12살 홍길동"

  person.incrementAge();
  person.sayHello(); // "안녕하세요 나는 13살 홍길동"
}

22일차 끝.........

profile
우와재밋다

0개의 댓글