자바칩

[F-Lab] 2주차 멘토링 본문

F-Lab

[F-Lab] 2주차 멘토링

아기제이 2024. 6. 2. 14:33
728x90

parellel이랑 concurrency의 의미에 대해서 개념을 잡고 블로그에 글 작성하면서 정리하기
이것은 기본적인 CS적인 측면에서의 용어들이고 이걸 잘 알아야 이후에 이런 GC가 됐던 개발이 됐던 할 때 되게 중요하다. parellel은 병렬이고 concurrency는 동시성. 한글로 이 둘의 차이를 알아야 한다.

질문에 답을 잘 하려면
1. 내가 학습해야 되는 내용이 책에 있으면 책을 선택해서 읽는 게 first이다. 그게 가장 탑질도 줄이고 잘 정리된 내용을 읽는 것이기 때문에 시간을 줄여준다.
2. 하지만 그렇지 않은 책들이 있다. 기본적인 코어 지식은 그대로 있되 그 뒤로 엄청 많이 발전했을 것이다. 이런 정보들은 첫번째로는 공식 블로그, 그 다음에 개발 블로그들 그 다음에 회사 기술 블로그. 예를 들면 개인 블로그 말고 배민, 라인, 카카오, 네이버 이런 데에 기술 지식을 정리해 놓은 글들이 있다. 멘토님도 빅테크 회사들의 기술 블로그 구독 중이다. 이걸 보면 책보다 최근 데이터를 정제된 형태로 많이 얻을 수 있다. RSS 피들리 앱(무료)에 빅테크 회사들이나 기술 블로거들 블로그를 구독해서 글을 읽고 있는 중이다. 이렇게 공부를 끊임없이 해야 한다.

주 도서: 자바 객체 지향의 원리와 이해 => 멘토링 하면서 질문할 내용
보조 도서: 객체 지향의 사실과 오해 => 같이 읽으면 좀 더 쉽게 이해를 할 수 있다.
둘 다 읽어 보면 좋음

블로그 작성하면 취업하는 데에 도움이 되는가
증명을 할 수 있는 증거 자료가 된다.
물론 면접관들이 날카롭게 질문을 하면서 진짜 아나 모르나 하긴 하지만 이력서에 링크를 걸어놓으면 면접관들이 한 번씩 들어가서 보고 실제로 어느 정도 수준인지 판단을 하게 돼서 경력이 부족하거나 하더라도 블로그에 글이나 공부했던 내용들이나 학습 관련된 태도나 이런 것들이 좋으면 가능성이 있다고 생각하여 통과하는 경우도 있다. 이직을 할 때도 똑같이 덕을 볼 수 있다. 들어간 건 ok 하지만 다른 사람에게 설명을 못하거나 스스로 정리가 안돼있거나 하면 아무래도 나중에 또 반복해서 봐야 하는 경우가 많다. 

하반기 공채가 7~8월쯤에 뜬다. 지금이 5월이니까 두세 달 남았다. 두세 달동안 일반적으로 신입 채용을 할 때 필요하다고 예상되는 지식과 수준을 한번 쫙 훑으면 된다. 이것이 뭐냐. 코딩 테스트가 두세 달 뒤까지 준비가 되어 있어야 한다. 골드 수준이 될 수 있게 스스로 준비하는 데까지 시간을 얼마나 들일 건지 본인한테 달려있다.
두번째는 면접에 작성하기 위해서 차근차근 준비해야 하는 기본기가 있다. 지금처럼 블로그 열심히 쓰고 이력서에 써야 하니까. 매일 매일 매주 매주 내가 학습한거 열심히 남기면서 하고 있다는 것을 한 줄 써야 한다. 그 다음에 멘토링하면서 책들 읽었던 거나 이런 내용들 써서 프로젝트에 적용해가지고 사이드 프로젝트 해봤던 것도 한 줄 써야 한다. 그 다음에 내가 학습한 내용들 기준으로 이런 기술 이런 기술 이런 기술 이런 기술 경험해 봤다라고 쓸 수 있으면 좋다. 이런 것들을 준비하는 데 드는 게 3개월 있다고 보면 된다. 3~4개월. 그럼 본인이 스스로 생각할 때 이거를 하루에 10시간 씩 하면서 하는게 맞는지 필요한지에 대해서는 판단이 좀 필요한 것 같다.
8시간은 사람의 어떤 전체적인 리듬을 고려한 거니까 그렇게 맞춰서 진행을 하고 시간표를 짜도 좋지 않을까 싶다. 그 8시간 안에 못 하게 되면 가끔 주말을 쓰는 것이다. 그걸 보통 주말 근무라고 한다. 근데 어쨌든 신입이니까 하루에 8시간씩 이렇게 일단 잡고 잠도 잘 자고 이렇게 하려고 했는데 생각보다 좀 시간이 부족하게 계획만큼 못했네 하면 이제 주말을 좀 써서 주말 근무 좀 하고 쉬는 것이다. 멘토님은 이 루틴이 되게 중요하다고 생각하기 때문에 만약에 정말 8시간 동안 딴 짓 안하고 100퍼 전념해서 했으면 쉬어도 된다고 생각한다. 그 이상 하는 건 이게 고시 공부나 이런 게 아니기 때문에 진짜 8시간 full로 할 수 있으면 괜찮지 않을까 싶다. 가끔 삘받으면 더 할수도 있는데 너무 막 매일 삘받아서 해야지 이런 생각을 하는 건 불필요하다. 단기 기억이 장기 기억으로 넘어가려면 잠을 잘 자야 하는데 보통 공부한다고 잠을 안 자면 안 잘수록 이게 더 단기 기억으로만 남아서 나중에 기억이 안나고 까먹게 된다. 충분한 휴식과 지치지 않는게 더 중요하다.

