개발자

연산할 때 코드를 왜 a = a + 3; 이렇게 쓰는지 잘 모르겠습니다...

2023년 01월 04일조회 4,502

진짜 기초적인 내용인데.. 이해가 안 되는 부분이 있어서 질문 남겨 봅니다. 대입 연산자를 공부하고 있는데, 예시 코드가 이렇게 되어 있습니다. let a = 1; a = a + 3; 두 번째 줄이 a에다가 3을 더해라 라는 뜻인 것은 알겠는데(console.log(a); 해보면 1+3=4가 나오기도 하고요) 왜 `a = a+3`이라고 쓰나요..? 수학적으로 a는 절대 a+3이 될 수가 없는데 왜 a = 이렇게 쓰는지가 궁금합니다. 다른 개발자 분들은 처음에 이거 안이상하셨나요....? (별개로 a+= 3; 하면 3이 더해진다는 건 이해했습니다....ㅎㅎ)

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 11

인기 답변

김대현님의 프로필 사진

저도 참 의아했던 내용입니다. a랑 a + 3이 같다는 게 무슨 말도 안되는 식이란 말입니까?! 아마, 내용은 이해를 하셨는데, 이상하다는 느낌에 공감을 원하시는 것 같습니다. 십분 공감합니다. 공감까지만 하면 될 것 같은데, 제 못된 습성상, 굳이 설명을 더해보겠습니다. 일단 수학시간에 썼던 (=)라는 기호의 의미와, 명령형 프로그래밍 언어에서의 기호가 그 의미가 다릅니다. 기호로 어떤 연산을 약속하고 그대로 수행하는 것인데요, 수학시간에 = 기호는, 그 좌변과 우변을 서로 동치로 보고 상호 치환해서 사용해도 됩니다. 그러나, 보통의 (명령형) 프로그래밍 언어에서의 (=) 기호의 의미는 이렇습니다. "우변의 식을 먼저 계산한 결과 값을 좌변에 있는 변수 자리에 써넣어라." 여기서 중요한 사항이 몇 가지 있는데, 본질적으로 여기에 순서와 타이밍이 중요해집니다. 우변 식을 평가하는 순서가 먼저가 되고, 마지막에 좌변의 변수 메모리 자리에 덮어쓰는 일이 일어납니다. 그래서, 우변에 있던 a와, 좌변에 덮어써진 a는 이름은 같지만, 그 값이 다르죠. 과거의 a값과, 해당 명령이 실행된 다음의 a는 사실 이름만 같을 뿐, 다른 존재입니다. 수학 시간이었다면, 적어도 a' = a + 3 이런식으로 썼을 겁니다. 같은 이름에 대해, 시간에 따라서 다른 값들이 들어가 있으니까, 개발자들이 코드를 읽을 때도, 시간 축을 함께 고려해야 합니다. 원래 있던 값과 바뀐 값들이 있으니, 내가 이해하려는 지금 시점의 값은 무얼까를 코드에는 보이지 않는 상태로서 암산하는 거죠. 다들 그렇게 하고 있지만, 별로 좋은 방법은 아닙니다. 그래서 차라리 const a = 1; const b = a + 3; 처럼 const를 활용하는 게 나을 수 있습니다. const의 경우에는, 해당 범위 내에서 변수값을 바꿀 수 없기 때문에, 해당 변수들이 해당 범위가 끝날 때까지, 동일한 값으로 판단하고, 시점을 고려할 필요가 없어집니다. 게다가, a와 1이란 값을 서로 치환해서 써도 되고, b 도 (a + 3)과 대치해서 써도 됩니다. let의 경우는, 해당 문맥내에서 값이 변할 가능성이 있기 때문에, 각 변수를 읽을 때, 해당 시점을 고려해야 하는 인지적 부담이 있죠. 한편 TMI로 ,아예 함수형 프로그래밍 언어들은, 아예 값이 바뀌는 변수를 정의할 수 없기도 합니다. (JS의 let같은 것이 아예 없는 거죠) 그런 언어들은 =기호가, 수학시간에 배운 =기호와 동일한 의미로 사용됩니다.

profile picture

익명

작성자

2023년 01월 04일

와 우선 상세한 설명과 공감 너무너무 감사합니다 ㅠㅠ "그래서, 우변에 있던 a와, 좌변에 덮어써진 a는 이름은 같지만, 그 값이 다르죠. 과거의 a값과, 해당 명령이 실행된 다음의 a는 사실 이름만 같을 뿐, 다른 존재입니다. 수학 시간이었다면, 적어도 a' = a + 3 이런식으로 썼을 겁니다." 이 부분 덕분에 아주 쉽게 이해되었어요. 그리고 아래에 적어주신 것 처럼 const를 사용하면 문제가 없겠네요! 초보 코린이에게 도움 주셔서 정말 감사합니다!! 새해 복 많이 받으세요!!

