aeba
20
2017-03-17 16:24:55.0
20
2092

대학생 입장에서 옛날 언어를 배우는게 메리트가 있나요


얼마전에 알고리즘 문제푸는 대회? 이런게 있어서 가봤습니다.


C, C++, Java 이중에 하나 선택해서 답안을 제출하는건데 버전은 모르고 들어갔습니다. C/C++은 gcc 4.8, Java는 1.7로 제출하는거더군요. C++98, Java 1.7중에 고민하다가 자바를 썼었는데, 결국 아슬아슬하게 몇가지 에지케이스를 해결 못해서 탈락했습니다.


탈락은 그냥 못풀어서 탈락한거니까, 실력의 부족을 통감하고 그 이후로 알고리즘 문제를 매일 꾸준히 몇개씩 풀기 시작했어요. 그런데 그 이후로 언어 문제가 자꾸 신경이 쓰이네요. 사실 처음엔 C++만 해도 C++14가 나왔고 얼마 후에 C++17이 나오는 판국이고, 자바도 얼마 후면 Java 9가 나올텐데 람다도 없는 C++98이나 Java 7을 지금와서 공부해야하나 이런 생각이 들었어요. 근데 조금 생각하다 보니까 어차피 어딘가에 입사해서 볼 코드는 다 레거시 코드일 테니까 이걸 메인으로 공부하지 않으면 취업자체가 힘들거란 생각에 마음이 계속 무겁네요... 람다식/fold/map/filter가 몸에 익어버리는 바람에 루프가 낯섭니다.


정말 별거 아닌 경험들이지만 어쩌다 보니 제가 참여해온 프로젝트의 핵심 기술들은 다 제가 정하게 되는 바람에 약간 제 취향의 기술만 연습하고 사용하게 된 것은 사실인것 같아요. 개발 경험의 대부분은 스칼라(Play 2.x), 클로저, Node.js(RxJS)고요. 이대로 비주류 언어/기술만 연습하게 되면 나중에 일자리잡기가 힘들게 되려나요... 간단한 검색으로는 함수형 다루는 신입은 그냥 뽑는곳 자체가 없는것 같아서 불안하네요.


그냥 졸업할때까지 잘하고 좋아하는거 공부하고 프로젝트 하고 레거시 코드가 눈앞에 닥치면 그때부터 공부하는게 나을까요? 아니면 지금이라도 람다없이 코딩하기 연습을 하는게 좋을까요?


선배님들의 조언 부탁드립니다 (__)