블로그 작성법
1. 뭐라도 쓰는 것이 중요하다.
2. 쓰기 시작했으면 잘 써야한다. 잘 쓴다는 건 기존에 있는 걸 잘 요약하고 내 걸로 만드는 형태로 정리하는 게 필요하다.
3. 가능하면 소감이나 자기 의견을 넣는다.
예를 들면 상속과 조합에 대해서 정리를 했는데, 정리한 내용 및에 본인이 스스로 이렇게 한 걸 보고 어떤 생각을 했는지 그 다음에 내가 이걸 봤으니까 나중에 어떤 데 적용해 봐야지 라고 생각했는지 이런 것을 첨부해라. 그렇지 않으면 진짜 수많은 블로그 중 하나일 뿐이다. 근데 내가 어떤 생각을 하고 느꼈는지에 따라서 다른 사람이 볼 때도 마찬가지지만 본인 스스로 생각할 때도 더 기억에 남고 정리가 잘 된다고 생각한다.

챗지피티한테 자바의 신 몇장 이렇게 제목 주면서 나한테 이 내용 가지고 질문해줘 이렇게 해주면 잘 해준다. 스스로 연습을 하는 것을 추천한다.
예스24같은데 가면 목차가 있는데 이걸 챗지피티에 때려 넣고 이 책에 있는 내용 중에 면접을 본다면 나올 질문을 정리해줘 이러면 쫙 뽑아준다. 이런 식으로 학습을 하는 것도 되게 요령이 있고 좋다.

interface랑 abstract 클래스 차이가 무엇인가?
자바 8 버전에서 추가된 기능. 자바 8 버전에서의 인터페이스에 대해서 학습 해보기
책이 자바 8 버전 이전 꺼라서 인터페이스는 메소드 선언만 할 수 있다고 되어있음

언제 abstract 클래스 쓰고 언제 interface 써야 하나?

abstract 클래스랑 그냥 클래스랑 차이점이 무엇인가?

언제 abstract 클래스 쓰고 언제 클래스를 써야 하나?

뭔가 맞는 얘기면서 너무 언어적인 측면에서만 접근했다. 사실 인터페이스와 abstract 클래스의 선택 기준에 있어서는 좀 더 상위 레이어의 니즈가 있다. 예를 들면 타입이라고 하는 개념에 대해서 얘기를 했는데, 클래스를 구현해 놓으면 얘는 하나의 타입이 된다. 인터페이스도 그렇고 abstract 클래스도 그렇고 이 자체로서 타입을 의미하게 된다. 인터페이스를 implements한 클래스는 인터페이스라는 타입이라고 얘기할 수 있다. abstract 클래스도 마찬가지고.

