Weekly I Learned 2주차

2022. 9. 27. 09:14Weekly I Learned (WIL)

728x90
반응형
SMALL

[기간]

- 9월 26일 ~ 10월 1일

 

 

[Weekly I Learned ( 2주차 후기)]

스스로에 대한 아쉬움과 공부의 필요성은 당연하게 느끼지만, 좀 더 초기에 알려주시는 부분이나 학습자료 설명이 조금 더 잘되어있었다면 더욱 능동적으로 주도학습이 잘 이루어지지 않았을까 하는 아쉬움이 있는 주였다.

 

 

 

+ 9월 26일 (월요일)

지난주에 이어 프로그래머스 알고리즘 연습 중이다. 

매일 알고리즘 문제를 풀면서 느끼는 거지만 테스트 채점은 통과할 정도로 기능구현은 보통 거의 완성했다고 생각하는데 본격적인 채점 제출을 하게 되면 일부는 통과하고 일부는 런타임 에러 혹은 시간초과로 인해 채점 실패라고 나온다...

에러가 나는 이유는 몇가지가 있다고 생각하는데, 주된 이유로는!

 

1. 배열을 사용해야 하는 문제이면 범위 값을 잘못 조정하여 범위를 벗어나게 사용하는 경우!

2. 코딩 길이가 너무 길어 시간초과가 나는 경우

3. 함수의 기능을 명확하게 알지 못하고 사용하여 결과가 이상하게 나오는 경우!

 

라고 볼 수 있겠다.

 

1번, 3번의 경우 아직 모자람이 많은 본인이기에 공부해나가면 좀 더 나아지지 않을까 생각하지만, 2번의 경우는 솔직히 가끔 이해안되고 이것저것 줄이려고 시도해도 안되면 화가 나는 것이 사실이다...

더군다나 몇몇 문제는 심지어 내가 작성한 코드길이나 구현 코드 내용이 정답으로 통과된 분들의 답이랑 99퍼센트 비슷한데도 실패된 경우가 있었다...

그럴때마다 "이렇게 고정된 정답으로만 통과될거면 여러가지 생각하면서 코딩하는 것이 의미가 있을까?"

라고 생각되기도 한다....

(너무 부정적인 생각이지만 ㅎㅎㅎ;;)

 

 

 

+ 9월 27일 (화요일)

알고리즘 연습 + 모의고사를 보는 날이다.

모의고사라 함은 코딩 테스트를 본격적으로 연습해보는 연습 시험이다.

내가 이 코딩 테스트에서 많이 긴장하는 이유는 첫 취업 코딩 테스트를 카카오 와 네이버를 통해서 겪어봤는데, 아무리 주변에 사람이 없고 혼자서 집중할 수 있는 환경에서 진행한다지만 너무 긴장되었고 불안했다.

혹시나 틀리게 작성하진 않을지, 한 문제에 시간을 다 잡아먹을지..

그래서 그떄 당시에는 결과가 매우 좋지 않았고, 오늘도 또한 그런 분위기의 느낌이 나서 불안했다.

 

막상 시험시간이 4시간 가량 주어지고 본격적으로 시험을 진행하였을 때 걸리는 시간이 40분 정도라서 스스로도 매우 놀라웠다.

처음에 코딩테스트를 봤을때보다 수월하게 코딩을 했다는 점도 매우 기분이 좋았던 것 같다.

코딩 테스트와 더불어 스스로 작성한 코드를 설명할 동영상도 녹화해서 제출하게 되었는데, 잠깐이지만 개발자 유튜버? 시니어 개발자가 코드를 설명하는 느낌이 들어서 낯설고 부끄러웠다 ㅎㅎ.

(유튜버도 아무나 되는 것이 아니구나...)

 

모의고사가 끝나고 계속해서 알고리즘 문제를 푸는 와중에 반가운 문제를 발견했다!

"신규 아이디 추천" 이라는 문제였는데 내가 카카오에 입사지원을 해서 코딩 테스트를 봤던 문제였다!

