안녕하세요.
프갤에서 정말 많이 배우고 있는 학생입니다.
프로그래밍에 관련된 것뿐만 아니라 현업에서 계시는 분들의 생활도 조금씩 배울 수 있어서 좋은거 같아요.
질문드리고 싶은건 두 가지입니다. 부디 한번씩만 읽어주세요
1.
음 C++ C# java에 보면 try catch문이 있잖아요근데 이걸 배우는 학생의 입장에서는 뭐가 좋은건지 왜 쓰는건지 잘 모르겠습니다.
실제로 try catch문이 언어가 발전하면서 없어지지 않는 이유는 정말로 필요해서 그렇다고 생각하는데
업무에서도 많이 사용하시는지요?
2.
그리고 한가지만 더 여쭤볼게요ㅠㅠ 모르는게 많아서 죄송합니다.
MFC에서 쓰레드를 돌릴때 전달되는 함수는 전역함수이거나 클래스 내부에서 선언된 static(정적) 함수여야 하잖아요
이때 정적 함수를 이용하는 이유는 뭘까요? static 함수로 만들게되면 전역함수일때와 차이가 없는것 같은데
언제 static 함수로 만들어서 쓰레드를 돌리면 잇점이 있을까요?
현업은 아니지만 ㅠㅠ , 예외처리 장점은 스택풀기, 수많은 예외 제공 2개 인듯, 예외가 웬만한건 다 있어서 걍 상속해 쓰면 되더라고요
2번 질문은 \'클래스를 왜 쓰나\'랑 관련해서 생각해보면 좋을듯
답변 감사합니다. 저도 예외처리의 장점에 대해서 생각은 해봤는데 아무래도 코드가 끊김없이 (예외를 알고리즘 중간에서 확인하지 않아도 됨) 진행될 수 있다는게 제일 큰 장점인거 같긴한데... 그렇게 큰 장점인지는 좀 모르겠더라구요. 음 그리고 스택풀기는 잘 몰랐네요 찾아볼게요 고맙습니다.
와 진짜 존나 좋은질문인데 내가 좆밥이라 아는것만 얘기하면 예외처리는 나중에 깊게들어가면 Exception 클래스 상속받은 세부적인 예외들이 존나많은데, 사용자가 원하는 정보들을 포함하고 있지, 콜스택을 봐야만 알 수 있는 경우의 예외들도 있지만 싱글스레드에서 일반적인 처리중 발생하는 예외에서는 필요한 거의 모든정보를 가질 수 있고, 이 정보를 포함하여 프로그래머는 발생한 예외에 대해 조금 더 세부적인 처리를 할 수 있지 - 예를들면 네트워크 같은경우는 전혀 예상치 못한곳에서 문제가 발생할 도 있으니까-
Object oriented 에서 클래스는 객체 하나를 추상화한거라고 볼 수 있는데 static 으로 선언된 함수 내에서는 클래스 내부의 특정 함수나 변수에 종속적인 코드를 짜면 안 되지 않나요? 사실 static의 개념 자체가 객체 지향과 안 어울리는 것 같은데... 그 부분에서 좀 어지러워요ㅠㅠ
쓰레드 함수포인터로 넘길 함수를 static으로 만드는 이유는 다음과 같다.
클래스에서 static이 아닌 함수가 실제로 호출될 때는 this포인터가 인자로 넘어가는거 알지?
2번은 그냥 지웠어 - 이건 다른횽들 얘기좀 들어봐야지
근데 쓰레드 API함수에서는 이렇게 this포인터가 포함된 함수를 인자로 받을수가 없어. 쓰레드 API함수들은 그냥 단순 함수포인터만을 받도록 짜여져있거든
근데 static으로 선언된 클래스 멤버함수는 호출시에 this포인터를 넘겨주지 않으니깐, 쓰레드 API함수의 인자로 쓰일수가 있지.
근데 static함수는 인스턴스에 당연히 접근할 수 없잖아?! 그래서 쓰레드API함수에서는 함수포인터와 함께 같이 넘겨줄 인자를 추가로 받는다. 보통 여기에 this포인터에 상응하는 포인터를 넘겨주지. 그러면 클래스의 static함수가 호출될때 그 포인터가 넘어오고, static함수내에서는 그 포인터를 이용해서 클래스 인스턴스에 접근할수가 있지.
그니깐 한 줄 요약하자면, this포인터가 인자로 적용된 함수를 주고 받을수 없는 c/c++의 한계때문에 어쩔수없이 static함수를 사용해서 그걸 대체해야한다는거지.
이건 나의 이해일뿐이고, 진짜 고수횽님들은 더 좋은 생각을 가지고 계실거야ㅠ
1. 니가 컨트롤할수 없는/모르는 에러가 생길수 있단다. try는 다 잡아주지. 근데 문제는 느려짐. 속도가 중요한 프로그램은 try문을 최소한으로 쓰도록 (쓰지말도록)하쟈
카드전산에서 예외따윈없다 예외나온거 패쓰따위하면 한순간에 몇천만원날라가... 무조건예왼 오류 ㅆㅂ 쓸줄은 아는데 안써
현업 초짜 C플머지만.. 예외처리는 꼭 필요해.. 어떤 코드가 100% 예상대로 동작한다는 보장이 없을경우가 분명 있을거거든.. 그럴때 쓰는거임 ㅎㅎ
소켓쪽을 예로 들어보면, 서버 역활을 하는 프로그램인데, 클라이언트가 예고없이 접속을 끊었고, 서버쪽에서는 당연히 클라이언트가 존재한다고 생각해서 코드를 실행했다.
네 답변 감사합니다. 사실 쓰레드에서 전역 또는 static을 받아야 한다는 점에서는 저도 인정하고 왜 그래야만 하는지는 어렴풋이 알겠습니다. 하지만 궁금한 점은 전역함수가 아닌 클래스의 static 함수를 사용했을 때 어떤 장점이 있는지에 대해서 알고 싶습니다. 성의있는 답변 감사합니다. 조금 더 고민해보겠습니다.ㅠㅠ
당연히 코드가 실패할거겠지? 그럴때 예외처리를 하는거임. 뭐.. 접속끊긴 클라이언트 정리라던가 그런거 ㅎ
ㄴ가장 단순한 답변은 전역함수가 아니라 클래스의 static함수를 사용해야지만 클래스의 protected, private멤버에 접속할수 있으니깐ㅎ
접속->접근
장점은 일단 스택메모리에 상주하고 있으니까 레퍼런스의 생성/소멸이 일어나지 않지 - 단점이라면 동일한 메모리를 참조하기때문에 동기화가 일어나지 않으면 전혀 엉뚱한 값이 나올 수 있게 되지-
오호 private 멤버에 접근할 수 있다는 점을 생각 못 했네요. 그런 점에서 중요할 것 같습니다.
개xy // 전역 함수도 스택 영역에 들어가지 않나요? 그런 점에서 장점이 될 수 있을까요?
내가 쓰는 언어에 전역변수가 없어서 차이점을 말해줄 수는 없지만 스택메모리에 올라간 공통적인 특성이니까 적용되지 않을까 조심스레 예상해본다
static을 쓰는 이유는 모든 클래스에 딱하나의 함수나 변수만 있어서인듯한데..멀티쓰레드면 mutex나 세마포어같은거 써서 lock컨트롤안해주면 데드락걸린다
예외처리를 쓰는 이유는 편하니까? 정도.. catch/finally clause로 갖게 되는 편리함은 엄청남. c같이 예외가 없거나 systemcall을 직접 쓰는 경우는 예외처리도 안되서 항상 반환 값을 체크해야서 코드가 졸라 길어지고 상당히 불편함(안 하면 오염된 데이터가 다음 단계로 넘어가다가 SIGSEGV가 뜨겠지). glib였나 어디였나에서 setjump/longjmp 이런걸 이용해서 예외처리를 에뮬레이션하기도 하는데.. 언어차원에서 해주는게 아니라 병맛나고 뭐 그러함.