드디어 이번주도 끝났다. 벌써 2주나 했다는 것이다. 이번주는 꽤나 나에게 의미있는 한 주 였던것 같다. 알고리즘, 자료구조 등 이전에도 했었지만, 최근에는 몰입해서 한가지만 공부하기가 힘들었는데 꽤나 큰 계기가되어 시간을 투자할 수 있었다는 것이 좋았던 것같다.

 하지만, 이번주에 했더라도, 남은 기간동안 계속해서 내가 배웠던 것을 계속해서 점검해가는 시간이 필요하다는 것을 깨달았다. 분명히 내가 익혔다고 생각했던 것들도, 막상 스스로 다시 해보려고하니 잘 정리가 안되어서 꽤나 버벅였던것 같다. 이런 부분이 스스로가 자각되니 꽤나 당황스러웠던것 같다. 공부를 멈추면 안될 것이라는 생각이 들었다.

 다음주에도 이번주와 마찬가지로 스스로 공부하는 시간이 많을 듯하다. 내가 부족한 것들을 체크하고 그것들을 보충하는 식으로 다음주 한주를 진행해야 할 것 같다.

 벌써 2주차의 주말이 되었다. 오늘은 이번주 동안 공부했던 내용을 복습하는 시간을 가지게 되었다. 생각보다 복습하면서 느끼는건데, 강의를 처음 들을 당시에 알고넘어 갔다고해도, 막상 시간이 조금 흐른뒤에 다시 보게 된다면, 기억이 가물가물 하더라. 그래서 꼭 복습을 하는 것이 중요하다고 다시 느끼게 되었다.

 나름 이번주에 많은 것들을 알게 되었다고 생각했지만, 뭔가 혼자서 다시 해보려니깐 꽤나 버벅이게 되는것 같았다. 앞으로 일주일의 루틴중에 토요일 하루는 꼭 이번주에 배운 것들을 복습 하는 시간을 가지도록 해야겠다.

 이번주는 꽤나 여러가지 배우게 되었는데, 생각보다 내 안에서 정리가 안되어서 뭔가 많이 적기 힘들었던것 같다. 다음 주에는 다시한번더 복습을 하는 것을 목표로 해야겠다.

 오늘은 오전에 CS 특강 오후에 알고리즘 강의가 있다. 나도 내가 CS공부가 상당히 부족하다고 느꼈고, 이 특강은 나에게 많은 도움이 되었다. 오늘 특강의 주제는 CPU인데, CPU는 어떻게 구성되어있는지, 프로그래머의 언어가 어떻게 CPU에게 전달되는지, 명령어 수행은 어떤식으로 하는지에 대해 강의 해주셨다. 

 이 때까지 코딩은 했었지만, 내가 사용한 프로그래밍 언어를 컴퓨터가 어떻게 동작하는지는 잘 몰랐었고, 그나마 겉햝기로만, 메모리영역에 접근해서 주소를 레지스터들이 받은 명령을 수행해와서 컴퓨터에 동작을 넘겨주는 것이라고 이해해왔었는데, 왜 그러한 처리가 있었는지 알 수 있게 되었다. CS라는게 막연하게 어렵게 느껴졌는데, 튜터님의  설명 덕분에 쉽게 다가갈 수 있던것이 엄청 컸던거 같다. 

 오후에는 알고리즘 특강이 있었고, 알고리즘 특강을 들은 다음에, 남은 오후 시간동안은 자료구조를 더 공부했다. 이제 강의를 거의 완강해 가는 시점이 되었고, 남은건 복습 또 복습인것 같다. 지금의 마음이 끝까지 지속될 수 있었으면 한다.

 이제 내일 배움 캠프도 벌써 2주차가 끝나간다. 이번주는 여러모로 내가 공부 해왔던 것들을 총체적으로 복습하는 주간이 된 것 같다. 오늘도 알고리즘과 자료구조에 대해 계속해서 복습하는 시간이 되었다. 주어진 강의를 통해서 던져진 주제를 복습하는 것은 나에게 꽤나 도움이 되는 일이다.

 자료구조와 알고리즘 부분은 예전에 공부했었던 것을 복습을 하는 느낌이 강했다. 처음 공부할 때에는 c++로 알고리즘을 작성했었는데, 그 것을 지금에는 파이썬으로 다시 작성하였고, 이 것은 생각보다 많은 도움이 된다. 이번 주에 남은 강의를 완강하고, java로도 한번 더 자료구조를 사용해서 작성하는 것이 새로운 목표가 되었다.

 남은 강의도 빠르게 완강하는 것이 내일의 목표가 될 것 같다. 꾸준히, 계속해서 공부하도록 노력하자.

 오늘은 하루종일 알고리즘 공부를 했다. 내가 생각하는 알고리즘은 "얼마나 효율적으로 해결하느냐"가 가장 큰 포인트다. 즉, 알고리즘은 문제를 해결하는 최적의 경로이다. 그것을 생각하면서, 알고리즘에 대해 공부를 하였다. 알고리즘은 크게 2가지의 비용을 가지게 된다. 시간과 공간이다. 시간은, 이 수식을 활용해서 얼마나 걸리느냐이고, 공간은, 내가 사용할 수 있는 기억 용량중 얼마나 소모를 하느냐이다. 이것을 표현하는 말로, 시간복잡도와 공간복잡도가 있다.

 일단 알고리즘을 알기 위해서는, 데이터를 어떻게 정리하냐 즉, 자료 구조에 대해서 알 필요가 있다. 그렇기 때문에 주어진 강의를 활용해서, 자료 구조와 알고리즘을 공부하기 시작했다. 아직은 이론적인 부분이 대부분이라서 크게 무언가 만든다는 느낌은 없지만, 해왔던대로, 공부를 했다.

 효율적인 알고리즘 공부는 코드 테스트 연습과 분리 할 수 없다고 생각한다. 즉, 내가 활용 할 수있는 논리적 절차적 사고를 효과적으로 적용할 수 있는 것이 코드 테스트다. 그렇기 때문에, 알고리즘 공부하는 동안은 다양한 코드 테스트 사이트를 활용할 것이다.

 이 과정을 통해서, 내가 백엔드 개발자로써의 기초를 얼마나 크게 성장할 수 있을지 궁금해진다. 이번 기간동안은, 꾸준히 공부하고, 계속해서 반복 연습하는 것이 가장 중요하다고 생각된다. 

 오늘은 새로운 팀원과 새로이 시작하게 되었다. 항상 프로젝트를 시작하기전에 새로운 팀을 짠다고 했는데, 새로이 만나게 되었다. 이제부터 본격적으로 시작된다고 느꼈다. 

 오전 시간에는 어제 못 본 Java 문법 강의를 마무리하고, 파이썬 문법을 들었다. 두 언어의 대표적인 차이는 java는 컴파일 언어이고, 파이썬은 인터프리터 언어이다. 때문에, 두 언어의 차이를 생각하면서 강의를 들었고 오전 중에 모든 문법 강의를 완강했다. 

 이제 오후부터는 알고리즘/자료구조 공부를 시작한다. 오랜만에 알고리즘 내용을 복습하는 계기가 될 것 같다. 학교다닐때, 자료구조와 알고리즘에 대해서 맛보기 수준으로 공부했지만, 이번 기회에는 확실하게 짚고 넘어가는 기회가 될거같다.

 아직 기초문법과 쉬운 알고리즘을 배우는 단계라서, 크게 TIL에 쓸만한 내용이 없다는게 많이 아쉽다. 아마도 내일의 목표는 빠르게 알고리즘을 정리하고 생각해 둔 CS공부를 목표로 공부할 것 같다.

 1) 제네릭(Generics)란?

 다양한 타입의 객체를 다루는 메소드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능을 의미한다. 객체의 타입을 컴파일 시 체크하기 때문에 안정성이 높아진다. 다룰 객체의 타입을 미리 명시하여 객체의 형변환을 사용할 필요없게 해준다. 

 제네릭은 다음과 같은 형식을 따른다