그때 당시에 너무나도 긴 문제 설명에 쫄아서 잘 풀지도 못하고 혼자서 이 문제를 가지고 끙끙대다가 대충 제출하고 말았는데 오늘 풀어보니 그때보다 비교적 수월하게 풀 수 있었다.

스스로도 놀라웠던 것 같다. 역시 사람은 발전하는 법 ㅎㅎㅎ

 

목요일에 진짜 코딩테스트를 보기 때문에 그때까지 최대한 많이 생각해보고 풀어봐야겠다.

 

= 오늘 코드 설명 동영상을 녹화하면서 본인은 프레젠테이션 같은 발표회를 가졌을 때 너무 긴장한 나머지 말도 헛나오고 더듬고 횡설수설하거나 쓸데없이 길게 일일히 설명하려고 해서 말이 꼬이는 경우도 많아서 발표를 싫어하는데 내가 싫어하는 것들도 이제부터라도 경험해보면서 극복해나가려고 한다.

 

 

+ 9월 28일 (수요일)

변함없이 알고리즘 문제를 푸는 날이다.

총 40문제 중 전반 부 24문제의 난이도가 중 ~ 중하였는데 지금 풀고있는 후반 부 16문제보다 시간도 많이 걸리고 어려웠던 것 같다.

 

기본적으로 본인은 문제를 풀 때 내가 알고있는 함수 수준에서 모든 걸 구현하려고 하는데 이 부분에서 구글링을 안하고 해결하다 보니까 시간이 오래 걸리는 것 같다.

아예 손도 못 댈 정도로 막히게 된다면 도움을 받겠지만 이렇게 혼자서 한계점까지 구현해보는 것이 나한테 더 도움도 많이 되는 것 같다.

 

[추후 반드시 알아둬야할 함수들]

1. Hash 시리즈 (예 : HashMap, HashSet 등등)

- 문제를 풀다보면 배열을 활용해서 푸는 경우가 매우 많은데 여기서 나는 기본적인 1차원 배열, 2차원 배열, ArrayList 를 활용해서 풀어봤지만 이제는 HashMap 과 같은 키 값으로 주고받을 수 있는 배열 형태도 반드시 학습해야 되겠다고 생각된다.

 

2. 정규식

- 카카오 코딩 테스트에서도 나온 것처럼 간간히 문자열을 가지고 원하는 결과를 필터링 해서 추출해야 되는 문제도 있다.

정규식을 모른다면 일일히 노가다로 길게 코딩을 해야하므로 앞으로 클린 코딩을  하기 위해선 배워야할 함수라고 생각한다.

https://hbase.tistory.com/160 참고!!

https://codechacha.com/ko/java-regex/ 참고 22

 

3. Array.Stream

- 이것 또한 배열에 관련된 명령어인데, 좀더 고급화된 배열 명령어라고 할 수 있다.

스스로 조건을 걸어 원하는 조건에 맞는 배열값들을 가져올 수 있다. 

코드를 잘하시는 분들의 코드를 보면 종종 사용하는 분들을 많이 볼 수 있다.

배워야겠다 ㅋㅋ.

 

4. 향상된 for 문 

- 언제까지고 기본 for문만을 사용할 수는 없을 것 같다. 향상된 for 문도 배워야할 명령어다.

 

