간절하게 기다렸던 프로그래머스 데브코스 백엔드 4기 수업 시작이었다!
첫 수업이었던 만큼 강의는 어렵지 않게 자바를 위한 환경설정, 유용한 IntelliJ 단축키, 자바의 특징 등을 알려주셨다.
Git에서 .gitignore에 대해서도 배웠는데 지금까지 .gitignore가 어떤 기능을 하는지 몰랐다. 이것을 잘 활용해서 포함되지 않아야할 파일들 (바이너리, 빌드 결과, 보안 관련 파일 등)을 올리지 않도록 하는 것이 좋다.
gitignore.io
이 사이트를 이용해서 나에게 필요한 .gitignore 파일을 쉽게 만들 수 있다.
11장 컬렉션 프레임웍을 읽었다. 특히 1.7 Comparator와 Comparable
을 사용하는 부분이 아직 익숙치 않아서 계속 복습해야겠다.
https://www.acmicpc.net/problem/13023 - ABCDE
첫 풀이:
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
friend = [[0] * N for _ in range(N)]
isExist = 0
for _ in range(M):
a, b = map(int, input().split())
friend[a][b] = 1
friend[b][a] = 1
visit = [False] * N
def dfs(start, depth):
global isExist
if depth == 5:
isExist = 1
return
for i in range(N):
if friend[start][i] == 1 and not visit[i]:
visit[i] = True
dfs(i, depth + 1)
visit[i] = False
return
for i in range(N):
if isExist == 1:
break
visit[i] = True
dfs(i, 1)
visit[i] = False
print(isExist)
-> 시간 초과가 일어났다. 2차원 배열로 관계를 맺어 모든 배열을 일일히 방문해야해서 시간 초과가 일어난 것 같아서
friend = [[] for _ in range(N)]
isExist = 0
for _ in range(M):
a, b = map(int, input().split())
friend[a].append(b)
friend[b].append(a)
이렇게 바꾸었더니 통과! 자기의 친구 관계만 방문하면 되는걸로 바꿨다.
13시에 팀원들과 간단한 스크럼과 앞으로 Pre팀 기간동안 자바 스터디를 하기로 결정했다. 7일까지 JDK, JRE, JVM, GC를 공부하고 발표 준비하기로 했다. 코어타임 동안 객체지향에 대해서 다시 리마인드 할 수 있는 강의를 보았다. 특히 https://refactoring.guru/ 를 통해 23가지의 Design Pattern을 배울 수 있었다.
과제 중 하나인 자바 계산기 프로젝트를 fork하고 gradle 프로젝트를 만들고 불필요한 파일들을 제외하고 push 했다.
저녁에 곰튀김님의 특강을 보면서 기본도 중요하지만 생산성이 높은 개발자가 되어야겠다는 생각이 들게 되었다.
11장 복습
12장 - 지네릭스, 열거형, 애너테이션
예전에 잠시 사용해보았던 ENUM을 다시 복습하게 되었고 더 이해할 수 있게 되었다. 지네릭스는 한번에 이해하기는 어려워서 며칠을 더 걸쳐서 복습해야겠다.
어느정도 데브코스에 익숙해지는 느낌이다. 개발 공부할 때 게더타운을 켜놓고 공부하면 왠지 모르게 더 집중이 되는것 같다 ㅎㅎ 가끔 동기들, 멘토님, 서브 멘토님들과 시간 지나는 줄 모르고 이야기를 나눌때가 있다. 오늘의 강의는 자바 Interface에 대한 것이었다. 먼저 인터페이스에 대한 기능을 배우게 되었다. 인터페이스의 기능은 크게 3가지로 나눌 수 있다.
1. 인터페이스는 구현을 강제한다.
2. 다형성을 제공한다.
3. 다형성을 이용하여 결합도를 낮춘다. (Dependency Inversion)
인터페이스는 자바 8 버전이 출시하면서 기능 개선이 추가되었다.
default Method
이때부터 인터페이스는 default 메소드, 즉 구현체를 가질 수 있게 되었다. 이로써 Adapter 역할도 할 수 있으며 인터페이스 추가만으로도 기능 확장을 할 수 있게 되었다.
Functional Interface
Functional Interface는 추상 메소드가 하나만 있는 인터페이스이다.
이때, default나 static 메소드는 있어도 괜찮다. @Functional Interface
를 달아서 만들 수 있다.
Lambda 표현식
람다 표현식은 익명 메소드를 이용하여 간결한 인터페이스 인스턴스를 생성하는 방법이다. -> Funtional Interface 에서 가능하다.
메소드 레퍼런스
람다 표현식에서 입력되는 값을 변경 없이 바로 사용할 경우 사용할 수 있다. 더욱더 간결해지며 이를 사용함으로써 입력값을 변경하지 말라는 표현을 할 수 있다. 따라서 다른 개발자의 개입을 차단하고 안정성을 얻을 수 있다.
18시에는 Pre팀원들과 자바 스터디를 진행하였다. 오늘 주제는 JDK와 JRE, JVM, Java Compile, Garbage Collection 이었고 랜덤으로 발표자를 정했는데 내가 당첨되었다!
일단은 13장 쓰레드를 건너뛰고 14장 람다와 스트림에서 람다 부분까지 학습하였다. 데브코스 강의와 같은 부분이라 더 이해하기 쉬웠다. 특히 막연하게만 알고 있던 java.util.function 패키지의 Supplier<T>
, Consumer<T>
, Funtion<T, R>
, Predicate<T>
를 더 제대로 이해할 수 있게 되었다.
알고리즘 스터디 첫날이었다. 스터디는 매주 화, 목 09:30 ~ 11:30에 진행되고 프로그래머스에서 3문제씩 풀고 서로 답안을 공유하였다.
강의는 Collection, Iterator, Stream, Optional을 다루는 내용이었다. 특히 완전히 개념이 잡히지 않은 Stream을 제대로 배울수 있었다. Stream은 데이터의 연속이며 filter, map, forEach와 같은 고차함수(함수를 인자로 받는 함수)가 제공된다. Stream을 계속해서 쓰면 익숙해지고 그만큼 편리해진다고 하셨다. 앞으로 적극적으로 Stream을 써봐야겠다.
Optional은 null을 쓰지않기 위해 사용된다. isEmpty(), isPresent()
Pre팀원들과의 Java 스터디의 주제는 Java에서의 성능 개선, 접근 제어자, Variables였다.