public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}

public <T> 메소드명(value) {...}

 자주 사용하는 타입

<T> == Type
<E> == Element
<K> == Key
<V> == Value
<N> == Number
<R> == Result

 즉 제네릭은 크게 2가지의 장점을 가진다

 1) 타입의 안정성

 2) 불필요한 형변환을 줄여 코드 작성의 간결함

'Java' 카테고리의 다른 글

JDK, JVM 이해하기  (0) 2022.12.01
System.out.println(Object)가 뭐지?  (0) 2022.11.30
15. Java(컬렉션), 스택, 큐, ArrayDeque  (0) 2022.11.08
14. Java(컬렉션), 리스트, 셋, 맵  (0) 2022.11.08
13. Java, 컬렉션(Collection)  (0) 2022.11.08

1) 스택(Stack)

 스택은 마지막에 저장한 데이터를 가장 먼저 꺼내는 자료구조이다, 이것을 LIFO(Last In First Out)이라고 한다. 

스택의 기본 자료 구조

 스택은 다음과 같이 선언한다.

import java.util.Stack;

Stack<자료형> 스택명 = new Stack();

 스택은 다음과 같은 메소드를 지원한다.

구분			설명
push(value)	스택에 값을 저장한다.
pop()		스택의 값을 제거한다.
clear()		스택의 값을 전부 제거한다.
peek()		스택의 마지막 값을 반환한다.
size()		스택의 크기를 반환한다.
empty()		스택이 비어있는지 반환한다.
contains(value)	스택에 데이터가 존재하는지 반환한다.

