반응형
Basic
void main() 
{
  // study0 : variable 
  var name = 'Yoon Engineer';
  print("Hello ${name}");  
  
  // study1 : Operator
  int number1 = 10;
  int number2 = 20;
  print('${number1} + ${number2} = ${number1+number2}');
  
  // study2 : Boolean and type check
  bool isTrue = true;
  bool isFalse = false;
  
  print(isTrue.runtimeType);
  print(isFalse);
  
  // study3 : String operator
  String name1 = 'Hello';
  String name2 = 'Yoon';
  
  print(name1 + ' ' +name2);
  print('$name1 $name2');
  
  // study4 : Dynamic vs Var
  dynamic dynamic_test = 'Yoon Engineer';
  print(dynamic_test.runtimeType);
  
  dynamic_test = 1;
  print(dynamic_test.runtimeType);
  
  // study5 : Null
  // nullable - null이 될 수 있음.
  // non-nullable - null이 될 수 없음.
  String null_test = 'Yoon';
  print(null_test);
  
  //null_test = null; // 오류
  String? null_test2 = 'Yoon';
  print(null_test.runtimeType);
  null_test2 = null;
  print(null_test.runtimeType);
}

 

Final vs Const
void main()
{
  // final : 값 변경 불가
  final String name = 'Yoon';
  
  print(name);
  
  // const : 값 변경 불가
  const String name2 = 'Yoon';
  print(name2);
  
  // final, const var을 따로 작성하지 않아도 됨.
  final name3 = 'Yoon';
  const name4 = 'Yoon';
  print(name3);
  print(name4);
  
  // final vs const
  // final은 빌드 타임 값을 몰라도 됨.
  // const는 빌드 타임 값을 알아야 함.
  final DateTime now = DateTime.now();
  
  //const DateTime now = DateTime.now(); // error
  
}

 

Null, Operator
void main()
{
  dynamic? number = null;
  
  print(null);
  // ?? 연산자 : 변수가 null이면 Rvalue로 변환함
  number ??= 4;
  print(number);
  
}
void main()
{
  int number = 1;
  
  print(number is int);
  print(number is String);
  print(number is double);
  
  print(number is! int);
  print(number is! String);
  print(number is! double);
  
  // Conditional operator
  bool result1 = 12 > 10 && 1 > 0;
  bool result2 = 12 > 10 || 0 > 1;
  print(result1);
  print(result2);
}

 

List, Map, Set
void main()
{
  // python list와 동일한 역할을 함
  List<String> blackPink = ['제니', '지수', '로제', '리사'];
  List<int> numbers = [1, 2, 3, 4, 5];
  
  // List length
  print(blackPink.length);
  // Python 처럼 -1과 같은 인덱싱은 안됨
  print(blackPink[0]);
  // List value remove
  blackPink.remove('리사');
  print(blackPink);
  // List value add
  blackPink.add('리사');
  print(blackPink);
  // List indexOf
  print(blackPink.indexOf('리사'));
}
void main()
{
  // Map : {key : value}
  // Python dictionary와 똑같은 역할을 함.
  Map<String, String> dictionary = 
  {
    'Harry Potter' : '해리포터',
    'Ron weasley' : '론 위즐리'
  };
  print(dictionary);
  
  // addall
  dictionary.addAll(
    {
      'Hermione Granger' : '헤르미온느 그레인저'
    });
  print(dictionary);
  dictionary['Hello'] = "안녕";
  
  // indexing
  print(dictionary);
  print(dictionary['Harry Potter']);
  
  // remove
  dictionary.remove('Hello');
  print(dictionary);
  
  // keys, values
  print(dictionary.keys);
  print(dictionary.values);
}

 

If, switch
void main()
{
  int number = 3;
  if (number % 3 == 0)
  {
    print("ha");
  }
  else if(number % 3 == 1)
  {
    print("haha");
  }
  else
  {
    print("hahaha");
  }
  switch(number % 3)
  {
    case 0:
      print('ha');
      break;
    case 1:
      print('haha');
      break;
    default:
      print('hahaha');
      break;
  }
}

 

For loop
void main()
{
  int total = 0;
  List<int> numbers = [0, 1, 2, 3, 4, 5, 6];
  
  for(int n in numbers)
  {
    print(n);
  }
  
  print("----------------------");
  
  for(int n in numbers)
  {
    if(n == 3) continue;
    if(n == 5) break;
    print(n);
  }
}

 

Function, Signature
void main()
{
  var result1 = addNumbers(a:1, b:2);
  print(result1);
  
  var result2 = addNumbers(a:1, b:2, c:3);
  print(result2);
}

