[Dart]class - 1

한상욱·2022년 12월 21일
0

Dart문법

목록 보기
10/15
post-thumbnail

class

만약에 A라는 사람과 B라는 사람 살고있다고 하겠습니다. 둘은 이름과 나이, 그리고 직업 등등 여러가지가 같거나 다를 수 있지만, 기본적으로 둘다 사람입니다. 그리고 이둘의 프로필을 한번 나타내보겠습니다.

void main() {
  Map A = {
    'name': '철수',
    'age': 20,
    'job': 'student',
  };
  
  Map B = {
    'name': '민수',
    'age': 23,
    'job': 'teacher',
  };
}

Map 자료형을 이용하면, 이렇게 표현할 수 있습니다. 여기서 자기소개까지 추가해보겠습니다.

void main() {
  Map A = {
    'name': '철수',
    'age': 20,
    'job': 'student',
  };
  
  Map B = {
    'name': '민수',
    'age': 23,
    'job': 'teacher',
  };
  
  print("이름은 ${A['name']}이고, 나이는 ${A['age']}이며, 직업은 ${A['job']}입니다.");
  print("이름은 ${B['name']}이고, 나이는 ${B['age']}이며, 직업은 ${B['job']}입니다.");
}
>> A의 이름은 철수이고, 나이는 20이며, 직업은 student입니다.
>> B의 이름은 민수이고, 나이는 23이며, 직업은 teacher입니다.

여기까지보면 딱봐도 중복되는 부분이 많고, 프로그래밍 관점에서 국적이나 성별같은 특징을 추가하게 되면, 수정할 부분이 많아서 번거로워보입니다. 이런 상황에서 class를 사용하면, 특징들을 전달해서 인스턴스를 생성해 더욱 간단하게 나타낼 수 있게 됩니다.

class로 바꾸면

이번엔 Human이라는 class를 생성해서 표현해보겠습니다.

void main() {
  var A = Human('철수', 20, 'student');
  var B = Human('민수', 23, 'teacher');
}

class Human {
  String name;
  int age;
  String job;

  Human(this.name, this.age, this.job);
}

한눈에 보기에도, 훨씬 코드가 간결해졌습니다. 그리고 새로운 특징을 추가하고 싶으면 새로운 프로퍼티를 정의해서 추가하면 됩니다.

void main() {
  var A = Human('철수', 20, 'student', 'korea');
  var B = Human('민수', 23, 'teacher', 'korea');
}

class Human {
  String name;
  int age;
  String job;
  String country;

  Human(this.name, this.age, this.job, this.country);
}

이렇게 class로 정의된 변수들은 인스턴스라고 불립니다. 이번엔 특징인 프로퍼티에 접근해보겠습니다.

void main() {
  var A = Human('철수', 20, 'student', 'korea');
  var B = Human('민수', 23, 'teacher', 'korea');
  
  print("이름은 ${A.name}이고, 나이는 ${A.age}이며, 직업은 ${A.job}입니다.");
  print("이름은 ${B.name}이고, 나이는 ${B.age}이며, 직업은 ${B.job}입니다.");
}

class Human {
  String name;
  int age;
  String job;
  String country;

  Human(this.name, this.age, this.job, this.country);
}
>> A의 이름은 철수이고, 나이는 20이며, 직업은 student입니다.
>> B의 이름은 민수이고, 나이는 23이며, 직업은 teacher입니다.

이런 방식으로 접근할 수 있습니다. 만약 A가 나이가 들어 학교를 휴학하고 군대를 가서 군인이 되었다면, 슬프지만 직업을 변경해야겠죠??
다음과 같은 방식으로 프로퍼티 갱신이 가능합니다.

void main() {
  var A = Human('철수', 20, 'student', 'korea');
  var B = Human('민수', 23, 'teacher', 'korea');
  
  print("이름은 ${A.name}이고, 나이는 ${A.age}이며, 직업은 ${A.job}입니다.");
  print("이름은 ${B.name}이고, 나이는 ${B.age}이며, 직업은 ${B.job}입니다.");
  
  A.age ++;
  A.job = 'solider';
  
  print("이름은 ${A.name}이고, 나이는 ${A.age}이며, 직업은 ${A.job}입니다.");
}

class Human {
  String name;
  int age;
  String job;
  String country;

  Human(this.name, this.age, this.job, this.country);
}
>> A의 이름은 철수이고, 나이는 20이며, 직업은 student입니다.
>> B의 이름은 민수이고, 나이는 23이며, 직업은 teacher입니다.
>> A의 이름은 철수이고, 나이는 21이며, 직업은 solider입니다.

메소드와 파라미터

print함수로 나타낸 자기소개역시 중복된 부분이 많아서 타이핑을 하면 생산성이 떨어집니다. 이럴 때, class내부에 함수를 선언하여서 사용할 수 있는데, 이를 메소드라고 합니다. 그리고 메소드에 전달되는 값은 파라미터라고 합니다.

void main() {
  var A = Human('철수', 20, 'student', 'korea');
  var B = Human('민수', 23, 'teacher', 'korea');
  
  A.introduce();
  B.introduce();
}

class Human {
  String name;
  int age;
  String job;
  String country;

  Human(this.name, this.age, this.job, this.country);
  
  void introduce() {
    print("이름은 $name이고, 나이는 $age이며, 직업은 $job입니다.");
  }
}
>> A의 이름은 철수이고, 나이는 20이며, 직업은 student입니다.
>> B의 이름은 민수이고, 나이는 23이며, 직업은 teacher입니다.

아까와 동일한 결과를 출력하지만, 마찬가지로 코드가 훨씬 간결해졌습니다.

private member

class 내부의 프로퍼티 접근이 가능하면, 접근할 수 없도록 할 수 있지 않을까요?? 그것이 바로 private member입니다. 선언하는 프로퍼티 앞에 '_'를 붙이게 되면 외부 라이브러리에서는 절대 접근할 수 없게됩니다. 이는 파일 상단에 선언하는 전역변수 역시 마찬가지입니다. 하지만 라이브러리 내부에서는 마음껏 접근할 수 있습니다.

void main() {
  var A = Human('철수', 20, 'student', 'korea');
  var B = Human('민수', 23, 'teacher', 'korea');
  
  A.introduce();
  B.introduce();
  print(A._job); //이 라이브러리만 접근 가능. 외부에서는 X
}

class Human {
  String name;
  int age;
  String _job;
  String country;

  Human(this.name, this.age, this._job, this.country);
  
  void introduce() {
    print("이름은 $name이고, 나이는 $age이며, 직업은 $_job입니다.");
  }
}
>> A의 이름은 철수이고, 나이는 20이며, 직업은 student입니다.
>> B의 이름은 민수이고, 나이는 23이며, 직업은 teacher입니다.
>> student
profile
자기주도적, 지속 성장하는 모바일앱 개발자가 되기 위해

0개의 댓글