5. 조건식 (예 : (int four < int five) ? five : four

-  예시에 써놧듯이 괄호안에있는 four와 five를 비교했을 때 five가 맞으면 true 이므로 ? 바로 옆에 있는데 five 값을 가져오고, 아니면 뒤에 있는 four를 가져온다.

많이 사용하지 않아서 익숙해질 틈이 없었는데 자주 사용하면서 익혀놔야겠다.

 

 

길어지는 코딩을 좀 더 짧고 수월하게 그리고 시간 절약까지 할 수 있는 명령어들이 위의 명령어들말고도 많으므로 필요할 때 정리해서 알아놓아야할 것 같다.

 

 

 

+ 9월 29 (목요일)

오늘은 이때까지 갈고닦아온 알고리즘 사고력을 총동원하여 테스트를 보는 날이다.

많은 연습 문제들을 푸는 동안 시간이 어떻게 지나갔는지도 잘 모르겠다.

 

테스트는 하 / 중 / 상 의 난이도로 구성이 되어있으며 그 중 2문제를 골라 풀고 해당 문제에 기입한 코드를 스스로 설명하는 동영상을 찍어 제출하는 것이었다.

 

이전에 구직활동 기간에 봤었던 코딩 테스트가 생각이 나면서 갑자기 긴장을 하기 시작했으나 역시 그때의 나와는 다른지 중 / 상 문제를 골라 1시간 이내로 풀고 동영상도 제출했다.

 

그..... 동영상을 찍는 경험은 처음이라 되게 어색했다. 실제로 사람들이 옆에 있는 것도 아닌데 너무 어색했고 말도 버벅거렸던것 같다.

유튜버가 이렇게 힘들구나... 라고 다시 한번 더 생각하게 된 것 같다....

올린 영상을 모르고 전체공개로 해놔서 그런지 하루만에 조회수가 17회였다. ㅋㅋㅋㅋㅋㅋ

나중에 비공개로 바꿔야겠다.. ㅋㅋ

 

그렇게 테스트가 완료가 되고 오후 6시에 다같이 OT? 비슷한 활동을 온라인 상으로 하면서 즐겁게 시간을 보내면서 휴식을 취했다.

게더라는 온라인 공간안에서 이렇게 많은 사람들이랑 협동으로 뭔가를 한다는게 신기했던 것 같다.

특히 카트라이더 경주를 하는 건 너무 재밌었다. 1차에선 1등을 했는데 왕중왕전에서 이름표때문에 가려져서 안보이는 바람에 벽에 박고 있는 걸 알아챈 순간, 꼴찌 확정이였다... 아쉽다..

신서유기에서 보던 인물,로고 퀴즈도 재밌었다. 경험해 본 사람들이 말하길, 티비에서 볼때는 뭐 저런걸 틀리냐고 하는데 막상 실제로 해보면 다르다고했던 것이 기억났다. 진짜였다.

(피리같이 생긴 물건을 보고 고추라고 말한 나는 도대체....)

 

프로그램을 짜주신 매니저님께 감사하다!

 

 

+ 9월 30일 (금요일)

알고리즘 구현력 연습 주가 끝나고 이제 드디어 spring 주특기 주가 시작된다.

한주가 새로 바뀔 때마다 팀이 새로 바뀌게 되는데 또 팀장이 되었다 ㅋㅋㅋㅋ... 

싫은 건 아니지만 내가 팀장을 할만한 사람인가? 라는 스스로에 대한 의심 때문에 걱정되는 것 같다.

 

오늘은 spring 주특기 주가 시작되기에 앞서 금일 하루까지 제출해야하는 SA 과제가 있었다.

주어진 조건에 맞는 결과 값을 출력을 하는 코드를 제출하야하는데 갑자기 거의 아무것도 모르는 상태에서 상속과 같은 명령어를 사용하여 구현을 해내야만 했다.

또, 전달받은 조건의 설명 부분이 너무 애매하게 되어있는 부분들이 많아서 초기에 조건을 정리하느라 시간이 꽤나 소요되었고, 설상가상으로 작성한 코드까지 꼬이게 되면서 밤을 샐 수 밖에 없었다...

 

 

+ 10월 1일 (토요일)

금요일 SA 제출이 끝나고 본격적인 spring boot 주특기 공부를 시작하게 되었다.

거기에 더해 제출해야될 과제까지 있었는데 솔직히 좀 많이 당황스러웠다.

대부분의 사람들이 그렇겠지만 거의 아무것도 모르는 상태에서 갑자기 교육자료를 받고 혼자서 주도적 학습을 통해 게시판을 만들라고 하시니... 당황할 수 밖에 없었다...

코드까지 꼬여버려서 다시 지우고 고치느라 밤을 세웠다..

 

무사히 SA 제출을 완료하고 본격적으로 주특기 관련해서 공부를 하기 시작했다.

우선 자바 언어로 개발을 하게 되면 가장 중요한 것이 자바의 특성 중 하나인 객체 지향형 프로그래밍이라는 것이다.

 

[객체 지향형 프로그래밍이란?]

현실에서 쓰는 모든 것을 객체라고 표현하며, 객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말한다. 객체는 설계도라고 볼 수있는 클래스에서 생성되는 것들(실체)이라고 볼 수 있다.

 

과거에는 절차 지향적으로 프로그래밍을 진행했다고 하는데, 이것은 어떠한 일을 반드시 정해놓은 절차대로 구현을 했어야 했기에 비효율적이고 답답했다고 한다.

지금도 소형 프로젝트에는 절차 지향적 프로그래밍을 사용하기도 한다고 한다.

 

객체 지향형 프로그래밍은 대표적으로 4가지가 있다.

  1. 추상화
    • 객체들의 공통적인 특징(기능, 속성)을 도출하는 것
    • 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.(클래스가 없는 객체지향 언어도 존재 
  2. 캡슐화
    • 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
    • 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
    • 코드가 묶여있어서 오류가 없어 편리하다.
    • 데이터를 보이지 않고 외부와 상호작용을 할 때는 메소드를 이용하여 통신을 한다. 보통 라이브러리로 만들어서 업그레이드해 사용할 수 있다.
  3. 상속성
    • 하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것
    • 이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것
    • 기존 코드를 재활용해서 사용함으로써 객체지향 방법의 중요한 기능 중 하나에 속한다.
  4. 다형성
    • 약간 다른 방법으로 동작하는 함수를 동일한 이름으로 호출하는 것
    • 동일한 명령의 해석을 연결된 객체에 의존하는 것
    • 오버라이딩, 오버로딩
      • 오버라이딩 - 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것
      • 오버로딩 - 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것

 

[JDK, JRE, JVM 이란?]

JDK, JRE, JVM 은 자바가 정상적으로 운영될 수 있도록 해주는 환경 트리오다.

 

1. JVM

과거의 모든 프로그램은 운영체제에 맞게 동작되게끔 설계되어있었는데, 같은 프로그램이지만 윈도우, 리눅스, MAC 과 같은 다른 운영체제에 따라 다르게 설계해야했고, 프로그램이 사용하는 메모리도 개발자가 일일이 관리해줘야만 했었다.

JVM은 위와 같은 비효율적인 방식을 없애고 자바 프로그램이 어느 기기, 어느 운영체제 상에서도 정상적으로 실행될 수 있게 만들어주는 가상 머신이다.

 

2. JRE

자바 클래스 라이브러리, 자바 가상 머신(JVM), 자바 클래스 로더를 포함하고 있는데,

클래스 로더, 클래스 라이브러리를 통해 작성한 자바 코드를 라이브러리와 결합한 후 JVM에 넘겨 JVM이 원활하게 잘 작동할 수 있도록 환경을 맞춰주는 역할을 하는 자바 런타임 환경이다.

 

3. JDK

JDK를 설치하면 JRE가 자동으로 설치됩니다. JDK는 JRE를 포함하고 있고, JRE는 JVM을 포함하고 있다.

따라서 JDK를 설치하면 JRE, JVM이 자동으로 설치된다.

JDK에는 JRE에는 없는 "자바 컴파일러(javac, java compiler)"를 포함하고 있는데, 컴파일러란 우리가 작성한 자바 문법을 컴퓨터가 이해할 수 있게 바꿔주는 해석기 같은 존재이다. 실제로 .java 파일을 만들어서 실행(빌드)하면 컴파일 작업을 거쳐 .class 라는 파일이 자동으로 생성된다.

즉, JDK는 JRE, JVM을 포함한 자바 개발 키트이다.

 

위에서는 자바 프로그래밍을 진행하는데에 있어 기본적인 큰 틀을 공부하였다면 이제부터는 본격적인 spring boot 에 관한 내용이다.

spring boot 프로젝트가 동작하는 부분을 좀 더 자세히 세분화하자면 boot 프로그램이 동작하게 되는 부분은 크게 entity(테이블 혹은 데이터를 주로 저장해서 사용하게될 파트), controller, service, repository (DAO), DB 이렇게 나눠져있다고 보인다.

 

[내가 이해한 내용으로 다시 한번 더 정리해보자면! ]

1. entity

- 우리가 웹을 만들면서 활용하게될 데이터 부분들을 저장시키는 부분

 

2. controller

- 클라이언트(우리!) 가 서버에 원하는바를 요청하게 되면 그 요청부분에 대한 내용을 service에 전달 시키거나 api url을 통해 원하는 동작을 수행하게끔 하는 부분

 

3. service

- controller 에서 전달받은 요청사항을 가지고 DB에 접근해서 결과값을 가지고 오는 repository 에 다시 전달하는 부분

 

4. repository

- DB에 가장 근접하게 접근하여 sql을 활용하여 원하는 데이터의 값을 가지고 오는 부분.

(이클립스에서는 mapper라고 하는 xml에 mysql언어를 저장시켜 원하는 값을 가지고 오곤했지만 인텔리제이에선 h2 데이터베이스 혹은 mysql을 jpa 라고 하는 라이브러리에서 sql과 유사한 동작을 구현할 수 있다고 한다.)

 

5. Dto

- entitiy가 주된 데이터를 저장시키고 활용하는 메인 테이블이라고 한다면 이것을 곧장 바로 넣었다 빼거나 수정하는것은 위험할 수가 있다. 그래서 Dto라고 하는 데이터 임시저장용 클래스를 만들어 경유하여 안전하게 사용한다고 한다.

 

 

이클립스 환경에서도 익숙해지기 전까지 해당 동작 방식 및 언어 사용이 힘들었던 나에게는 다시 한번 더 힘들 수도 있겠다는 생각이 들었다 ㅠㅠ

하지만 그래도, 방식이랑 환경설정 언어를 쓰는 방식 등등 겉으로 봤을때는 거의 다르다고 느껴지지만 크게 봤을때 이클립스 환경에서의 동작 방식과 유사한 점이 꽤나 많은 것 같아서 좀 친밀?하게 느껴졌다.

이제는 제대로 이해하는 일만 남았을 뿐..

 

다음 주에는 API 관련해서 공부를 해봐야겠다.

 

본인은 이해력이 좀 느린 편이고 거기다 코드를 보면 지금 당장 이해를 하지 않으면 불안해하는 사람이기 때문에 다른 분들보다 시간도 많이 걸리고 노력도 배로 해야하지만 나도 열심히 하면 평균까지는 가지 않을까 생각하게 된다.

 

 

 

 

[일별 부족한 점 / 느낀 부분]

1. 알고리즘 코딩 연습 문제

- 첫 직장을 다니기 이전이나 다니는 와중에 네이버, 카카오 구직 활동을 진행 한 적이 있었고, 그럴 때마다 느꼈었던것은 당연히 난이도도 난이도이지만 혼자서 어떻게든 구현해보겠다고 한문제에 몰두한 나머지 시간 분배가 잘 되지 않았던 것이다.

물론 혼자서 구현해보고자 하는 습관은 매우 좋은 것이라 생각되지만 오래 막히면 구글링을 통해 도움될만한 정보를 얻어서 빠르게 풀어나가는 것이 좋아보인다.

 

 

728x90
반응형
LIST

'Weekly I Learned (WIL)' 카테고리의 다른 글

Weekly I Learned 6주차  (0) 2022.10.30
Weekly I Learned 5주차  (0) 2022.10.23
Weekly I Learned 4주차  (0) 2022.10.17
Weekly I Learned 3주차  (0) 2022.10.03
Weekly I Learned 1주차  (0) 2022.09.26