반응형

지난 스터디에서 class와 constructor를 알아보았다.

이번 스터디에서는 Getter와 Setter라는 것에 대해 알아보려 한다.

실습을 진행하기 전에, 간단한 기능을 가지는 class를 하나 선언하여 준비한다.

void main() { 
  
  Color color = new Color(
    name: 'red',
    group : 'A'
  );
  
  color.sayName();
  
}


class Color {
  String name;
  String group;
  
  
  //네임드 파라미터를 사용하는 생성자 하나 선언
  //중괄호의 유무
  Color({
    String name,
    String group
  }) : this.name = name,
       this.group = group;
    
  void sayName(){
    print('이 색은 ${this.name}입니다.');
  }
}

이 색은 red입니다.

 

Getter와 Setter를 알기전에 먼저 Private변수에 대해 알아야 하는데, 일단 선언하는 방법은

변수명에 _언더바를 붙여주면 된다.

class Color {
	String name;  -> String _name;
	String group; -> String _group;	
}

언더바를 붙이면 Private 변수로 사용된다. 보통 JAVA에서는 Private변수의 경우 소속된 class에서만 

사용이 가능하지만, Dart의 경우 같은 파일내에 존재하는 영역에서는 어디서나 가져와서 사용이 가능하다.

그럼 변경된 Private변수명에 맞게 class내부를 수정 후, 출력해보자.


void main(){
  Color color = new Color(
    name: 'red',
    group : 'A'
  );
  
  print(color._name);
  
  
}


class Color {
	String _name;
    String _group;
    
  	Color({
	    String name,
	    String group
  	}) : this._name = name,
	       this._group = group;
	    
  	void sayName(){
	    print('이 색은 ${this._name}입니다.');
  	}            
}
red

main 함수의 print함수를 보면 color클래스의 _name을 호출하고 있다. 

_name은 color클래스의 프라이빗 변수로 선언되어 있음에도 불구하고, 같은 파일내에 있기때문에

Dart의 특성상 사용할 수 있는것이다.

만약 위 소스에서 main 함수와 class가 다른 파일에 있었다면 에러가 발생했을 것이다.


그럼 다른 파일에 선언되어 있는 경우엔 어떻게 불러와서 사용할 수 있을까?

이때를 위해 바로 Getter와 Setter가 존재하는 것이다.

선언은 class안에 아래와 같이 한다.

class Color {
	String _name;
	String _group;
   
	Color({
	    String name,
		String group
  	}) : this._name = name,
	       this._group = group;
	    
	void sayName(){
		print('이 색은 ${this._name}입니다.');
	}  
  
	get name{
		return this._name;
	}
  
	set name(String name){
		this._name = name;
	}
}

getter는 get 이름 형태로 선언하며, 보통 private변수명에서 언더바를 제거한 이름을 사용한다.

setter또한 set이름 형태로 선언하며, 값을 지정하는 역할을 하기 때문에 파라미터를 받게된다.(타입은 원하는 대로)

getter의 경우 호출하면 class의 private변수의 값을 리턴하도록 하고 있으며, setter의 경우 받은 파라미터를

class에 할당하는 역할을 하고 있다.

한번 호출해 보자.


void main(){
	Color color = new Color(
		name: 'red',
		group : 'A'
	);
  
	print(color._name);
  
  
	print(color.name);
  
	color.name = 'blue';
	print(color.name);
  
}


class Color {
	String _name;
	String _group;
   
	Color({
		String name,
		String group
	}) : this._name = name,
	       this._group = group;
	    
	void sayName(){
		print('이 색은 ${this._name}입니다.');
	}  
  
	get name{
		return this._name;
	}
  
	set name(String name){
		this._name = name;
	}
}
red
red
blue

main 함수 내 정의된 첫번째 print의 경우, 같은 파일내 private함수가 있기 때문에 바로 호출하여

사용할수 있다는 것을 보여준 예시이고,

 

두번째 print는 getter를 이용하여 class안에 포함된 _name값을 리턴받아 출력하는 예시이다.

