[Dart/Flutter] 클래스(Class)와 위젯(Widget)의 정체

ryan·2021년 7월 27일
4

Dart/Flutter

목록 보기
15/21
post-thumbnail

링크

Class

Class(예, 스마트폰 설계도)에는 어떤 객체에 대한 속성(예, 액정, 카메라 모듈, 홈버튼, 스크린)과 기능(예, 전화 걸기, 사진찍기, 인터넷 검색)에 대한 정의가 들어가있어야한다. 그리고 Class에 의해 정의된 속성과 기능대로 만들어진 사물을 인스턴스(예, 스마트폰)라고 한다. Class와 인스턴스의 속성과 기능은 같지만, 고유한 숫자를 같고 있어서, 각 인스턴스는 확실하게 구별이 가능하다.

객체 vs 인스턴스

  • 객체: 메모리에 할당되어지는 순간의 클래스
  • 인스턴스: 클래스를 기반으로 만들어지는 것

정리

  1. 프로그래밍 상에서의 클래스란?
    -> 객체가 가져야 하는 속성과 기능을 정의한 내용을 담고 있는 설계도 역할. 단, 객체를 정의할 때, 기능이 항상 필요한 것은 아니라서, 기능을 정의하지않아도 문제가 되지않는다.
  2. 프로그래밍 상에서의 객체란?
    -> 클래스가 정의된 후 메모리상에 할당되었을 때 이를 객체라고 함
  3. 프로그래밍 상에서의 인스턴스란?
    -> 클래스를 기반으로 생성 됨
    -> 클래스의 속성과 기능을 똑같이 가지고 있고 프로그래밍 상에서 사용되는 대상

기본적인 클래스 정의

// 클래스명은 대문자
class Person {
  // 변수의 Data type을 지정해서 변수 선언
  String name;
  int age;
  String sex;
}

// main 함수
void main() {
  
  // 어떤 타입으로 인스턴스를 생성할 지, 지정한다 => Person 클래스 타입
  // 그리고 원하는 인스턴스 이름을 지정한다 => p1
  // 코드 해석: Person 클래스로 p1이라고 부르는 새로운 인스턴스를 생성한다.
  // p1은 Person 클래스가 가진 모든 속성을 가진다. 다양한 곳에 사용할 수 있다.
  Person p1 = new Person();
  // Person 클래스의 변수에 접근하려면 인스턴스 뒤에 '.'을 사용한다.
  p1.age = 30;
  
  // 콘솔창에 출력할 떄는 print함수를 사용
  print(p1.age); // 30
}

생성자와 관련된 함수의 구조와 기능

class Person {
  String name;
  int age;
  String sex;
}

// Dart 언어는 타입 추론을 할 수 있다
// 타입을 지정해주어야한다
// 타입 추론이 가능한데, 타입을 지정해주는 이유는
// 발생할 수 있는 오류를 방지하기위해서이다
int addNumber(int num1, int num2) {
  return num1 + num2;
}

void main() {
  Person p1 = new Person();

  print(p1.age);

  // 함수를 호출하는 방법
  addNumber(3, 4);
  
  print(addNumber(3, 4)); // 7
}

생성자의 구조와 역할

class Person {
  // 클래스에서 정의한 아래 변수들을 '멤버변수'라고 한다
  String name;
  int age;
  String sex;

  // 생성자(constructor)
  // 생성자는 인스턴스가 생성될 때, 딱 한번만 호출된다
  // argument의 변수명은 똑같이 지정하지않고, 마음대로 지정하면된다. 구분은 ','로 한다.
  // 인스턴스 생성 시, 호출 될 때, 아래 예시처럼 세 개의 argument 값을 받아야한다
  // #2. name이란 변수에 argument 값을 입력하게 되면 
  Person(String name, int age, String sex) {
    // 생성자의 body

    // #1. this를 붙이면 this.name이 Dart에게 '멤버변수'라는 것을 알려준다
    // #3. #2에서 말한 값을 '멤버변수'인 this.name에 할당해준다
    this.name = name;
    this.age = age;
    this.sex = sex;
  }
}

void main() {
  // 같은 클래스를 통해서 생성된 두 개의 인스턴스지만
  // p1과 p2는 생성자의 입력값에 따라서 다른 존재가 되었다
  Person p1 = new Person('Tom', 30, 'male');
  Person p2 = new Person('Jane', 27, 'female');

  print(p1.age); // 30
  print(p2.age); // 27
}

생성자의 argument가 10개, 100개 ... 로 많다면? named argument

class Person {
  String name;
  int age;
  String sex;

  // named argument
  // 생성자가 가지고 있는 arguments를 {}로 묶는다
  // argument는 이제 optional로 바껴서, 빈 값으로 만들어도 되고,
  // 순서도 전혀 상관이 없다
  Person({String name, int age, String sex}) {
    this.name = name;
    this.age = age;
    this.sex = sex;
  }
}

void main() {
  // argument에 직접 값을 입력해줄 수 있다.
  Person p1 = new Person(age: 30);
  Person p2 = new Person(sex: 'male');

  print(p1.age); // 30
  print(p2.sex); // male
}

클래스와 위젯의 관계

profile
👨🏻‍💻☕️ 🎹🎵 🐰🎶 🛫📷

0개의 댓글