Christmas Pikachu Dart (접근제어 지시자, getter / setter, 상속 & 다형성, Maxin(with), 생성자)
개발일지/Dart

Dart (접근제어 지시자, getter / setter, 상속 & 다형성, Maxin(with), 생성자)

ZI_CO 2022. 11. 7.

 + 의 기능

- 문자열 + 문자열은 가능하다 ( 단, -, * , / 은 불가능)

- 서로 다른 데이터 표기를 더하기 위해서는 $ { } 사용!

(다만 점 연산자 사용시 축약이 불가능하다)

void main(){

  String name1 ='홍길동';
  String name2 ='이순신';

  print(name1 + name2);

  print('${name1} ${name2}');
  print('$name1 $name2');
  print('${name1.runtimeType} $name2.runtimeType');
}

 

 

 

 

null

nullable ( ?를 사용해서 나타냄 )
non-nullalbe
변수가 null이 될 수 있다.
변수가 null이 될 수 없다.
null 이란 ? 아무런 값도 없는 것
만약 변수에 !를 붙인다면 null이 아니라는 것을 의미하므로 null값이 들어오면 오류~
 
void main(){

  //nullable - 변수가 null이 될 수 있다.
  //non-nullable - 변수가 null이 될 수 없다.
  // null - 아무런 값도 없다.

  String name = '텐코딩';
  // name = null; // 컴파일 시점에 오류 (불가능)

  String? name3 = '홍길동';
  // 타입을 지정 할 수 있고, null도 사용가능하다
  name3 = null; //?를 사용하여 null 허용시킴
  print(name3);
  // print(name3!);
  // ! : 여기 값은 반드시 null이 아니야라는 의미임
  // 현재 null이므로 오류 발생
}

 

 

 

 

캡슐화 / 추상화

캡슐화
어떤 객체가 어떠한 목적을 수행하기 위해
데이터 (멤버 변수)와 기능 (메서드)을 적절하게 모으는 과정
추상화
어떤 객체에 공통된 데이터와 메서드를 묶어서 이름을 부여하는 것
즉, 공통 속성을 추출해 나가는 과정을 추상화라고 한다.
 

 

 

 

 

 

[접근 제어 지시자]

Dart에서 접근 제어 지시자는 딱 2가지 종류이다

1. public
2. private
기본적으로 아무런 키워드가 없을 경우 public
private 멤버의 접근 범위는 동일 클래스가 아니라
라이브러리 기준이다 (자바로는 패키지 기준)
다른 패키지를 불러오려면
import 선언을 해주어야한다.
private으로 선언하기 위해서는
변수나 메서드 앞에 _(밑줄)을 붙여야한다.
대상은 클래스, 메서드(함수), 변수 이다
접근 지시자의 연관된 개념은 내부 정보를 공개하거나 하지 않는 정보 은닉 방법 중 하나이다.
void main () {
  Warrior warrior1 = Warrior('다리우스', 1);
  warrior1.attack();
  warrior1._level = 2;
  warrior1._upgradeLevel();

}

class Warrior {
  String name;
  int _level;
  // 생성시 매개변수로 들어오기 때문에 null이 아님을 보장한다

  Warrior(this.name, this._level);

  attack(){
    print("전사가 기본 공격을 합니다!");
    _upgradeLevel();
  }
  _upgradeLevel(){
    _level++;
    print("전사가 레벨업 합니다~");
  }
}
import 'package:my_flutter_04/main_07.dart';

void main(){
  //다른 패키지면 import 선언을 해주어야 한다.
  Warrior w1 = Warrior('야스오', 10);
  // w1._level private으로 접근불가
  String myName = w1.name;
  print(myName);
}

 

 

 

 

 

 

 

[Getter / Setter]

자바의 Getter와 Setter 같은 개념

형태
Getter
데이터타입? get 변수명 => 기본 변수명 ;
ex)
String get name => name; (non-nullalbe)
String? get name => _name; (nullalbe)
get 이라는 것을 적어두면 더 명확히 알 수 있다
ex) Stirng? get getName =? _name;
Setter
set 변수명 (데이터타입? 입력값) => 기본 변수명 = 입력값;
ex)
set name (String name) => name = name; (non-nullalbe)
set name (String? name) => _name = name; (nullalbe)
set 이라는 것을 적어두면 더 명확히 알 수 있다
ex) set setname (String? name) => _name = name;
void main(){

  Person person =Person() ;
}

class Person{
  String? _name;

  
  String? get name => _name; //getter 기본 형태
  set name(String? name) => _name = name; //setter 기본 형태

  
  String? get getName => _name;
  set setName(String? name) => _name = name;

  
  String? get getName => (_name == null) ? '홍' : _name;
  set setName(String? name) => (name == null) ? 'Part' : _name = name;

}
import 'package:my_flutter_04/Main_08.dart';