근데 왜 인터페이스는 implements라고 하고 abstract 클래스는 extends라고 할까?
왜 인터페이스와 abstract 클래스를 만들었냐로 또 돌아가는데 일단 기본적으로 인터페이스는 영어 자체가 만약에 유저 인터페이스 이러면 뭘까?
사용자가 무언가를 조작하기 위해서 열어준 어떤 방법. 예를 들면 컴퓨터의 인터페이스는 키보드. 그런 것처럼 인터페이스는 기본적으로 클래스를 쓰려고 할 때 이렇게만 쓰라고 제한해 줄 수 있는 방식을 제공해 준다. A라고 하는 클래스가 10개의 메소드를 가지고 있는데 그 중에 5개만 외부에 노출하고 싶다 그러면 인터페이스를 써서 이 인터페이스로 외부에서 쓰세요 라고 노출해 주면 제한된 함수들만 메소드들만 호출할 수 있게 해줄 수 있다. 원래는 A클래스라고 하는 타입이 있는데 이거를 .좁혀가지고 A 인터페이스라고 하는 형태로 바꿔가지고 너는 이거만 쓰라고 하는 것이다. 내가 가족한텐 딸이고 외부에서는 친구고 이런거 얘기하면서 다형성 얘기하면서 비슷한 얘기했다. abstract 클래스도 똑같다. 상속을 받으면 우리가 그렇게 바꿀 수 있다. 
이 두 가지를 사용할 때 가장 크게 생각해야 하는 차이점이 뭐냐?
인터페이스는 아까 말씀드린 것처럼 얘를 최대한 제한해서 특정 타입으로 보이게 만들기 위해서 쓰는 애고 abstract 클래스 상속의 장단점은 중복을 제거해 준다. abstract 클래스는 인터페이스랑 다르게 중복을 제거해야할 때 쓰는 것이다. 얘를 들면 상속이라고 하는 건 중복을 줄여주는데 외부에 노출을 하거나 아니면 어떤 하위클래스한테 강제화를 하고 싶다. 이 함수는 너 꼭 개발해야 돼. 반드시 구현해야 돼. 그 다음에 이 함수는 그냥 위에 있는거 써. 그리고 이 필드는 내가 갖고 있을 테니까 넌 그냥 내가 갖고 있는거 갖다 써 이런 식으로 설계를 해야 할 때는 클래스의 형태가 필요하다. 그래서 abstract 클래스라는 형태로 제공을 한다. 그래서 의도가 좀 다르다. 그래서 하나는 implements이고 하나는 extends이다.
그래서 개념들에 대해서 why를 고차원적으로 이해를 해야 한다.
상속은 단점이 변화에 유연하지 않다. 그래서 인터페이스랑 abstract 클래스 중에 뭘 써야 될지 모르겠다 싶으면 일단 인터페이스를 써라. 그 의도에서 그런 것이다. 상속은 남발하면 안된다.

스트링 연산에 플러스 하면 안 좋은 이유가 무엇인가? 이런 것은 옛날 옛적이 질문하던 것이다.
스트링 자체가 불변성 객체이기 때문에 더하기 연산을 하면 새로운 스트링 객체를 만들어서 리턴해준다. 그러면 객체가 메모리에 계속 쌓이게 돼서 좋지 않다. => 명확한 답변 완료

피드백

책에 있는 대로 학습한 내용은 참 잘 설명한다. 책에 있는 대로 명확하게.
추상적인 얘기. 철학적인 데까지. 인터페이스와 abstract 클래스와 이런 것들은 그런 식으로 생각하는 연습이 필요하다. 방금처럼 딱 답이 있는 건 명쾌하게 나오는 것은 훌륭하다

자바의 어노테이션은 어떤 것일까? 어노테이션 자체의 개념은?
책에 메타 데이터 관련한 이야기 있지 않았나
메타 데이터 부분은 더 보면 된다. 어노테이션은 메타 데이터다. 한마디로 뭔가에 대해서 얘는 이런 레이어라고 이제 마킹 체크해 놓는 거랑 비슷한 형태이다. 그래서 어노테이션은 스프링에서 정말 많이 쓴다. 컨트롤러 어노테이션도 있고 서비스 어노테이션도 있고 별의 별 어노테이션을 다 갖다 쓴다. 

어노테이션은 실질적으로는 어떤 식으로 동작하나? 특히 스프링에서 어노테이션은 어떤 식으로 인지해서 동작하는지에 대해서 설명할 수 있나? 예를 들면 컴포넌트다 이렇게 딱 해놓으면 스프링이 그거를 어떻게 처리할까? 이것은 한 번 학습을 해라. 원래 여기 얘기가 나오면 AOP로 넘어갔어야 되는데 이것과 엮어가지고 공부를 한번 학습을 해봐라. 스프링에서의 어노테이션은 어떤 메커니즘으로 동작하는지. 그리고 장기적으로 나아가서는 아마 코드 작성할 때 스스로가 커스텀 어노테이션을 만들어보는 경험이 필요하다. 보통 커스텀 어노테이션 만들어본 경험이 별로 없을 것이다. 그렇게 어렵지 않다. 
예를 들면 대표적으로 질문 나올 수 있는게 이런것이다. 어노테이션 적용하면 걔를 가져다가 그러니까 a라는 어노테이션을 만들었다 치자. 그러면 이 어노테이션으로 체크돼있는 애들을 어떻게 가져다가 처리할 건가요? 이런거 물어보면 이제 막 AOP가 어쩌고 이렇게 설명할 수 있으면 된다. 스프링에서 진짜 많이 사용되는 거기 때문에 학습하면 좋을 것 같다.

