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

GONG·2023년 5월 6일
0

31일차 과제 링크 👉 31일차 과제

immutable

  • 한 번 생성된 후에는 변경할 수 없는 객체
  • 값을 수정하거나 재할당할 수 없음

const

  • 컴파일 타임 상수

  • 프로그램 실행 중에 값이 결정되는 것이 아닌, 컴파일 시점에서 이미 알려진 상수 값

  • 상수를 선언하는 동안 반드시 초기화되어야 함

  • 불변성을 보장하기 때문에 같은 값을 가진 객체에 대해서는 항상 동일한 객체를 재사용

  • 예시 코드

    const int x = 5;
    const double y = 3.14;
    const String name = 'John';
    
    const List<int> numbers = [1, 2, 3];
    const Map<String, int> scores = {'Alice': 100, 'Bob': 90};

final

  • 불변 변수

  • 변수에 할당된 객체를 변경할 수 없음

  • 런타임에 값이 결정되며 변수를 선언할 때 또는 생성자에서 초기화해야 함

  • 한 번 할당된 후에는 새로운 값으로 업데이트할 수 없지만, 할당된 객체의 내부 상태는 변경될 수 있음

  • 예시 코드

    final int x = 5;
    final double y = 3.14;
    final String name = 'John';
    
    final List<int> numbers = [1, 2, 3];
    final Map<String, int> scores = {'Alice': 100, 'Bob': 90};

주의할점


  • finalconst 키워드는 변수가 불변이지만, 할당된 객체 자체가 불변하지는 않음. → finalconst로 선언된 리스트의 내부 요소는 변경될 수 있음
    final List<int> numbers = [1, 2, 3];
    numbers[0] = 10;
    finalconst로 선언된 리스트는 리스트 객체 자체에 대한 재할당을 방지하고 같은 리스트 객체를 계속 사용하도록 함. 그러나 리스트 내부의 요소는 변경될 수 있음

static

  • 클래스 멤버(속성 또는 메서드)를 정의할 때 사용되는 한정자
  • static을 사용하여 정의된 멤버는 클래스의 인스턴스와는 독립적으로 존재하며, 클래스 자체에 연결됨
  • 클래스의 정적 속성이나 클래스 수준의 유틸리티 메서드를 구현하는 데 유용함
  • 주로 공유 데이터 또는 공통 기능을 나타내는 데 사용

특징


  1. 클래스 레벨에 속한다.
    해당 클래스의 인스턴스를 생성하지 않고도 직접 접근할 수 있음
  2. 인스턴스에 종속되지 않는다.
    특정 인스턴스에 종속되지 않으므로 클래스의 모든 인스턴스에 공유됨
    → 인스턴스마다 독립적인 값이 아닌 하나의 값이 공유됨
  3. 인스턴스 멤버에 접근할 수 없다.
    클래스 자체에 속하기 때문에 인스턴스 멤버에 직접 접근할 수 없음
    → 인스턴스 멤버에 접근하려면 해당 멤버에 대한 인스턴스를 생성해야 함
  4. 클래스 이름을 통해 접근한다.
    ClassName.staticMember와 같은 형식으로 접근할 수 있음
  • 예시 코드
    class Circle {
      static const double pi = 3.14159;
      static int numberOfInstances = 0;
      
      double radius;
    
      Circle(this.radius) {
        numberOfInstances++;
      }
      
      static double calculateArea(double radius) {
        return pi * radius * radius;
      }
    }
    
    void main() {
      Circle circle1 = Circle(2.0);
      Circle circle2 = Circle(3.0);
    
      print(Circle.pi); // 클래스 이름을 통한 접근
      print(Circle.numberOfInstances); // 클래스 이름을 통한 접근
    
      double area = Circle.calculateArea(4.0);
      print(area);
    }
  • 사용 예시
    1. 페이지별 라우트를 넣어주고 관리할 때

      class LoginPage extends StatelessWidget {
      	const LoginPage({super.key});
      	static const String route = '/login';
      
      	
      	Widget build(BuildContext context) {
      		return Scaffold( ... );
      	}
      }
    2. 정적 데이터를 보관하고 싶을 때

      class AppRoutes {
      	static const String login = LoginPage.route;
      	static const String main = MainPage.route;
      	static const String signup = SignupPage.route;
      }
      Get.toNamed(AppRoutes.login);
      Get.toNamed(AppRoutes.main);
      Get.toNamed(AppRoutes.signup);

Getter, Setter

  • 클래스의 속성에 대한 접근을 제어
  • 속성에 접근할 때 추가 로직을 수행하거나 속성 값을 설정할 때 유효성을 검사할 수 있음

Getter

  • 속성의 값을 가져오는 데 사용되는 메서드, . 연산자를 사용하여 호출
  • 해당 속성을 읽기 전용으로 만듦. 클래스 외부에서 읽을 수 있지만 수정할 수는 없음
  • 해당 속성의 이름 뒤에 get 키워드를 사용하여 정의

Setter

  • 속성의 값을 설정하는 데 사용되는 메서드, 속성에 값을 할당할 때 = 연산자를 사용하여 호출

  • 해당 속성을 쓰기 전용으로 만듦. 클래스 외부에서 수정할 수 있지만 읽을 수는 없음

  • 해당 속성의 이름 뒤에 set 키워드를 사용하여 정의하고 매개변수를 받음

  • 예시 코드

    class Circle {
      double _radius;
    
      Circle(this._radius);
    
      double get radius {
        return _radius;
      }
    
      set radius(double value) {
        if (value > 0) {
          _radius = value;
        }
      }
    }
    
    void main() {
      Circle circle = Circle(2.0);
      print(circle.radius); // getter 호출
    
      circle.radius = 3.0; // setter 호출
      print(circle.radius); // getter 호출
    }

GetX Navigation

Get.to()

  • 새로운 페이지로 이동
    Get.to(NextPage());

Get.off()

  • 이전 페이지를 스택에서 제거하고 새로운 페이지로 이동
    Get.off(MainPage());

Get.offAll()

  • 이전 페이지를 모두 스택에서 제거하고 새로운 페이지로 이동
    Get.offAll(NextPage());

Get.toNamed()

  • 경로를 사용하여 페이지로 이동
    GetMaterialApp(
      home: HomePage(),
      getPages: [
        GetPage(name: '/next', page: () => NextPage()),
      ],
    )
    Get.toNamed('/next');

Get.offNamed()

  • 경로를 사용하여 이전 페이지를 스택에서 제거하고 새로운 페이지로 이동
    // MaterialApp의 routes 맵에 경로와 페이지를 매핑
    GetMaterialApp(
      initialRoute: '/',
      routes: {
        '/': (context) => HomePage(),
        '/details': (context) => DetailsPage(),
      },
    );
    // 이전 페이지를 스택에서 제거하고 '/details' 페이지로 이동
    Get.offNamed('/details');

Get.offAllNamed()

  • 이전 페이지를 모두 스택에서 제거하고 경로를 사용하여 새로운 페이지로 이동
    // MaterialApp의 routes 맵에 경로와 페이지를 매핑
    GetMaterialApp(
      initialRoute: '/',
      routes: {
        '/': (context) => HomePage(),
        '/details': (context) => DetailsPage(),
      },
    );
    // 이전 페이지를 모두 스택에서 제거하고 '/details' 페이지로 이동
    Get.offAllNamed('/details');

31일차 끝~

profile
우와재밋다

1개의 댓글

comment-user-thumbnail
2023년 5월 7일

유튜브 끄세요

답글 달기