마지막 세번째는 setter를 이용하여, blue라는 값을 set후, getter를 이용하여 출력한 예시이다.


번외로 , 여기서 하나 드는 의문점.

아래와 같이 선언해서 써도 상관없는거 아닌가?

  void getName(){
    return this._name;
  }
  
  void setName(String name){
    this._group = name;
  }

상관없지만, 단순히 보면 소괄호의 사용유무 정도라고 할수 있는데, 때에 따라 get(ter) set(ter)로 간단하게 

사용할 때가 있다. 언제 getter와 setter를 사용하는게 좋을지, 함수로 만들어서 사용해서 좋을지는 

실제 프로그램을 만들다 보면 구분지어 쓸때가 있다.

오늘의 스터디 Getter와 Setter 끝.

반응형
반응형

이미지 깔쌈하네

Class의 가장 중요한 개념

OOP - Objected Oriented Programming : 객체지향 프로그래밍

 

Class란 무엇인가?

간단하게 비슷한 성격의 또는 기능의 변수와 함수들을 모아놓은것이라 할수있다.

직접 소스로 보면서 해보자. 일단 Class를 하나 선언해보자. (당연히 main 함수 영역 밖이다.)

void main() { 
 
}

//Class의 모든 첫번째 글자는 반드시 대문자로 선언해야 한다.
class Color{
	String name = 'red';
  	void sayName(){
	    //표현방식 1번
	    print('이 색은 red입니다.');	    
        
	    //표현방식 2번
	    print('이 색은 ${this.name}입니다.');
	    
	    
  	}    
}
이 색은 red입니다.

하나의 변수와 단순하게 변수를 print하는 함수를 정의했다.

(표현방식 1,2를 나눈것은 참고용으로)

현재 티스토리 코드블럭 기능에서는 Dart컴파일러와 같은 하이라이트를 지원하지 않기 때문에 보이지 않지만,

실제 웹컴파일러에서는 표현방식 2번에 "this"가 선언한 class명과 색상이 동일한 것을 알수 있다.

이는 this가 현재 class를 가리키는 것을 의미하며, 현재 class안에 name이라는 변수를 지칭하는것을 뜻한다.


※ Dart 웹컴파일러는 아래 포스팅에 있으니 참고

 

Dart언어공부-01.Hello World

Flutter가 요즘 핫하게 올라오면서, Flutter의 주력 언어(다른언어도 가능함)인 Dart를 공부해보려 한다. 간단하게 Flutter란? Google에서 개발하고 Mobile World Congress 2018에서 최초 베타..

masswhale.tistory.com


다시 본론으로 돌아와서.

그럼 이렇게 선언한 class는 어디서 어떻게 사용할 수 있을까?

먼저 Map이나 List를 선언하여 사용하는것과 같이 마찬가지로 변수형태로 선언해야 한다.

//선언된 클래스를 변수처럼 사용하기 위해, 변수선언하듯이 선언한다.
Color color = new Color();

위 class를 선언한것을 보면 아래 Map과 List선언방식과 비슷하다는 것을 알 수 있다.

Map map = new Map();  
List list = new List();

이유는 Dart에서 기본으로 제공하는 class형이기 때문이다. 


이와같이 class를 인스턴스로 변환하는 것을 Instantiation이라 한다.

한글로는 인스턴스화.

위와 같이 선언된 (좌측영역) class의 변수는 하나의 인스턴스라고 부른다.

 

그럼 color라는 인스턴스에서 하나를 꺼내 실행해보자.

color.sayName();  
print(color.name);
이 색은 red입니다.
red

위와같은 결과가 문제없이 나오고 지금까지 무리없이 따라왔다면,

기본적인 class를 선언하고, 사용하는 방법까지 익힌것이라 할수 있겠다.

또한, Map과 List도 그러하듯이, class도 여러 인스턴스를 만들수 있다.

Color color2 = new Color();
color2.sayName();
이 색은 red입니다.
red

