[Q] 클래스 멤버 변수와 지역 변수의 차이는?

신참 직원에게 DAO 패턴을 실전에 적용하는 과정을 가르치던 중입니다.
그런데, 제가 오늘 엄청 화를 내고야 말았죠.
배우는 신참 입장에서야 잘 모르니까 이것저것 아는데로 코드들을 집어다 쑤셔 넣었는데,
제가 보기에는 영 아니올시다 였거든요.
모니터를 함께 뚤어져라 쳐다보면서 이거 좀 이상하지 않냐라고
물어도 신참은 도무지 모르겠다는 표정입니다.

문제는 굳이 클래스 멤버로 선언할 필요가 없는 곳에 클래스 멤버 변수를 선언했더군요.

사실 변수를 선언할 때 멤버 변수를 사용하건, 지역 변수를 사용하건 문법적으로는 큰 차이가 없습니다.
그리고, 둘 다 왠만하면 잘 동작합니다.
하지만, 실제 동작할 때 두 가지 변수 유형이 동작하는 방식은 사뭇 다릅니다.
게다가 절대로 멤버 변수를 사용해서는 안되는 경우도 많이 있습니다.

과연, 변수를 선언할 때 어떤 기준으로 함수의 지역 변수 혹은 클래스 멤버 변수를 사용하시는지요?
이 정도 문제는 너무 쉽다고 생각하시는 분들은 가급적 비공개 답변을 부탁드립니다.

사실 우리가 살아가면서 알아야 할 것은 모두 유치원에서 배웠다고 합니다.
그런데, 과연 우리는 직업적으로 절실히 필요한 기초를 제대로 알고 있는 것일까요?

이런 문제들을 대해 종종 집어볼 요량입니다.
관심 없으신 분들은 까칠한 덧글 남기지 마시고~ 패스해주시리라 믿습니다.

by 써니 | 2008/02/12 00:31 | S/W Q&A | 트랙백 | 핑백(1) | 덧글(11)

Linked at Heart’s Co.. at 2008/05/22 23:26

... ;s CodeList 검색 Home Feb 12 흥미로운 문제들… 080212 Tag: Dev.Think — Heart @ 5:29 오후 [Q] 클래스 멤버 변수와 지역 변수의 차이는? [Q] 자바에서 문자열을 합성하는 방법 얼핏 보면 엄청 쉬워 보이지만 곰곰히 생각하면 어려운… 내공에 따라 답이 갈릴 것 같은 그런 문제들인 ... more

Commented by 어이 at 2008/02/12 11:58
변수의 수명은 짧을 수록 좋으니까 사용하기 직전에 선언해야겠죠.
Commented by 지나가다 at 2008/02/12 12:06
지역 변수로 해보고 안될것 같으면 멤버 변수를 생각합니다.
(앞 과정이 생략될 경우가 많지만;)
Commented by Heart at 2008/02/12 13:23
변수를 적어 넣을 때, 먼저 변수의 범위를 생각합니다.
이 변수를 현재의 클래스 구현 시점에서 보았을 때, 그리고 '당장'(미래까지 생각하기엔 능력상...) 구현해야 할 기능들까지 고려해 보아서 하나의 메소드에만 사용된다면 지역 변수로 선언하고, 여러 메소드 혹은 클래스 외부에서도 사용된다면 필드로 선언합니다.
구현이 엉키거나, 변경 사항이 생겨서 어쩔 수 없게 될 때에는 지역 변수 <-> 필드 이동을 합니다.
최선책은 아니지만(최선책은 클래스 설계를 잘 해서 변경 사항이 생겨도 영향을 받지 않는 게 아닌가 생각합니다.) 차선책 정도는 되지 않을까요? ^^;;
Commented by 숏다리영감 at 2008/02/12 16:00
프로그램 짤때는 아무렇게나 짜도 이해가 되지만, 며칠 지난 후 다시 쳐다보면 아득해지더군요. 그래서 클래스 하나는 하나의 책임에 충실해야한다. 이런 원칙이 머리속에 들어오고, 그렇다보면, 그 책임에 관계된 것들만 클래스 변수로 남고, 나머지는 다 로컬변수로 처리합니다. 내부 구현을 위해 클래스 변수를 사용해서 파라미터 사용을 절약하면 코딩은 쉽지만, 디버깅, 유지 보수, 기타 프로그램 로직이 꼬여서 비용이 많이 듭니다. 클래스 변수는 곧 글로벌 변수 뭐 이런거죠..
Commented by 낚시광준초리 at 2008/02/12 18:27
윗분 말씀 처럼 클래스의 멤버변수는 전역변수와 같은 기능이라 생각을 합니다.
가급적 여러군데에 사용될 데이터라면 멤버변수로 사용 하고 그렇지 않은 경우 지역 변수를 사용 해서 처리를 많이 하려고는 합니다.
그러다가 가끔 귀차니즘에 이것저것 생각 안하고 멤버변수로 사용하는 경우도 종종.. 흠흠.....
(그런데 정말 OOP프로그램은 잘안하게 되어서 무엇이 좋은지는 모르겠다는 쿨럭~~~~)
Commented at 2008/02/12 22:49
비공개 덧글입니다.
Commented by Lohengrin at 2008/02/12 23:17
멤버변수는 객체 내에서 공유될때, 정적 멤버 변수는 클래스 내에서 공유할때
Commented by 이홍석 at 2008/02/13 00:28
전 퍼포먼스는 처음에 전혀 고려하지 않지만 그렇다 하더라도
멤버변수를 만들면 객체의 상태가 생기게 되고 그럼 또 그로 인한 sideeffect 가 생겨나므로
결국 그 클래스를 사용하기 위해 외워야할게 많아진다는 것 때문에.. 멤버변수를 싫어해요 ㅇ.ㅇ
객체=상태+메소드 라고 보고 상태를 유지하는데 꼭 필요한 것만 클래스의 멤버변수로 선언하려고 합니당
Commented by nemo at 2008/02/13 21:19
초보 입장에서 조금 적으면 기초가 참 쓰기가 어렵더군요
지역 변수로 생각했는데 나중에 만들다 보면 메소드가 늘면서 클래스 변수로 사용하게 되는 경우라든가
클래스 변수로 만들었다가 메소드를 수정하면서 지역 변수가 되는 경우를 보면
난 여기 왜 앉아있나
Commented at 2008/02/14 11:10
비공개 덧글입니다.
Commented by jongidal at 2008/02/25 11:23
쓰레드 안정이 최고 문제죠.
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.

◀ 이전 페이지          다음 페이지 ▶