백엔드 개발자(node.js)가 되는 과정

파이썬 vs 자바스크립트 코드의 차이

soopy 2023. 5. 23. 00:19
728x90

파이썬으로 DS 분야를 공부했던 입장에서 자바스크립트는 확실히 복잡하게 느껴졌다.
같은 객체 지향 프로그래밍 언어라서 입문 수준의 코드를 익히는게 어려운 일은 아니었지만
왜 이렇게 했을까? 라는 의문이 드는 몇 가지가 있었다.

1. default parameter 출력에 관하여

function greeting(name='apple', name2, name3) {
  console.log(`Hi ${name}`);
  console.log(`Hi ${name2}`);
  console.log(`Hi ${name3}`);
};

greeting(undefined, 'ball', 'cat')

위 함수에서 name 파라미터에 디폴트 값을 사용할 경우 undefined를 써줘야 한다.
개인적으로 이 부분이 조금 불편하게 여겨졌다. 디폴트값을 지정했는데 또 undefined를 입력해야한다니...
하지만 코드가 거대해졌을 때 해당 자리는 디폴트값이 적용되었다는 것을 확실히 알 수 있으니 그 점이 장점으로 보였다.

def greeting(name2, name3, name='apple'):
    print(f'Hi {name}')
    print(f'Hi {name2}')
    print(f'Hi {name3}')

greeting('ball', 'cat')

파이썬의 경우 우선 디폴트 파라미터는 무조건 뒤로 옮겨야 한다. 그렇지 않으면 코드 자체가 작동하지 않는다.
name파라미터가 디폴트 값이 존재하여 name2, name3 파라미터의 뒤쪽으로 이동시킨 것을 볼 수 있다.
그래서 디폴트값을 쓰고 싶다면 디폴트값이 없는 앞부분만 차례대로 쓰면 된다.
자바스크립트처럼 undefined를 안써도 되서 외관상 깔끔해 보이기는 하겠지만 자바스크립트처럼 "이 파라미터는 디폴트값을 씁니다." 라고 명시할 방법이 없으므로 해당 함수의 디폴트값이 있을 수도 있다는 전제를 항상 가져야 한다.

하지만 재밌는 사실은 자바스크립트도 파이썬처럼 디폴트값을 지닌 파라미터를 뒤쪽으로 배치한다면 디폴트값에 대한 생략이 가능하다는 점이다.

function greeting(name2, name3, name='apple') {
  console.log(`Hi ${name}`);
  console.log(`Hi ${name2}`);
  console.log(`Hi ${name3}`);
};

greeting('ball', 'cat')

이게 가능하기 때문에 자바스크립트 함수도 결국 파이썬 함수처럼 내가 모르는 디폴트 값이 있는지 없는지 살펴보는 과정을 피할 수 없다.
만약 위 코드가 오류가 나고 greeting('ball', 'cat', undefined)로 입력해야 올바로 작동한다라는 규칙을 갖고 있었다면 "자바스크립트는 디폴트 파라미터의 존재를 함수 사용 코드만 봐도 알 수 있다." 라는 특징을 지녔을 것 같은데 그렇지 않은 것이다.
그렇다면 디폴트 파라미터의 자유로운 배치가 어떤 부분에서 유용할 수 있는지 잘 모르겠다.

2. for문에 관하여...

자바스크립트는 왜 for, for...of, for...in, forEach 왜 이렇게 많은건가?
아직 경험이 얼마 없어서 그런 걸지도 모르겠지만 for와 forEach만 있어도 충분하지 않나? 라는 생각이 들었다.

// for
for (let i = 0; i < 10; i++) {
  console.log(i)
}
// forEach
let numArray = [...Array(10).keys()] // 또는 Array.from({ length: 10 }, (_, index) => index);
numArray.forEach ((i) => {
  console.log(i)
})

for문도 forEach로 대체할 수 있으면 필요없겠다는 생각이 들었지만
코드가 다소 복잡해지는 경향이 있으니 그냥 for문을 쓰는게 낫겠다는 생각이 들었다.
만약 0~9까지의 숫자를 담은 배열 생성 코드가 파이썬 코드처럼 range(10)과 같이 짧았다면
for문도 필요 없을 것 같다는 생각이 든다.

for i in range(10):
    print(i)

for...of와 for...in도 살펴보자

array = [1, 2, 3, 4, 5]
// for...of
for (num of array) {
  console.log(num)
}

// forEach
array.forEach ((num) => {
  console.log(num)
})

object = {'name': 'apple', 'age': 23}

// for...in
for (key in object) {
  console.log(object[key])
}

// forEach
objectKeys = Object.keys(object)
objectKeys.forEach ((key) => {
  console.log(object[key])
})

for...in과 for...of는 forEach로 쉽게 대체할 수 있다. 이 둘은 정말 필요없다는 생각이 들었다...앞으로도 이 둘을 쓸 일이 있을까? 라는 교만한 생각을 잠깐 해본다.

파이썬은 어떨까?

array = [1, 2, 3, 4, 5]
for num in array:
    print(num)

object = {'name': 'apple', 'age': 23}
for key in object:
    print(object[key])

파이썬에서는 for문의 iteration 대상이 array라면 요소를 꺼내고 object라면 key값을 꺼내준다.

3. 변수에서 object로, object에서 변수로 전환하는 코드

자바스크립트 코드에서 가장 맘에 들었던 부분이 이 부분이 아니었나 싶다.

object = { 'username': 'apple', 'age': 23 };

// object의 value를 key변수명에 할당
let { username, age } = object

// 변수명을 key로, 값을 value로 한 object 생성
object2 = { username, age }

이를 파이썬으로 구현하려면 아래와 같이 세상 번거롭기 때문이다.

object = {'username': 'apple', 'age': 23}

# object의 value를 key변수명에 할당
username = object['username']
age = object['age']

# 변수명을 key로, 값을 value로 한 object 생성
object2 = {'username': username, 'age': age}

 

결론적으로 파이썬은 50년차 장인이 지금까지 경험한 모든 변수를 고려하여 제작한 언어같은 느낌이었고, 자바스크립트는 20대 청년이 시행착오를 겪으며 제작한 언어 같은 느낌을 받았다.
그리고...코딩테스트는 파이썬으로 해야겠다는 생각이 확고해졌다.

728x90
728x90