만약, 같은방식으로 인스턴스를 생성하였지만 위 구문 기준으로 

color2.sayName();을 했을때 다른 색상을 호출하고 싶다면 어떻게 해야할까?

 

이때 바로 Constructor라는 것을 이용할 수 있다.

Constructor는 또 무엇인가?

처음 class가 선언이 될때, 원하는 변수들을 이 class안에 집어넣을 수 있는 기능이라고 생각하면 될거같다.

그럼 Constructor는 어떻게 사용할까? 바로 소스 예제로 확인해 보자.

class Color{  
  String name ;
  //1. 새로 추가 선언
  String group ;
  
  //Constructor - 2. 동일한 이름을 작성하여 소괄호를 열고 닫아준다.
  Color(
    //3. class가 인스턴스로 선언될때, 외부에서 직접 입력을 받아서 변수에 할당하고자 한다.
    //4. 아래와 같이 선언하게 되면, 외부에서 값을 새로 받겠다라는 의미가 된다.
    //5. 그리고 외부에서 받아온 이 name과 group는 현재class의 name과 group이라는 것을
    //   가장 하단 콜론(:)뒤에 반드시 지정해준다.
    String name,
    String group
  ):this.name = name,
    this.group = group
    ;

  void sayName(){
      
    print('이 색은 ${this.name}입니다.');
    
  }
  
}

위와같이 class 생성자(Constructor) 정의가 완료된 후, 호출해보면

void main(){
  Color listUp = new Color(
  'blue',
  'B' );
  
  listUp.sayName();
  print(listUp.name);
  print(listUp.group);
}
이 색은 blue입니다.
blue
B

인자(파라미터)를 넣어 정의한 listUp이라는 인스턴스를 생성할때,  class의 생성자(constructor)에서 name과 group값을

셋팅했기 때문에 위와 같은 결과를 얻을 수 있는 것이다.

※이 생성자(constructor)의 파라미터는 함수의 파라미터와 같은 역할을 한다.

직접 class를 생성해보고, 여러번 돌려보면서 체화하는것이 중요하다.


그렇다면 생성자(constructor)에 네임드 파라미터를 넣을 수 있을까?

class Color{

  String name ;
  String group ;
  
  //소괄호 안에 중괄호를 열어서 선언.
  Color({
    String name,
    String group
  }    
  ):this.name = name,
    this.group = group;

  void sayName(){

    print('이 색은 ${this.name}입니다.');

  }
  
}

생성자(constructor)의 소괄호 안에 중괄호를 열어서 선언한다.

다음 main 함수에서 호출시가 달라지는데, 네임드 파라미터의 특징답게 변수명을 지정하여 할당한다.

물론, 네임드 파라미터의 특성답게 순서가 달라져도 상관없다.

void main(){
  Color listUp = new Color(
    group : 'B',
    name : 'blue'
   );
  
  listUp.sayName();
  print(listUp.name);
  print(listUp.group);

}

 

이 색은 blue입니다.
blue
B

이와 같이 같은 결과값을 얻을 수 있다.


생성자(constructor)에 대해 한가지를 더 다뤄보자면,

일반적으로 JAVA처럼 OOP를 자주 쓰는 언어에서는 constructor 오버로딩이라는 개념이 존재하는데

Dart에서는 다른 이름이 존재한다. 바로, 네임드 컨스트럭터(=생성자)라 한다. 

 

다시 class로 돌아와서 추가로 생성자를 추가해보자.

class Color{

  String name ;
  String group ;
  
  //소괄호 안에 중괄호를 열어서 선언.
  Color({
    String name,
    String group
  }    
  ):this.name = name,
    this.group = group;
  
  //1. Map값을 받아서 이 class를 생성할 수 있는 또 하나의 생성자를 만들어보자
  //2. '클래스명.적당한이름' 의 형태로 짓는다.
  //3. Map값을 받아서 Key값이 name인것은 이 클래스의 name으로,
  //4. Key값이 group인것은 이 클래스의 group으로 넣어줄 수 있도록 지정해준다.
  Color.fromMap(
    Map input
  ) : this.name = input['name'],
      this.group = input['group']
  ;