// named parameter
String addNumbers({
  required int a, 
  required int b, 
  int c =20})
{
  print('${a+b+c}');
  
  return 'success';
}
void main()
{
  int result = calculate(1, 2, 3, add);
  print(result);
}
 
// signature
typedef Operation = int Function(int x, int y, int z);

// 덧셈
int add(int x, int y, int z) => x + y + z;

// 뺄셈
int subract(int x, int y, int z) => x - y - z;

// function
int calculate(int x, int y, int z, Operation operation)
{
  return operation(x, y, z);
}

하루 정도 시간 내어 flutter를 하기 전에 Dart 언어를 쫙 읊어 보는 시간을 가져 본다.

Dart 언어는 공부해 보니 Java와 유사함을 느낌.

1. Var과 Dynamic : var는 한 번 타입이 정해지면, 변경 불가능. Dynamic은 한 번 타입이 정해지더라도 변경 가능.

2. Flutter2.0부터는 Null에 관련된 이슈가 업데이트됐다고 한다. 공부할 필요가 있을 것 같음.

3. final, const의 차이는 빌드 타임이다. final은 빌드 타임을 몰라도 되고, const는 알아야 함.

4. ??연산자는 null이면 Rvalue로 변환함.

5. 조건 연산자, 비트 연산자는 C와 동일함. 하지만 Dart 언어로 펌웨어 코딩할 일이 없으므로 비트 연산자는 사용되지 않을 것 같음.

6. List, Map, Set 모두 java와 일치함.

7. for 문도 java와 일치함. 결국 항상 느끼지만 새로운 언어를 공부할 때, 한 가지라도 제대로 터놓으면 다른 언어는 공부하기 편하다는 것을 뼈저리게 느낌.

아직까지 이상무.

728x90
반응형

'Flutter > Dart' 카테고리의 다른 글

Dart Study #2 클래스, 상속  (0) 2022.08.04
Dart Study #3 futures, async, await  (0) 2022.07.23
반응형

python List 메모리에 대해 알아 보겠습니다.

list_a = [1,2,3,4]
list_b = list_a

print("list_a :", list_a)
print("list_b :", list_b)

print("list_a 메모리 :", id(list_a))
print("list_b 메모리 :", id(list_b))

"""
결과
list_a : [1, 2, 3, 4]
list_b : [1, 2, 3, 4]
list_a 메모리 : 1305532916296
list_b 메모리 : 1305532916296
"""

 

list_a의 리스트를 list_b에 대입연산자( = )를 사용하게 되면,

 

list_b에 값이 저장되는 것이 아니라, list_a의 메모리 주소를 저장하게 되어 list_a와 list_b가 서로 메모리 주소를

공유합니다. 

 

만약, list_a에 변수를 추가하게 되면 어떻게 될까요?

list_a = [1,2,3,4]
list_b = list_a

#list_a에 5를 추가
list_a.append(5)

print("list_a :", list_a)
print("list_b :", list_b)

print("list_a 메모리 :", id(list_a))
print("list_b 메모리 :", id(list_b))

"""
결과
list_a : [1, 2, 3, 4, 5]
list_b : [1, 2, 3, 4, 5]
list_a 메모리 : 1866016776776
list_b 메모리 : 1866016776776
"""

결과는 list_a에 5가 추가된다면, list_b에도 5가 추가됩니다.

 

사실상 List명만 다를 뿐, 메모리를 서로 공유하기 때문에 같은 List로 볼 수 있습니다. 

 

그렇다면, list_a와 list_b가 서로 다른 주소를 가지게 하려면 어떻게 해야할까요?

 

list_a = [1,2,3,4]
# .copy를 사용하여 변수 저장
list_b = list_a.copy()

#list_a에 5를 추가
list_a.append(5)

print("list_a :", list_a)
print("list_b :", list_b)

print("list_a 메모리 :", id(list_a))
print("list_b 메모리 :", id(list_b))

"""
결과
list_a : [1, 2, 3, 4, 5]
list_b : [1, 2, 3, 4]
list_a 메모리 : 2337630282312
list_b 메모리 : 2337630282376
"""

copy를 사용하면 메모리의 주소가 아닌, List안의 값들이 저장됩니다.

 

list_a와 list_b의 메모리 주소가 다름을 알 수 있습니다. 

 

서로 메모리의 주소가 다르기 때문에 서로 다른 변수가 됩니다.

728x90
반응형
반응형

재귀함수(Recursive function) : 자기 자신을 부르는 함수

리스트(List) : 동적인 배열 (튜플(tuple) : 정적인 배열)

LIFO : Last in Fisrt out

 

스택(stack) : 일종의 바닥이 막힌 상자 혹은 더미, 나중에 넣은 물건은 나중에 꺼낼 수 밖에 없는 구조,

LIFO(Last In First Out) 라고도 한다.

 