1
0
  • 댓글 20

  • 더미
    4k
    2017-03-17 16:26:44.0

    먼가 큰 착각을 하시는게 같은데...

    람다가 포함된다고 자바가 자바가 아니고 C++ 이 C++이 아니게 되는게 아니에요.

    그냥 공부하세요.

    0
  • 꾸아앙
    304
    2017-03-17 16:33:58.0

    옛날 언어라길래 포트란, 코볼같은건줄 알았는데....

    저도 그냥 공부하는거에 한표던지겠습니다

    0
  • LichKing
    4k
    2017-03-17 16:36:15.0

    옛날언어라고해서 포트란 코볼 이런거일줄알았는데...

    java8로 왔기때문에 java7에서 안쓰는거 하나도 없습니다.

    람다가 몸에익어서 모든 반복문을 스트림으로만 쓰시나요? for문을 써야하는 경우도 분명히있을텐데 자바7을 따로 공부한다는게 무슨 말씀인지 모르겠네요.

    0
  • 머슴
    3k
    2017-03-17 16:38:02.0

    노테이션의 어떤면에서는 코볼이 제일 선진화 된거 같은데요 ㅋ

    0
  • 엘딘
    958
    2017-03-17 16:39:18.0

    JAVA 1.7 이 옛날 언어군요... 

    0
  • 더미
    4k
    2017-03-17 16:39:30.0

    자바7이든 자바8이든

    자바는 자바라는겁니다.

    자바9를 기다려서 공부하겠다는건 핑계에 가깝습니다.

    0
  • 심심한사부
    483
    2017-03-17 16:40:01.0

    이삭줍기 차원에서 하고나면 언어에 대한 이해가 넓어 집니다.




    0
  • 말년개발
    1k
    2017-03-17 16:42:06.0

    솔직히 람다나 스트림에 익숙해지면

    for문쓰면 무언가 코딩을 잘못하는거 같은 느낌이 들기는하죠.

    하지만..결구 도구일뿐.

    그런거 가리면서 일하면 안됩니다.

    1
  • aeba
    20
    2017-03-17 16:44:14.0 작성 2017-03-17 16:48:52.0 수정됨

    제가 글을 잘 못 적어서 오해가 많으신거 같은데 람다만 갖고 얘기하려는게 아닙니다.


    예를들면 C++를 공부할때 std::unique_ptr를 디폴트로 쓰고 굳이 필요 없을때 그냥 포인터를 쓰는걸 연습해야 하는게 맞는지, 아니면 어차피 C++98 을 만질 일이 많을테니 디폴트로 포인터를 쓰고 std::unique_ptr은 아 이런게 있지 이렇게 기억정도만 해놓는게 맞는지 전체적으로 이런걸 대하는 태도가 어떤게 더 현명한건지가 궁금합니다.


    추가) 어쨌든 많은 답변 감사합니다 공부 안하려고 꾀부리는거 아니에요...

    0
  • 에르딘트
    1k
    2017-03-17 16:45:20.0

    Java... 아직 1.4, 1.5도 현역입니다. 

    뭘 쓰는지는 선택이지만 알기는 다 알고 있어야 상황에 맞게 좋은거 골라 씁니다.


    0
  • 협군
    1k
    2017-03-17 16:47:33.0 작성 2017-03-17 16:51:41.0 수정됨

    옛날 언어라 그래서 저는 포트란, 코볼, 클리퍼, LISP 같은 거 말하는 줄 알았습니다.

    말씀 하신 것은 확장의 개념이지 다른 언어가 아닙니다.



    추가)

    공부 자체는 그냥 하고 싶은대로 하세요.

    어차피 언어 문법 공부는 하루이틀 정도면 익히는 거잖아요? 말씀하신 레거시 코드 역시 익숙하지 않고 하기 싫은 거지 개념 자체를 알면 공부하는 거야 십여분이면 되잖아요.

    1
  • 수송대원
    72
    2017-03-17 16:58:40.0

    개인적인 생각으로 혼자개발하고 혼자 운영한다면 큰문제는 없어보이긴 하지만

    다른사람과 의사소통이라는게 들어간다면 위에분 말씀대로 알아서 나쁠건 없어보이네요.

    0
  • jinius
    420
    2017-03-17 17:01:31.0

    저만 오해하고 들어온건 아니었군요 ㅋ

    0
  • 마이러닝
    296
    2017-03-17 17:11:33.0
    포트란을 볼줄 알았는데 자바 1.7을 보네요...... 공부하세요. 4년이 지나도 사용할 언어니까
    0
  • 하마
    3k
    2017-03-17 18:17:25.0 작성 2017-03-17 18:33:42.0 수정됨

    무슨 고민인지 충분히 이해합니다.

    나는 아래와 같은거 공부하고 체득했는데.. (개인적인 정리를 상기 시켜봄 ㅎㅎ 옛추억이..) 



    1. Scoped_ptr (boost)

    0. 복사불가 단일 소유자
    1. 
    한마디로 scoped_ptr  복사할  없는 auto_ptr 이다
    2. 
     가볍습니다.
    3. 
    제한적이다. ( 함수 내에서만 동적할당해서 쓰다가 함수를 끝낼 때는 삭제해야 하는 임시 객체를 처리할 때도 유용하게 쓰일  있습니다)
    4. 
     스마트포인터를 포함하고있는 클래스도 복사불가입니다.
    5. "
    자원 획득은 초기화 이다." 만을 위해 존재한다레퍼런스 카운팅이 없고소유권공유,이전문제도 없다.
    6. 
    명확한 쓰임새를 위해서 비전에서 이것으로 교체하는게 좋을듯합니다.
    7. STL 
    컬렉션과 함께 사용불가


    2. Scoped_array (boost)

    0. 동적으로 할당한 배열에 대해 사용
    1. 
    복사불가 단일 소유자
    2. 
    동적인 배열이 필요하다면 std::vector라는 훌륭한 대체 수단이 이미 존재하는 관계로
     scoped_array 사용 목적은 주로 오래되고 복잡한 코드를 유지 보수하면서 혹시나 delete[] 잊을 수도 있는 후임자를 위해 사용해라가 되겠습니다.


    3. auto_ptr (C++98)

    0. 복사가능 단일 소유자
    1. 
    한마디로 복사할수있는 Scoped_ptr 입니다.
    2. A->B 
     복사하고나서 A  소멸되면 B 스마트포인터는 빈곳을 가르킨다면 대략 낭패입니다.
    3. 2
     문제를 해결하고자 auto_ptr에서는 소유권을 이전시켜버립니다. A  복사하는순간 쓸모없어지는것이지요.
    4. 
    레퍼런스카운팅을 하지 않는다. (단지 소유권 이전으로 단일 소유자만 존재)
    5. STL 
    컬렉션과 함께 사용불가


    4. shared_ptr (C++TR)

    : 0. 복사가능 공유소유자
    : 1. 
    레퍼런스 카운팅을 통해 공유를한다가장 마지막 소유자가 제거될때까지 힙에 존재합니다.
    : 2. STL 
    컬렉션과 함께 사용가능
    : 3. 
    가장 무겁다.
    : 4. Copy on write 
     아니다한쪽에서 값이 바뀌면  모든 소유자가  바뀜.


    5. weak_ptr (boost)

    : 0.weak_ptr  share_ptr  초기화 되어야 한다는 제약.( 이것은 share_ptr 관련되어서만 사용해야함.)
    : 1.weak_ptr
     객체의 생명주기에 영향을 주지 않는다. (레퍼런스 카운팅에 영향을 안준다는뜻)
    : 2.enable_shared_from_this<>
     내부적으로 weak_ptr 이용하여 this 포인터의 shared_ptr 전달 문제를 해결하고 있다.
    : 3.
    보통 shared_ptr  circular reference 문제를 해결하기위해 사용된다.

    6. unique_ptr (C++11)

    : 0. auto_ptr shared_ptr 사이의 절충안
    : 1. unique_ptr
     기본적으로 auto_ptr 유사하게 소유권의 이전에 기반한 동작을 한다
    : 2. 
    그러나 일반 복사 생성대입 연산이 아닌 C++11에서 새롭게 추가된 R-value reference 이용한다는 것이다.
    : 3. C++11
    에서 STL 컨테이너에서도 효율성을 위해 내부적인 복사  대입 동작은 전부 R-value reference 이용하도록 바뀌었는데
    일반 복사  대입 연산자를 막아 버리는 대신 R-value reference 이용한 복사  대입 연산자만 정의한다면 STL에서도 사용할  있는 auto_ptr 생긴다는 것이 unique_ptr 의미이다.
    : 4. STL 
    컨테이너에서도 사용할  있다.
    : 5. raw pointer
     비해 추가적인 오버헤드도 없는 스마트 포인터라   있다의미적인 뚜렷함과 안전한 사용을 위해 대부분의 암시적인 변환이 막혀 있고일반적인 대입  복사가 막혀있으므로 unique_ptr 끼리의 대입에는 std::move 함수를 명시적으로 사용해야 하는  코딩량이 다소 늘어난다는 불편함이 있으나안전하고 속도개선의 코딩을 위해서라면  정도는 충분히 감수할  하다.




    하지만

    다른 사람들은 보통 날포인터를 쓰는 사람들이 많을 거 같은데.. 그럼 포인터 관리도 날로 해야하는 상황에 익숙해져야할텐데..하는 마음.. 당연히 생기겠지요.. 저게 몇일한다고 되는것도 아닌데

    제 경우도  사람들이 다 "옛날" C++ 할때 저는 C++ TR,11및 boost 를 적극 활용하면서 느낀점이..
    새 술을 새 부대에 담으려면 아직 멀었다 입니다. 일단은 날포인터도 써보고 for 문도 돌려가면서 공부하시고. 후에 스탓업이라든지 본인이 주도권을 잡을 수 있는 곳에 일할 수 있다면  님이 원하는 방식대로 코딩 컨벤션/지침으로 잡아두고 강제 하시면 됩니다.  변화를 두려워하는 사람들에게 님이 앞장서서 독려하면 세상은 변합니다. 화이팅 ^^ 

    1
  • aeba
    20
    2017-03-17 18:32:20.0 작성 2017-03-17 18:32:49.0 수정됨
    답변말씀들 모두 감사합니다

    특히 하마님 덕에 생각 정리가 잘 되었습니다. 감사합니다!!

    0
  • 곱창
    148
    2017-03-19 14:46:58.0

    학생들의 가장 큰 착각!

    트렌트를 못따라가면 취직도 안될것 같은 불안감


    0
  • aeba
    20
    2017-03-20 14:13:21.0

    @곱창

    제가 저 학생들 안에 들어간다는 말씀이신가요?


    제 경우엔 트렌드만 따라다니면 취직 안될거같은 불안감입니다.

    0
  • 곱창
    148
    2017-03-20 14:58:01.0

    aeba 

    사과할게요 본문을 대충 읽었네요~

    저 역시 학생때 망설이다 역행하는 방법을 택했구요.

    후회하지 않고 잘했다는 생각이 듭니다. 

    기본기에 충실하면 됩니다.

    시작은 늦으나 기본기가 있는 사람과 없는 사람은 1,2년 후면  차이가 확실히 드러납니다.

    0
  • 자바킬러
    79
    2017-03-22 11:04:43.0

    현업에서는 아직 6 쓰는 곳도 있습니다. 서버에 깔린 JVM이 구버전이면 답 없어요.

    학습은 8로 하시되 레거시(사실 레거시도 아니지만)한 방법은 이렇다 배우면 자신에게도 득이 됩니다.


    그리고 Java 8 람다, 스트림은 퍼포먼스 이슈도 있어서 일부러 안 쓰고 곳도 있습니다.


    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.