2) 큐(Queue)

 큐는 처음에 저장한 데이터를 가장 먼저 꺼내게되는 FIFO(First In First Out)구조로 되어있다. 

큐의 기본 자료 구조

 큐는 다음과 같이 선언한다.

import java.util.LinkedList;
import java.util.Queue;

Queue<자료형> 큐명 = new LinkedList<>();

 큐는 다음과 같은 메소드를 지원한다.

구분			설명
push(value)	큐에 값을 저장한다.
poll()		큐의 값을 제거한다.
clear()		큐의 값을 전부 제거한다.
peek()		큐의 처음 값을 반환한다.

3) ArrayDeque

 스택의 문제점과 큐의 문제점을 보완하기 위해서 사용하는 자료 구조이다. 특히 LIFO의 구조를 만들 때, Stack 보다 선호되는 자료 구조이다.

ArrayDeque의 기본 자료 구조

 ArrayDeque는 다음과 같이 선언한다

import java.util.ArrayDeque;

ArrayDeque<자료형> 이름 = new ArrayDeque<>();

 ArrayDeque는 다음과 같은 메소드를 지원한다.

구분			설명
addFirst(value)		큐의 처음 위치에 데이터를 삽입하고, 데이터를 뒤로 한칸씩 움직여준다.
addLast(value)		큐의 마지막 위치에 데이터를 삽입한다.
offerFirst(value)	큐의 처음 위치에 데이터를 삽입하고, 데이터를 뒤로 한칸씩 움직여준다. 
			단, 큐의 크기에서 예외처리가 발생할 경우, Boolean 값을 반환한다.
offerLast(value)	큐의 마지막 위치에 데이터를 삽입한다. 
			단, 큐의 크기에서 예외처리가 발생할 경우, Boolean 값을 반환한다.
size()			큐의 크기를 반환한다.
removeFirst()		큐의 처음 데이터를 삭제하고 값을 반환한다.
removeLast()		큐의 마지막 데이터를 삭제하고 값을 반환한다.
poolFirst()		큐의 처음 데이터를 삭제하고 값을 반환한다.
poolLast()		큐의 마지막 데이터를 삭제하고 값을 반환한다.
peekFirst()		큐의 처음 데이터를 반환한다.
peekLast()		큐의 마지막 데이터를 반환한다.

'Java' 카테고리의 다른 글

System.out.println(Object)가 뭐지?  (0) 2022.11.30
16. Java, 제네릭(Generics)  (0) 2022.11.08
14. Java(컬렉션), 리스트, 셋, 맵  (0) 2022.11.08
13. Java, 컬렉션(Collection)  (0) 2022.11.08
12. Java(API), 시간 다루기  (0) 2022.11.07

+ Recent posts