스택(Stack) : 더미

재귀함수를 이용해서 이 스택구조를 구현하겠습니다. (Push는 자료를 입력, Pop은 자료를 출력)

#재귀함수를 이용한 스택구조
def stack(start , end):
    if start <= end:
        print('Push :', start)
        stack(start + 1, end)
        print("Pop  :", start)
    else:
        print("--------")

stack(0, 5)

#결과
Push : 0
Push : 1
Push : 2
Push : 3
Push : 4
Push : 5
--------
Pop  : 5
Pop  : 4
Pop  : 3
Pop  : 2
Pop  : 1
Pop  : 0

짧은 코딩이지만, 조금은 생각해야 합니다.

 

 

List를 이용하여 간단히 스택구조를 구현할 수 있습니다.

#List를 이용한 스택구조
data_stack = list()

for i in range(10):
    data_stack.append(i)
    print('Push :', data_stack)

for i in range(10):
    data_stack.pop()
    print('Pop  :', data_stack)
    
#결과
Push : [0]
Push : [0, 1]
Push : [0, 1, 2]
Push : [0, 1, 2, 3]
Push : [0, 1, 2, 3, 4]
Push : [0, 1, 2, 3, 4, 5]
Push : [0, 1, 2, 3, 4, 5, 6]
Push : [0, 1, 2, 3, 4, 5, 6, 7]
Push : [0, 1, 2, 3, 4, 5, 6, 7, 8]
Push : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Pop  : [0, 1, 2, 3, 4, 5, 6, 7, 8]
Pop  : [0, 1, 2, 3, 4, 5, 6, 7]
Pop  : [0, 1, 2, 3, 4, 5, 6]
Pop  : [0, 1, 2, 3, 4, 5]
Pop  : [0, 1, 2, 3, 4]
Pop  : [0, 1, 2, 3]
Pop  : [0, 1, 2]
Pop  : [0, 1]
Pop  : [0]
Pop  : []

 

좀 더 직관적이고, 간단한 방법으로 스택구조를 구현할 수 있습니다. 

 

스택구조는 많은 곳에서 사용됩니다.

 

윈도우에서 Ctrl+Z,  브라우저에 뒤로 가기 등 스택구조로 동작합니다. 

 

간단한 구조이지만, 많이 쓰이기 때문에 반드시 알아야 하는 구조입니다.

728x90
반응형
반응형

안녕하세요. 

 

오늘은 파이썬 기본 문법인 List와 Dict을 활용한 면접 문제 코딩을 하나 작성하도록 하겠습니다. 

 

tuple( ( ) 사용) : 일반적으로 배열(정적할당)처럼 사용된다. 그러므로 불가변적으로 변수를 집어넣을 수 없다.

List( [ ] 사용 ) : 일반적으로 배열(동적할당)처럼 사용된다. 그러므로 가변적으로 변수를 집어 넣을 수 있다.

Dict( { } 사용) : List와 달리 Index도 입력해야한다.

 

그렇다면 Dictionary은 왜 사용하는가? 

 

그 이유는 데이터 처리에 있어 Dict은 프로그래머가 이미 Index를 알고 있어, 바로 해당하는 데이터로 접근합니다.

 

List는 배열 구조로서 크기가 10(0~9)인 List가 있다고 가정하게 되면, 9번 데이터에 접근하기 위해 순차적으로 인덱스가 0부터 8까지 모두 접근을 한 이 후에 9번에 접근하게 됩니다. 

 

List는 9번을 메모리에 들락날락한다면, 

 

DIctionary는 단, 1번으로 자신이 원하는 메모리에 접근할 수 있습니다. 

 

그러므로 List에 비해 DIct의 속도가 더 빠릅니다. 메모리의 사이즈가 더 커진다면 그 속도의 차이는 더욱 커질 것입니다.

 

 

문제 : List : 사과, 바나나, 딸기, 키위, 복숭아의 갯수가 몇개인가? 

 

#list
fruits = ["사과", "사과", "바나나", "바나나", "딸기", "키위", "복숭아", "복숭아", "복숭아"]

#dict
dict = {}

for fruit in fruits:
	if fruit in dict:
    		dict[fruit] = d[fruit] +1
	else:
		dict[fruit] = 1
        
print(dict)

#결과 : {'사과': 2, '바나나': 2, '딸기': 1,'키위': 1, '복숭아': 3}

 

 

처음에  정답을 봤을 때, 정말 간단한 코딩이지만 List와 Dict에 정확히 이해해야만 풀 수 있는 문제입니다.

 

학기를 시작하여 매일은 아니지만 주에 몇 번씩 파이썬 면접문제를 몇 개씩 올려서 풀어볼려고 합니다.

728x90
반응형

+ Recent posts