float이나 double은 돈 계산할 때 쓰면 안된다. BigDecimal을 사용해야 한다.

BigDecimal을 쓸 때 주의해야 할 요소
더 실질적으로 어려운 주의해야 할 게 있다.
되게 중요한 요소인데 BigDecimal은 0.0이랑 0.00이 다르다. 이것 때문에 엄청난 버그가 나오기 쉽다. 소숫점 자릿수가 다르면 Integer나 숫자로 봤을 때는 똑같아도 다른 애로 인식한다. 이거 정말 중요하다. 나중에 돈 계산 하는데 가장 대표적인 실수가 달러 같은 경우는 0.00 소수점 둘째자리까지 쓰고 디폴트 값을 0으로 쓴 것이다. 만약 소수점 자리가 달러가 0.00으로 들어왔는데 얘가 0인 거랑 비교하면 다르다고 나온다. 이것은 머리에 박았다가 나중에 BigDecimal 쓸때 긴장 타면 된다. BigDecimal은 꼭 비교 연산을 할 때 비교하는 함수가 따로 있다. 그런 것들을 잘 인지해서 맞춰서 해야 한다. 이 돈 계산은 실수하면 재수 없으면 약간 일이 커져가지고 그렇다.

HashMap의 로직에 대해서 알고 있는가?
HashMap은 get() 메소드에 키를 매개변수로 사용했을 때 그 키의 해시 코드와 동일한 값을 버켓에서 차장낸다. 근데 만약에 여러 객체들이 있을 경우에는 equals() 메소드도 사용해서 딱 맞는 객체 하나를 찾아낸다.
그래서 클래스 정의할 때 hashCode()와 equals() 메소드를 사용해야 한다. => 명확한 답변 완료
이거 모르는 사람 좀 있는데 기본이니까 잘 학습했다.

지원하고 싶은 회사 많이 찾아주면 이력서나 회사 보는 법에 대해서 설명을 해줄 수가 있다.

지금은 물어보는게 다 어렵겠지만 계속 가다 보면 쉬워지는 단계인 것 같다. 이거는 시간이 해결해 줄 것이다. 당연한 것이다. 본인이 성장할 때 가장 중요한 게 뭐냐면 스스로가 어느 정도인지를 아는 것인데 스스로가 어느 정도인지 아는 순간 갑자기 막막함이 펼쳐진다. 모든 사람이 다 그렇다. 오히려 이건 압박감이라기보다는 이제 이걸 알게 됐다. 지금은 어렵겠지만 어쨌든 간에 먼 길이 보이기 시작한 것만 해도 일단 절반은 성공이다. 천천히 가면 된다. 책이라든가 얘기하는 사람들은 다 아는 것처럼 얘기하지만 멘토님도 연차가 15년차 정도 됐고 책 쓴 사람도 몇 년 차 이상 사람들이고 다 그런거기 때문에 당연하다. 그냥 엄청 많은 지식을 대신에 짧은 시간 안에 습득하려고 하니까 어려운 건 당연한 거니까 거기에 너무 압도되지 말고 스스로 할 수 있는 데까지 최대한 대신에 항상 공부할 때도 그런 거지만 삽질을 덜 하면 된다. 

시간 관리는 구글 캘린더를 활용하면 좋다. 몇 시부터 몇 시까지 이렇게 써놓으면 그 시간 10분 전이나 이럴 때 알림이 온다. 등록된 시간대로 활동을 하면 충분히 스스로 관리가 된다. 시간 관리 툴도 있다. 뽀모도로 같은 것도 있다.
스스로 캘린더를 작성하고 지키면 나중에 돌아보면 내가 얼만큼 했는지도 다 나오기 때문에 추천하는 편이다.
불랫저널 이라는 책도 있다. 다이러리를 어떤 식으로 작성하고 기록하는 게 좋은지에 대한 노하우를 써놓은 책이다. 이것의 일환으로 데일리 스크럼 하라고 하는 것이다.

