세 가지 기준으로 점검해볼게요.
obj만 읽음)세 기준 모두 No니까 순수함수예요.
"같은 obj를 넘겼는데 외부에서 .name이 바뀌면 결과가 달라지지 않나요?" 라는 의문이 자연스럽게 떠올라요. 맞아요, 그렇게 동작해요. 하지만 그건 함수의 죄가 아니라 호출자의 책임이에요. getName은 받은 객체의 현재 상태를 정확히 반영해 반환할 뿐, 자기는 아무것도 안 바꿔요. mutable한 객체에 의존한다는 점이 마음에 걸리면 Object.freeze(obj)로 굳혀 넘기면 참조 투명성까지 완벽해집니다.
같은 기준으로 점검해보면:
하나라도 Yes면 비순수예요.
"console은 우리가 관리하는 상태가 아니지 않나요?" 라는 반박이 자연스러워요. 여기서 헷갈리기 쉬운 정의 하나를 짚어야 해요 — 부수효과는 "내가 관리하는 상태"가 아니라 "외부에서 관찰 가능한 모든 변화"를 말해요. 함수 호출의 결과로 외부 세계(터미널 출력, 파일, 네트워크, DOM…)가 달라지면 전부 부수효과예요.
참조 투명성 테스트로도 확인할 수 있어요. add(1, 2)를 그 결과인 3으로 그냥 치환해도 프로그램이 동일하게 동작해야 순수인데, 치환하면 콘솔 출력이 사라져요. 동일하지 않으니 비순수.
비공식적으로 "로깅 정도는 순수에 가깝다" 같은 표현을 쓰기도 하지만, 학술적 용어는 아니에요. 엄밀히는 그냥 비순수이고, 그 비순수성이 코드 로직에 영향을 주느냐는 별개 문제로 사람이 맥락으로 봐야 해요.