  void sayName(){

    print('이 색은 ${this.name}입니다.');

  }
  
}

위 코멘트 1~4번에서도 작성했듯이, class가 인스턴스화 될때, 방식에 따라 다르게 선언하여 생성할 수 있다.

(※ fromMap은 Map값을 받아서 인스턴스화 시키기 위해 지은 적당한 이름이지 함수명 같은것이 아님)

위와같이 정의하면 Map형태로 넘어온 값은 인스턴스화 될때, Key값이 name인 것의 value를 class의 name으로

Key값이 group인 것의 value를 class의 group으로 지정할 수 있다.


void main(){
  Color listUp = new Color(
    group : 'B',
    name : 'blue'
   );
  
  listUp.sayName();
  print(listUp.name);
  print(listUp.group);
  
  Color frMap = new Color.fromMap({
    'name' : 'pink',
    'group' : 'P'
  });
  
  frMap.sayName();
  print(frMap.name);
  print(frMap.group);
}
이 색은 blue입니다.
blue
B
이 색은 pink입니다.
pink
P

이렇듯 위 2개의 예제를 통해, 한 class안에서 여러개의 다양한 방식의 생성자를 사용할 수 있게된다.

또한 class를 인스턴스화 할수 있는 방법이 여러가지라는 것을 의미한다.


그런데, class를 인스턴스화 할때 생성자의 값을 초기화(기본값)후, 변경되지 않게 하려면 어떻게 할까?

void main(){
	Color frMap = new Color.fromMap({
	    'name' : 'pink',
	    'group' : 'P'
	});
    frMap.name = 'purple';
    print(frMap.name);
}

위와같이 name의 값을 분명히 pink로 초기화 했는데, 인스턴스화 후 purple로 변경 후에 값을 출력하면 어떻게 될까?

당연히 name은 purple로 변경되어 뜬다.

물론 값을 변경할 일이 있을수 있지만, 그렇지 않고 변경을 원치 않는 경우도 있다.

그럴땐, final을 이용한다.


class Color{

  final String name ;
  final String group ;
  
  
  Color({
    String name,
    String group
  }    
  ):this.name = name,
    this.group = group;

  Color.fromMap(
    Map input
  ) : this.name = input['name'],
      this.group = input['group']
  ;

  void sayName(){

    print('이 색은 ${this.name}입니다.');

  }
  
}

위와 같이 class에 선언된 name과 group변수에 final을 붙여서 반드시 변하지 않는 값임을 명시해준다.

final로 선언되면 인스턴스화 당시 값 초기화 후, 이후엔 절대 변경할 수 없다.

하나 주의할 점은 final로 지정된 이상 생성자에서는 반드시 값을 바인딩해주어야 한다.

(:this.name = name )  <- final로 선언된 변수가 생성자로 부터 연결되는 값이 없다면 오류가 발생한다.

초기화 후, 절대 변경이 되서는 안되는 값이므로 연결이 안될 수가 없다는 것을 의미하기 때문이다.

굉장히 유용하므로 final도 잘 기억해 두자.


앞 부분 스터디들은 크게 지루하고 재미없었지만, class로 진입하고 나서부터는 다시 들어도 재밌다.

코드팩토리님의 Dart 기초강의를 듣고싶다면 아래 포스팅 참고!

 

Flutter개발을 위한 Dart언어 왕초보 강의

Flutter를 이용한 앱개발을 위해 Dart강의를 찾던 중 유튜브에서 기가막힌 강의를 찾아냈다. (혹시 Dart언어에 대해 빠르고 간략하게 기초를 쌓고 싶으신 분에게 추천드림..) 정말 마음에 드는점은

masswhale.tistory.com

오늘 class 스터디 완료!!

반응형
반응형

해당 이미지가 저작권에 위배될시 죄송합니다