시간 관리 잘 하는 것, 체력적인 측면 보완하려고 노력하는 것 필요하다. 체력을 무시하고 살다가 40대 되고 나니까 온다. 쌓아 올려야 되는 것 하나가 체력이다. 타고나게 건강하게 태어났음에도 온다.

샘플 데이터에는 좋아하는 몇몇 분들 넣어주면 된다. 크롤링 하면 좋긴 한데 그렇게까지 할 필요는 없다. 몇 개 주요 데이터들만 잘 가지고 오면 된다. 지금은 시간이 중요하다.

==========================================

해야될 것

parellel이랑 concurrency의 개념 잡고 블로그 작성

참고 블로그: https://spacebike.tistory.com/22

 

[운영체제] Concurrency(동시성)과 Parallelism(병렬성) 이해하기

Concurrency와 Parallelism은 헷갈리기 쉬운 개념입니다. 이름도 Concurrency(동시성)과 Parallelism(병렬성)으로 이름만 들었을 때는 이 둘의 차이를 구분하기 어렵습니다. Concurrency와 Parallelism의 특징을 정리

spacebike.tistory.com

 

자바의 어노테이션 개념
메타 데이터 개념 = 어노테이션은 메타 데이터임
어노테이션은 실직적으로 어떤 식으로 동작하는지.
=> AOP에 대한 내용이 나와야 함

참고 블로그: https://velog.io/@kai6666/Spring-Spring-AOP-%EA%B0%9C%EB%85%90#-%EB%8B%A4%EC%96%91%ED%95%9C-aop-%EC%A0%81%EC%9A%A9-%EB%B0%A9%EC%8B%9D

 

[Spring] Spring AOP 개념

AOP는 관점(Aspect)지향 프로그래밍으로, 관점을 기준으로 다양한 기능을 분리하여 보는 프로그래밍이다. 관점(Aspect)이란, 부가 기능과 그 적용처를 정의하고 합쳐서 모듈로 만든 것이다.OOP와 이름

velog.io

 

 

 

  • Sprint1(5/6 ~ 5/20)
  • *책
  • 자바의 신 24장까지 읽기. => 완료
  •  
  • *지원하고 싶은 회사 정리
  • 20~30개 정도 찾아보기
  •  
  • *이력서
  • 이력서 초안 공유  => 작년 12월에 작성.
  •  
  • *데일리스크럼 매일 작성해보기
  • 완료
  •  
  • *프로젝트
  • 티켓팅 연습 사이트. 이번 달 말까지 기능 요구사항 정리. => 작성 완료
  • *회고
  • Keep
  • -책을 짧은 시간내에 많이 읽었음.
  • - 데일리 스크럼을 매일 작성했음.
  • - 블로그를 20개 정도 작성했음.
  • - 코딩테스트를 매일 한문제씩 풀었음.
  • - 공부를 꽤 오랜 시간 하려고 노력했음.
  • - 멘토에게 할 질문을 정리했음.
  • Problem
  • - AI멘토 질문이 어렵게 느껴졌음.
  • - 학습과 관련한 압박감이 느껴졌음. 이걸 과연 4개월 내에 다 할 수 있을까?
  • - 시간 관리가 어려움. 공부시간을 분배하는게 어려웠음.
  • Try
  • - AI멘토 질문을 꾸준히 답변하려고 노력해보기.
  • - 일단 가야할길을 알게 된게 절반의 시작. 꾸준히 천천히 가보기.
  • - 시간 관리를 구글 캘린더나 뽀모도록 같은 도구들을 사용해서 진행해보기. 불렛 저널과 같은 방법도 참고해보기.
  •  
  • Sprint2(5/20 ~ 6/3)
  • *책
  • 자바의 신 2권까지 완독 => 완료
  • 자바 객체 지향의 원리와 이해 읽기 시작.
  • *지원하고 싶은 회사 정리
  • 20~30개 정도 찾아보기
  • *이력서
  • 이력서 초안 wanted 포맷으로도 작성해보기.
  • *데일리스크럼 매일 작성해보기
  •  
  • *프로젝트
  • 티켓팅 연습 사이트. 이번 달 말까지 기능 요구사항 정리.
  • ERD작성해보기. github에 프로젝트 세팅.(Spring + Java + JPA(mysql))

 

'F-Lab' 카테고리의 다른 글

[F-Lab] Java Backend 멘토링 2개월 후기  (1) 2024.07.27
[F-Lab] 3주차 멘토링  (2) 2024.06.02
[F-Lab] 1주차 멘토링  (0) 2024.06.02