void main(){

  Person person = Person();

  
  person.name = '홍길동';
  print(person.name);
  //즉, getter / setter로 접근할 때도 name 이라는 이름으로 사용된다.

  
  person.setName = '홍길동';
  print(person.getName);
  // 헷갈릴 수 있으므로 get,set을 붙여주는 것이 좋다.

  
  person.setName = null;
  print(person.getName);

}

 

 

 

 

 

 

[상속과 다형성]

super 키워드는 자식이 부모 객체를 참조할 수 있는 키워드!

void main () {
  // Dart 상속 -> 다형성
  // 단일 상속만 지원한다.
  CheeseBurger cheeseBurge = new CheeseBurger('통새우 치즈');
}
class Burger{
  String name;

  Burger(this.name){
    print('${name} 버거');
  }
}
class CheeseBurger extends Burger{
  //super 키워드는 자식이 부모 객체를 참조할 수 있는 키워드
  CheeseBurger(super.name);
}

 

 

 

 

 

 

 

 

이니셜라이져

( : ) 이니셜 라이져 키워드

: 생성자의 내부 스택이 실행되기 전에

다른 무언가를 호출하고 싶을 때 사용

아래 코드를 확인해보면 부모의 Buger 클래스에 이름이 없으나, 자식 클래스인 CheeseBurger에서 이니셜 라이져(:)를

사용하여 이름을 호출 하게 만들었다!

void main () {

  CheeseBurger cheeseBurger = new CheeseBurger('치즈버거');
  print(cheeseBurger.name);

}

class Burger{
  String name;
  Burger(this.name);

}

class CheeseBurger extends Burger{
  CheeseBurger(name) : super(name);

}

 

 

 

 

 

 

[Mixin] - with 키워드!

- 여러 클래스 계층에서 클래스의 코드를 재사용하는 방법

- Mixin을 사용하게 되면 다중 상속 문제를 해결 할 수 있고, 컴퍼지션을 사용하지 않고 다른 클래스의 코드를 재사용 할 수 있다.

Dart는 클래스와 Mixin 기반 상속이 있는 객체 지향 언어 모든 객체는 클래스의 인스턴스이며 Null 자식을 제외한

모든 클래스는 Object 클래스를 상속 받는다

 

★ Mixin으로 선언시 객체 생성(new) 불가능하다.

 
void main(){

  BMW bmw = BMW();
  print(bmw.power);
  print(bmw.wheelName);

  Wheel2 car = new Wheel2();
  print(car.color);
}

class Engine{
  int power = 5000;
}

class Wheel{
  String wheelName = '4륜 구동 바퀴';
}

class BMW with Engine , Wheel {
}

// 문법상 오류가 없으나, 의미상은 어색하다!
class Wheel2 with MyCar {
  String wheelName = '4륜 구동 바퀴';
}

class MyCar {
  String color = 'black';
}
void main() {
  // Musical musical = Musical(); // 오류 발생
  // mixin으로 선언시 객체 생성이 불가능함!
}

class Performer {
  var name;
}

mixin Musical {
  bool canPlayPiano = false;
  bool canCompose = false;
  bool canConduct = false;

  void entertainMe() {
    if (canPlayPiano) {
      print('Playing piano');
    } else if (canConduct) {
      print("Waving hands");
    } else {
      print("Humming to self");
    }
  }
} // end of musical

class Musician extends Performer with Musical {
  var company;

  @override
  String toString() {
    return "[이름 : ${name}, 소속 : ${company} ]";
  }
}

 

 

 

 

 

 

 

[생성자]

1. 기본 생성자 - default constructor

: (이름이 없는 생성자)

※ 이름이 없는 생성자는 단 하나만 만들 수 있음!

 

2. 이름이 있는 생성자 - Named constructor

: 다트에서는 오버로딩이라는 기능이 없다!

 

3. 초기화 리스트 - Initializer list

 

4. 리다이렉 생성자 - Redirecting constructor

 

5. 상수 생성자 - Constant constructor

 

6. 팩토리 생성자 - Factory constructor

void main (){

  Person person1 = Person();
  Person person2 = Person.init();
  Person person3 = Person.ageInit(100);
  print(person1);
  print(person2);
  print(person3);
}

class Person{
  var name;
  var age;

  // 이름이 없는 생성자
  // 주의 ! 이름이 없는 생성자는 단 하나만 만들 수 있다.
  Person(){
  }

  //이름이 있는 생성자
  Person.init(){
  this.name = '홍길동';
  this.age = 1;
  }

  // 이름이 있는 생성자
  Person.ageInit(this.age);

  @override
  String toString() {
    return 'Person{name: $name, age: $age}';
  }
}

'개발일지 > Dart' 카테고리의 다른 글

제네릭, Isolate  (0) 2022.11.08
생성자, 추상 클래스  (0) 2022.11.08
Collections, List, Set, Map  (0) 2022.11.07
do while, break, continue, Switch and Case,  (0) 2022.11.06
for문, forEach문, StringBuffer, whil  (0) 2022.11.06

댓글