이번 스터디는 Dart의 typedef다.

Typedef는 Function과 굉장히 밀접하게 연결이 되어있다.

이 Typedef를 사용하면 함수를 미리 시그니처와 해서 여러가지 함수를 유용하게 다룰수 있는 기능을 제공해준다.

바로 소스로 알아보자.

먼저 간단하게 덧셈과 뺄셈을 하는 함수를 정의한다.

void main() { 
	//잘 나오는지 확인
  add(1,2);
  subtract(3,2);
    
}

void add(int x, int y){
  print('x더하기 y는 ${x+y}입니다.');
}

void subtract(int x, int y){
  print('x빼기 y는 ${x-y}입니다.');
}
x더하기 y는 3입니다.
x빼기 y는 1입니다.

 

그리고 이번에는 typedef를 하나 선언해보자.

void main() { 
  add(1,2);
  subtract(3,2);
    
}

void add(int x, int y){
  print('x더하기 y는 ${x+y}입니다.');
}

void subtract(int x, int y){
  print('x빼기 y는 ${x-y}입니다.');
}

typedef Operation(int x, int y);

여기까지만 보면,

함수는 반환타입 또는 void를 지정한 후, 함수명과 파라미터의 구조다.

typedef의 경우도 정의한 형태는 함수와 큰 차이를 보이지 않는다.

유일한 차이로는, 함수의 경우 중괄호 영역을 펼쳐서 수행할 내용을 작성하지만, typedef의 경우 그렇지 않다는 것이다.

그럼 어떻게 사용하는 것일까?

직접 예제로 한번에 활용하자.

(주석의 넘버링된 순서대로 읽어나가면 되겠다.)

void main() { 
  add(1,2);
  subtract(3,2);
    
  print('-----구분선-----');
  
  //1. 변수선언 하듯이, type은 typedef에 선언한 Operation으로 하고,
  //2. 변수명 짓듯이 알아서 짓는다.
  //3. 여기에 할당하는것은 미리 정의해둔 함수를 할당한다.
  Operation oper = add;
  
  //4. 위와 같이 지정한 후, oper을 실행하게 되면?  
  oper(1,2);
  //5. add함수를 호출했던것과 같은 결과를 나타낸다.
  //6. 즉, oper를 호출한다는 것은 -> add를 호출하는것과 같은 것이다.
  
  //7. 반대로 oper에 뺌셈기능을 하는 함수를 정의해주면
  oper = subtract;
  
  oper(3,2);
  //8. subtract함수의 기능을 수행하여, 결과를 표시한다.
  //9. 여기서 주의할 점은, typedef에 정의해둔 것과 사용하려는 함수의 파라미터가 같아야 한다.
  
  
}

void add(int x, int y){
  print('x더하기 y는 ${x+y}입니다.');
}

void subtract(int x, int y){
  print('x빼기 y는 ${x-y}입니다.');
}

typedef Operation(int x, int y);

※즉, typedef를 이용하면 함수들을 변수처럼 사용할 수 있게 만들어 준다.

여기서 드는 의문...그냥 함수를 호출하면 되는것이 아닌가? 굳이 typedef를 사용해야 할까?

유용하게 사용할 수 있는 기능을 예제로 만들어보자.

이번에도 임의 함수를 하나 선언하자.

void calculate(int x, int y, Operation oper){
  oper(x,y);
}

위 calculate라는 함수는 int형의 x,y를 받고 typedef 하나를 받도록 되어있다.

실제 main함수에서 호출해보면,

void main() { 
  calculate(1,2,add);
  calculate(3,2,subtract);    
}

void add(int x, int y){
  print('x더하기 y는 ${x+y}입니다.');
}

void subtract(int x, int y){
  print('x빼기 y는 ${x-y}입니다.');
}

typedef Operation(int x, int y);

void calculate(int x, int y, Operation oper){
  oper(x,y);
}
x더하기 y는 3입니다.
x빼기 y는 1입니다.