고다영님의 프로필 사진

고다영

타이드스퀘어 백엔드 개발자2023년 01월 04일

오, 좋은 답변이네요. 저는 =의 정의를 다르게 생각하면 간단한 문제라고 생각했는데, 답변을 읽곤 시점 고려에 대한 인지적 부담도 인지하게 됐네요. 생각해보니 클린코드에서 불필요한 전역 변수를 최대한 지양하는 것도 비슷한 이유 때문 같아요 :)

제상영님의 프로필 사진

제상영

HSM 백엔드2023년 01월 05일

어떻게 설명을 이렇게 기분 좋게 해 주실 수 있나요 :)

배진훈님의 프로필 사진

배진훈

Junior Embedded Developer2023년 09월 27일

와... 대입 연산자의 정의를 이렇게 쉽게 설명할 수도 있군요...

한민희님의 프로필 사진

한민희

UXUI 디자인 취준생2023년 12월 12일

배우면서.... ' 현실 공간과 같은 듯 다른 컴퓨터 안에서의 공식, 약속인가 보네 + 만든 사람이 그냥 정의를 이렇게 했으니 이렇게 외워야 하나보다- '라고 생각하고 넘겼는데 답변 내용이 좋네요 :)

김태호님의 프로필 사진

‘같다’ 가 아니라 ‘는’ 으로 대응시켜서 그대로 읽으면 이해가 되실 겁니다

ㅇ0ㅇ님의 프로필 사진

프로그래밍 언어에서 = 는 같다가 아니라 대입을 의미하기 때문입니다.

ShinHyoyoung님의 프로필 사진

= 는 동일함을 뜻하는 등호 기호가 아닌, 대입연산자, 즉 우변에 있는 값을 좌변에 대입시키는 연산을 하는 것입니다. a = a + 3 은 변수 a에 3을 더한 값을 변수 a에 대입시키라는 연산을 처리하는 것입니다. c나 자바에서는 대입연산자와 등호의 혼동을 막기 위해 등호에 == 를 사용하여 구분하고 있습니다.

이민재님의 프로필 사진

간단하게 설명해보자면. a는 미지수가 아니고, 공간을 정의하고있기 때문입니다. 메모리는 유한한 메모 공간이고, 이를 A4용지라고 생각해봅시다. a는 단순히 A4를 접어서 만들어진 좁은 공간이고. 여기에 적혀있는 숫자를 계속 지우고 다시 그리고 있다고 생각하시면 편합니다. 요즘은 HW의 성능도 좋아졌고, 컴파일러가 잘 최적화를 해주기때문에 수학적으로 올바른, 수식을 해석하여 a의 값을 구할수 있는 언어들도 많이 나오고 있습니다.(보통 함수형 프로그래밍이라는 특징이 있죠.) 하지만, 과거에는 충분하지 못하였고, 좁은 용지를 최대한 활용하려던 흔적이라고 생각하시면 이해하시기 편하지 않을까 싶습니다.

진희도님의 프로필 사진

여기서 =은 대입 입니다. 수학에서의 =과 다릅니다. a에다가 a+3을 대입한다. 라고 생각하면 됩니다.

김주호님의 프로필 사진

F# 이라는 언어에서는 변화할 수 있는 값은 반드시 mutable로 선언해야하고 재할당은 = 이 아니라 반드시 <- 로 표현해야합니다. 글쓴이처럼 생각하는 언어도 존재합니다

안태준님의 프로필 사진

정확히 말해 = 는 assignment operator 입니다 그러므로 a = b 이 의미는 변수(variable) a 공간에 값(value) b를 할당(assign)한다는 operation의 의미입니다.

behappy님의 프로필 사진

개발적이진 않지만 . 문화차이로 인한 분석도 한번 볼만 합니다. http://findhappy.net/?p=90

아림님의 프로필 사진

저도 처음 입문했을때 많이 했갈렸던 부분입니다. 프로그래밍에서는 일반적으로 '='는 우항의 것을 좌항으로 대입시키는것을 뜻합니다. let a = 0; a = a + 3 을 해석하면 a라는 변수를 0으로 선언하고, a + 3 을 a에 대입한다라는 뜻입니다. a = a + 3에서 '='를 같다로 인지하시지 마시고 '='는 우항의 값을 좌항에 덮어쓰기한다 이런식으로 이해하시면 쉬우실거 같습니다.

판도라님의 프로필 사진

일반적으로 프로그래밍 언어에서 = 연산자는 우변의 것을 좌변에 대입한다 로 이해하시면 좋겠습니다. 오히려 같다의 경우, ==, === 와 같은 연산자를 이용합니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!