[Flutter] Dart - 클래스

최재원's avatar
Jun 19, 2025
[Flutter] Dart - 클래스

클래스

초기화 1

// 클래스 class User { String username; String password; User(this.username, this.password); } void main() { User u1 = User("ssar", "1234"); print(u1.username); print(u1.password); }
  • 가장 기본 사용법
  • 생성자의 인수를 바로 필드값으로 바인딩
  • dart 에선 생성자의 중괄호 내용을 컴파일러가 볼 수 없다 → 중괄호 내에서 초기화를 해도 컴파일러는 모르기 때문에 초기화 에러, null 에러가 발생하여 빨간줄이 생긴다

초기화2

// 클래스 class User { String username; String password; User({required this.username, this.password = "1234"}); } void main() { User u1 = User(username: "ssar"); print(u1.username); print(u1.password); }
  • 생성자의 인수를 필드값으로 바로 바인딩
  • 선택적으로 받는 방법
  • dart 에선 생성자의 중괄호 내용을 컴파일러가 볼 수 없다 → 중괄호 내에서 초기화를 해도 컴파일러는 모르기 때문에 초기화 에러, null 에러가 발생하여 빨간줄이 생긴다

초기화3

// 클래스 class User { String username; String password; User(String username, String password) : this.username = username, this.password = password == "1234" ? "5678" : password; } void main() { User u1 = User("ssar", "1234"); print(u1.username); print(u1.password); }
  • : 뒤 → 초기화 코드 작성
  • 한 줄만 가능, 그래서 삼항연산자를 사용함
  • dart 에선 생성자의 중괄호 내용을 컴파일러가 볼 수 없다 → 중괄호 내에서 초기화를 해도 컴파일러는 모르기 때문에 초기화 에러, null 에러가 발생하여 빨간줄이 생긴다

초기화4

// 클래스 class User { String username; String password; User(this.username, this.password); void init() { if (username == "ssar") { if (password == "1234") { this.password = "9999"; } } } } void hello(User u) {} void main() { hello(User("ssar", "1234")..init()); }
  • 초기화를 여러 줄 만들고 싶으면 init() 메서드 만들어서 사용
  • .. 체인방식으로 사용 가능(케스케이드연산자)
  • 변환이 필요하면 이 방식을 많이 사용한다
  • 일단 받고 내부에서 변환하자

상속

상속1

// 상속 class Burger { String name; Burger(this.name); } // is class ChickenBurger extends Burger { int price; ChickenBurger(this.price, super.name); } class CheeseBurger extends Burger { CheeseBurger(String name) : super(name); } class CheeseBurger extends Burger { String name CheeseBurger(this.name, String name) : super(name); } // 플러터의 생성자 권장 방식 void main() { Burger b1 = CheeseBurger("치즈버거"); Burger b2 = ChickenBurger(1000, "치킨버거거"); }
  • dart는 상속 객체를 초기화 할 때 자식을 먼저 초기화 다 하고 부모를 초기화 한다
  • java는 상속 객체를 초기화 할 때 부모를 먼저 초기화 다 하고 자식을 초기화 한다
  • 순서가 다른 것을 유의하자

추상클래스

abstract class Button { void good(); void hello() { print("hello"); } } class TextButton extends Button{ @override void good() { // TODO: implement good } }

생성자 오버로딩

// 상속 class Button { String text; String color; int x; int y; int width; int height; Button( this.text, { this.color = "회색", this.x = 0, this.y = 0, this.width = 200, this.height = 150, }); Button.block( this.text, { this.color = "회색", this.x = 0, this.y = 0, this.width = 100000000, this.height = 150, }); static Button inlineButton(String text) { return Button(text); } } void main() { Button basicButton = Button("로그인"); Button redButton = Button("로그인", color: "red"); Button blockButton = Button.block("회원가입"); Button inlineButton = Button.inlineButton("회원가입"); }
  • 생성자 오버로딩과 static 메서드의 사용법이 동일하다
  • 마우스를 올려 new 라고 표시되면 이름이 있는 생성자
  • 마우스를 올려 new 가 안나오면 static 메서드

컴포지션

mixin class Engine { int power = 5000; } mixin class Wheel { int size = 21; } // has class Car with Engine, Wheel {} void main() { Engine e = Engine(); Car c1 = Car(); print(c1.power); print(c1.size); }
  • 컴포지션을 mixin 과 with 으로 할 수 있다
  • 빨간색으로 칠한 부분처럼 내가 가진 것처럼 사용 가능
Share article

jjack1