함수에 인자로 함수를 넣고, 그 값을 받은 calculate는 첫번째, 인자와 두번째인자를 가지고 세번째 typedef를 실행한다.

여기까지만 봐도 아직 크게 와닿지 않을 수는 있다..나도 그렇지만...

자주는 아니지만 가끔은 쓰일때가 있다고 한다. 일단 알아두도록 하자

나중에 인자로 함수 막 박혀있고 그러면 헷갈리니깐~~

오늘 스터디 typedef끝.

반응형
반응형

Function은 프로그래밍을 하는데 있어서 가장 중요한 기능 중 하나.

효율적인 개발과 중복적인 코드를 사용하지 않게 도와주는것이라 할수있다.

지난 시간 예제를 가지고 활용해보자.

List에 담긴 변수를 합산하는 반복문을 작성해보자.

void main() {
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  int total = 0;
  
  for(int number in testList){
    total += number;
  }
  print(total);
}
20

여기서 testList만 있는게 하나가 아니라 여러개가 있다면?

그만큼의 반복문도 어러개가 생겨야 한다.

이러한 불편을 최소화하고, 중복코드를 줄이기 위해 함수를 사용한다.

메인영역 밖에 위의 기능을 담은 함수를 만들어보자

void main() {

}

addList(){
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  int total = 0;
  
  for(int number in testList){
    total += number;
  }
  print(total);

}

위와같이 main함수 밖에 List의 값을 합산하는 기능을 가진 addList함수가 만들어졌다.

Dart의 시작은 main함수에서 이루어 지므로, 지금 당장 위 코드를 실행하면 어떤 값도 출력되지 않는다.

방금 선언한 addList();함수를 main 영역에 넣어서 호출하도록 변경한다.

void main() {
  addList();
}

addList(){
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  int total = 0;
  
  for(int number in testList){
    total += number;
  }
  print(total);

}
20

일단 여기까지, 함수에 기능을 정의하는 것까지 진행되었는데 

여기까지만 봐도 main 함수 밖으로 뺀거 외에는 다른점이 없어보인다.

그럼 여기에 목적(기능)을 하나 추가해보자.

 

addList함수에 어떠한 List값을 넣어줘도 합산한 결과가 도출되도록 하는 함수를 만들어보자.

다시 얘기하자면 위 소스에 있는 testList변수가 testList2,testList3,testList4....등등 수십개가있다고 가정했을때

기존처럼 코딩한다면 list하나에 반복문 하나씩 해서 만들었겠지만

List값이 여러개여도 이 List값을 합산해주는 반복문 하나만 만들어 보겠다는 뜻이다.

이런 기능을 가능하게 해주는것이 바로 파라미터 이다.

 

자세한건 소스로 확인해 보자.

void main() {
  //3. 당연히 비어있는 값을 파라미터로 넣어주면 안되고, 호출전에는 반드시 값을 선언하여 할당한다.
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  addList(testList);
  
  //4. 다른 List값이 있어도 마찬가지로 addList에 파라미터로 넣어서 호출하면 동일한 합산방식의 결과를 얻을 수 있다.
  List testList2 = [
    10,
    20,
    30,
    40,
    50
  ];
  addList(testList2);
}

//1. 기존에 선언하였던 List값을 삭제하고, List타입의 변수를 받겠다고 소괄호안에 선언한다.
//2. 앞으로는 해당 함수에서는 외부에서 List값을 받아서 연산하겠다는 것을 의미한다.
addList(List testList){
  
  int total = 0;
  
  for(int number in testList){
    total += number;
  }
  
  print(total);

}
20
150

기존처럼 했었다면 한개의 변수에 하나의 반복문이 셋트로 이루어졌겠지만

위 처럼 함수로 정의하여 List변수를 받아 공통으로 처리하여 코드의 중복을 줄일수 있다.


위와같이 합산하여 print를 하거나 그 안에서 기능이 동작되면 끝인 함수를 정의할수도 있지만

