본문 바로가기

CS/Flutter | Dart

Dart OOP - class, instance, getter, setter, private

class: 설계서 만드는 것

instance: class 통해서 실제로 결과물 만들어 내는 것

 

void main() {
  Idol blackPink = Idol(
  "블랙핑크",
  ["지수", "제니", "리사", "로제"],);
  
  print(blackPink.groupName);
  print(blackPink.members);
  blackPink.sayHello();
  blackPink.intro();
}

class Idol {
  String groupName;
  List<String> members;
  
  Idol(String groupName, List<String> members)
    : this.groupName = groupName,
      this.members = members;
  
  void sayHello() {
    print("안녕하세요. ${this.groupName}입니다.");
  }
  void intro() {
    print("저희 멤버는 ${this.members}가 있습니다.");
  }
}

공통된 부분을 설계서에 작성해두고, 변동되는 부분을 생성자의 매개변수로 주면 재사용 가능

 

void main() {
  Idol blackPink = Idol(
  "블랙핑크",
  ["지수", "제니", "리사", "로제"],);
  
  print(blackPink.groupName);
  print(blackPink.members);
  blackPink.sayHello();
  blackPink.intro();
}

class Idol {
  String groupName;
  List<String> members;
  
  Idol(this.groupName, this.members);
  
  void sayHello() {
    print("안녕하세요. ${this.groupName}입니다.");
  }
  void intro() {
    print("저희 멤버는 ${this.members}가 있습니다.");
  }
}

  Idol(String groupName, List<String> members)
    : this.groupName = groupName,
      this.members = members;

 

위 부분을 아래와 같이 간단히 수정해도 결과 같게 나옴

 

  Idol(this.groupName, this.members);

 

 

List value 이용해 하는 방법

void main() {
  Idol blackPink = Idol(
  "블랙핑크",
  ["지수", "제니", "리사", "로제"],);
  print(blackPink.groupName);
  print(blackPink.members);
  blackPink.sayHello();
  blackPink.intro();
  
  Idol bts = Idol.fromList(
  [
    "bts",
    ["RM", "뷔", "정국", "슈가", "지민", "제이홉", "진"],
  ]);
  print(bts.groupName);
  print(bts.members);
  bts.sayHello();
  bts.intro();
}

class Idol {
  String groupName;
  List<String> members;
  
  Idol(this.groupName, this.members);
  
  Idol.fromList(List values)
    : this.groupName = values[0],
      this.members = values[1];
  
  void sayHello() {
    print("안녕하세요. ${this.groupName}입니다.");
  }
  void intro() {
    print("저희 멤버는 ${this.members}가 있습니다.");
  }
}

class 선언할 때는 construct 통해 외부에서 받을 수도 있고, named construct 통해서 매개변수로 받을 수도 있음

 

 

처음 선언한 값을 마음대로 바꿀 수 없게 하기 위해 final 키워드 넣음

대부분의 경우 class의 변수를 final로 선언하는 습관을 들여 예상치 못한 버그 줄이기!

class Idol {
  final String groupName;
  final List<String> members;
  
  Idol(this.groupName, this.members);
  
  Idol.fromList(List values)
    : this.groupName = values[0],
      this.members = values[1];
  
  void sayHello() {
    print("안녕하세요. ${this.groupName}입니다.");
  }
  void intro() {
    print("저희 멤버는 ${this.members}가 있습니다.");
  }
}

 

 

const 선언 유무

void main() {
  Idol blackPink = const Idol(
  "블랙핑크",
  ["지수", "제니", "리사", "로제"],);
 
  Idol blackPink2 = const Idol(
  "블랙핑크",
  ["지수", "제니", "리사", "로제"],);

이런 식으로 const로 선언하면 같은 인스턴스가 됨

const 선언 안하면 다른 인스턴스로 구분 됨

 

 

getter: 데이터 선언할 때

setter: 데이터 가져올 때

void main() {
  Idol blackPink = Idol(
  "블랙핑크",
  ["지수", "제니", "리사", "로제"],);
  
//   print(blackPink.firstMember);
  
  blackPink.firstMember = "dami";
  print(blackPink.firstMember);
  print(blackPink.members);
}

class Idol {
  String groupName;
  List<String> members;
  
  Idol(this.groupName, this.members);
  }
  
  //getter
  String get firstMember{
    return this.members[0];
  }
  //setter
  set firstMember(String name){
    this.members[0] = name;
  }
}

blackPink.firstMember = "dami"; 해주면 

[dami, 제니, 리사, 로제] 처럼 this.members[0] 값이 바뀜

 

 

getter 사용하는 이유: 함수와 기능적인 차이는 없지만, getter는 데이터를 간단히 가공할 때 사용

함수는 로직이 많이 들어가는 형태에서 많이 사용

뉘앙스가 조금 다름

 

 

private

함수, 변수 어디든 이름 앞에 _만 붙여주면 됨

-> 외부에서 파일을 불러와도 쓸 수가 없음

     같은 파일에서만 쓸 수 있음

 


Tiny Star