때에 따라, 함수에서 처리된 결과를 어딘가에 저장한 후, 활용하고 싶을때가 있을수도 있다.

이때 사용하는 방법이 바로 반환(return)받아서 처리하는 방법인데, 

아래 소스에서 순서 및 구문으로 알아보자.

(주석의 번호 순서대로 읽으면서 볼 것)

void main() {
  
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  //5. 반환하는 타입과 동일한 변수를 선언하여 할당해주면
  int result = addList(testList);
  
  //6. 아래와 같이 저장하여 해당변수를 어디서든 사용할 수 있다. 
  print(result);

}

//1. 해당 함수를 호출하여 얻는 결과를 반환받을 수 있도록 함수명 앞에 int를 붙여준다.
//2. 이는 해당함수에서 int형 결과값을 반환하겠다는 것을 의미한다.
int addList(List testList){
  
  int total = 0;
  
  for(int number in testList){
    total += number;
  }
  
  //3. 항상 하단에는 반환해주는 구문을 작성한다.
  //4. 함수명 앞에 정의한 타입의 변수만 반드시 리턴해야 한다.
  return total;

}

 

20

 

※함수에서 받는 파라미터(인자)는 1개이상으로 받을수 있으며, 타입에 제한받지 않는다.

int addList(List testList , String a, int b){
...
}

 

파라미터를 3개를 지정했을땐, main 함수 등에서 호출시에 반드시 파라미터를 3개를 넣어줘야 한다.

하지만 때에 따라서 2개만 넣고 3번째는 안넣어도 되도록 만들땐, 아래와 같이 정의하여 사용한다.

그러면 첫번째와 두번째 파라미터는 필수로 넣어줘야 하지만, 세번째는 넣지 않고 호출해도 동작한다.

void main() {
	//3. 세번째 파라미터를 넣지않아도 정상적으로 호출이 가능하다
	addList(testList,'a');
}

//1. 세번째 파라미터 자리에 대괄호를 씌워서 옵션값으로 만든다.
//2. 여기서 조심해야할 부분은 괄호를 씌운 후, null인경우의 기본값을 설정해주는 것이다.
//만약 초기화하지않고, [int b] 이렇게만 표시한 후, 연산 시도시 기본값은 null이기 때문에
//오류가 발생한다.
int addList(List testList , String a, [int b = 3]){
...
	//※출력방식 두가지 방법
	print(b);
	print('$b');
}

이번에는 네임드 파라미터에 대해서 알아보자.

네임드 파라미터는 지정된 변수명에 맞게 파라미터를 할당하면 되는것으로

아래 소스를 통해 확인하자. 주석의 번호 순대로 읽어보면 된다. 

void main() {
  
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  
  
  //2. 첫번째, 두번째 파라미터는 순서와 타입을 지켜야 하지만
  //세번째 순서부터는 상관없이 어떤 변수명에 넣어줄지를 지정할수 있는게 네임드 파라미터의 장점이다.
  int result2 = addList2(testList,'a', b:3, d:2,c:1);

}


//네임드 파라미터
//1. 넣어도 되고 안넣어도 되는 옵션형 파라미터 말고, 중괄호를 열어서 선언하여 
//값만 일치하면 되는 네임드 파라미터를 선언한다.
int addList2(List testList , String a, {
int b,
  int c,
  int d
}){
  print('a는 $a, b는 $b, c는 $c, d는 $d');
  
}
a는 a, b는 3, c는 1, d는 2

※요약

함수선언시 반환될 결과값의 타입을 지정해주고, 없으면 생략하거나 void를 작성한다.

함수이름 지정하고,  소괄호영역은 외부변수(파라미터)를 받을수 있다.

이후 중괄호에는 수행할 기능을 정의한다.


이전 스터디 내용도 그렇지만, 함수 부분 또한 알고 있는 내용이라서 강의는 쉽게 이해했지만

이게...정리한다는게 참 만만치 않은거 같다.

새삼..강의하시는 분들이 대단하게 느껴진다.

반응형

+ Recent posts