목차
전공 자바에서의 아침
오늘은 비가 오지 않을 것 같아서 자전거를 타고 출발. 문제는 자전거 안장이었다. 비를 계속 맞아서 안장이 축축해져서 제대로 앉아서 가지 못했다. 임기응변으로 종이를 덧대서 앉았지만, 그래도 조금 바지가 젖은 것 같기도.. 그래도 크게 젖지는 않았다.
오늘부터는 분반에 따라 반을 가기 때문에 나는 전공 자바반으로 왔다. 5층에 13반. 이제 한 학기 동안 이곳으로 오게 될 것이다. 아침에 엘베를 타서 갔는데, 확실히 저층일 때가 좋았다.. 아는 사람이 없어서 그냥 멍하니 시간을 떼웠다!
반마다 프로님이 계시고, 강사님도 따로 계신 듯. 올해부터 금융 4대 기업과 싸피 협약, 2학기에 기업연계 프로젝트가 있을 가능성. 김동근 강사님이 본인 이름 부를 실 때마다 괜히 내가 뜨끔뜨금한다. ㅋㅋ
B형을 취득하는 게 큰 의미가 있는 것인가? 기왕 할 거면 C형이 좋은 거 아닌가? 왜 다들 B형을 목표로 잡는 것일까. 대회와 코테 급의 큰 격차가 있는건가?
발표연습.
503호를 쓸 뻔했다. 환기가 안 되는 방이라고 한다.. 작년 13반의 고통을 겪지 않게 됐다!
본격 자바 공부 시작
zulu
C:\Program Files\Zulu\zulu-8 JAVA_HOME 환경변수 추가.
이클립스 jee - 엔터프라이즈 버전. 웹까지 가능하지만, 검정때는 사용하지 않음.
바탕화면은 온리 검정용이니까 참고하라.
이클립스의 ini파일. Xms 부분은 우리가 만드는 heap 영역의 크기를 지정한다.
iso 8859-1? 이게 웹 표준이라고 한다. 웬만한 모든 서버가 이걸 기준으로 한다.
요거를 추가해준다. 인코딩을 쉽게 해준다.
윈도우에서 이클립스를 깔면 ms949로 잡힌다. 한글도 볼 수 있게 하는 녀석. 이 놈은 문제가 많다고 한다. 그래서 이거에서 utf-8(1바이트)로 바꾸는 것이다. 이게 영어는 iso 8859-1, 즉 국제표준으로 표기하겠다는 뜻.
네트워크에 강력한 언어. 모든 임베디드에서의 일반적 작동을 노리고 나왔기에 버츄얼 머신 위에서 돌아간다. os의 입장에서는 단순한 앱일 뿐. 자바 입장에서 이 머신은 os이다. 달리 말해 플랫폼(어플을 실행, 관리, 종료시키는 주체).
모든 os는 메인 메모리 관리를 한다. 마찬가지로 버츄얼 머신은 자신이 뜬 영역에서의 메모리를 관리한다.
어떻게 메모리 공간을 나누는가?
stacks
Thread(과정 상에서배우지 않는다고 한다.)마다 한 개씩 존재.
메소드를 위한 메모리. 로칼 변수, this, 메소드 정보.
우리가 main 실행할 때 그 속의 변수들이 하나의 스택에 담기는 것이다.
heap
생성한 객체 정보를 저장하는 공간.
static(정적 변수?)도 여기에 저장
classarea = methodarea( in java8, Method Area! 이름이 계속 변동)
클래스들이 올라가는 공간.
jni를 위한 스택 -
java native interpreter? 다른 언어를 돌리는 가상 머신의 공간. c언어의 라이브러리를 사용할 수도 잇는데 그때 사용되는 공간이라고 한다.
이 모두를 아우르는 공간. 이렇게 해서 5개의 큰 공간으로 나뉜다고 보면 되겠다.
이중 위의 3가지가 객체 지향을 위해 많이 사용한다.
메모리 관리는 jvm(자바 가상 머신)이 한다. 이런 영역은 전부 자동관리가 되는 부분이다.
heap의 경우는 동적 메모리. 필요할 때 동적으로 생성하는 것이기에 os가 관리하지 못한다.
그래서 개발자가 알아서 해제까지 해줘야만 한다. 당연히 초급 개발자에게 있어서는 쉬운 일이 아니다.
이를 위해 자바는 가비지 컬렉터 기능을 넣어 알아서 동적 메모리를 해제할 수 있도록 해주었다. 이게 자바의 강력한 기능 중 하나다. 소위 GC.
gc도 종류가 좀 있다. 우리가 선택해서 사용할 수도 있다.
jconsole.exe를 실행하면 현재 우리 프로그램이 어떻게 돌아가는지, 메모리 어떻게 사용하고 있는지 대충 확인할 수 있다.
가비지 컬렉터가 알아서 메모리 관리를 해주는 모습을 확인할 수 있다.
마크스윕. 계속 메모리를 마크하면서 안 쓰인다 싶으면 그냥 이후 메모리 할당할 때 바꿔넣는 역할을 한다고 한다.
사실 힙도 세가지 영역을 가지고 있다. 버전마다 이름이 다르다고 한다. 나는 old, eden, survival로 돼있다.
eden은 처음 객체가 생성되는 영역이다. eden에서 처음 생성되고, 살아남은 메모리를 survival로 옮긴다. 여기에서도 살아남으면 old로 옮긴다. old는 마크스윕에서 자유롭다. vm이 종료될 때까지 객체가 유지된다. eden, survival은 옮기고 싹 사라진다. 이건 내가 이전에 파이썬 내에서 gc 공부할 때 봤던 부분인 것 같다.
메인 메소드 안의 변수. 지역변수.
처음 지역변수가 선언되면 eden에 들어간다. 주소 1000번지라 쳐보자. 이 주소를 따로 저장해둔다고 쳐보자. 근데 gc의 작동상 메모리 위치가 계속 이동된다. 그럼 저장된 주소를 가지고 있는 게 의미가 있는가?
당연히 없다. 그래서 메모리 내에 hash table이라는 표를 따로 만들고, 여기에 주소를 등록한다. 변수 앞에 0x라고쳐서 16진수라는 것을 명시하면서 해시코드라는 것을 분명히 한다. 이 해시 테이블을 통해 메모리의 위치가 바뀌어도 계속 추적할 수 있다고 한다. 해시테이블이 계속 주소 위치를 추적한다.
이 해시테이블은 우리가 객체를 사용할 때 참조할 수 있는 것이다, 하여 해시코드, 레퍼런스라고 부른다.
자바는 포인터를 사용자가 쓸 수 없다. 임베디드를 사용할 때 필수적인 부분의 메모리를 날려먹기 딱 좋은 게 c언어이다. 자바는 이런 것을 미연에 방지한다. 대신 지가 포인터를 쓴다. 포인터도, 가컬도 다 자바 지가 알아서 쓴다! 웬만한 오류가 날 만한 상황을 다 피한다.
아무튼 우리는 포인터를 쓸 수 없고 레퍼런스를 통해서만 주소를 쓸 수 있다. 참조한다고도 표현한다. pointing하지 않고 레퍼런스한다.
객체에 접근하기 위해서 어떤 경로를 거치는가? 스택 거치고, 힙을 거친다. 힙에서는 해시 테이블에서 맞는 주소를 찾아서 들어간다. 세 번의 과정을 거친다. 많은 연산이 필요하다. 그래서 되도록 스택에서만 접근될 수 있도록 하는 것이 연산 속도를 높이는데 중요하다.
for (; 땡.length;)
이런 식으로 하면, 연산이 오래 걸린다. 그러지 말고 해당 길이를 바로 변수에 넣어놓고 하면 훨씬 속도가 개선된다.
여기가 class area부분이다. non-heap.
단순한 코드 하나 실행에 다양한 쓰레드가 사용된다. 레퍼런스 핸들러는 오류를 잡는 녀석. 파이널라이저가 가컬과 연관된다. rmi는 통신을 위한 녀석들인 듯.
사진으로 봤을 때는 13개의 쓰레드가 뜨꼬, 이후 11개로 줄은 모습.
jconsole, jvisual을 통해 메모리를 모니터링을 할 수 있단 걸 잘 알아두자. 현업에서 유용하다 한다.
자바 - 동적.
절차적, 구조적 언어가 이전에는 대세였다. 그러나 이러한 프로그래밍에는 한계가 있다. 정적이라는 것. 쉽게 변하지 않는다. 그리고 데이터가 너무 긴밀하게 엮여있다. 이를 커플링이라고 부른다. 모듈간, 데이터와 모듈간. 하나를 수정하면 다른 것도 그것에 맞춰서 일일히 수정해야 하는 케이스가 생긴다. 구조적 프로그래밍의 한계점.
여기에서 객체 지향으로 넘어간다. 재사용, 유지 보수가 상대적으로 쉽다. 다만 조금 무겁고 복잡하다. 기존의 것을 받아서 새로운 기능을 추가하거나 변경하는 식이기 때문.
실제로 자바는 이미 구동되고 있는 프로그램에 임의의 메소드를 추가시켜서 돌리는 게 가능하다고 함. 동적인 자바의 특성 덕분.
뭐가 동적이라는 것인가?
클래스 로딩을 동적으로 한다. 필요한 것들을 그때그때 로딩하는 방식. c는 컴파일과 링킹의 과정이 들어간다. 필요한 것들을 미리 이어두고, 실행할 때 그 이어둔 대로 실행된다. 자바는 동적으로 바로바로 로딩을 한다. 그래서 반대로 링킹을 미리하는 것이 안 된다.
메서드 바인딩을 동적으로 한다. 메소드가 호출되는 순간 그때 바로 가서 잇는 방식. 다른 언어에서는 링킹이라 부르는 걸 구태여 자바에서는 이렇게 부른다는듯..?
메모리 할당(heap메모리 사용)을 동적으로 한다.
자바는 기본이 동적. static을 붙일 때 비로소 정적으로 작동한다고 한다. 일반적인 상위 클래스 앞에는 static을 붙일 수 없다. nested class일 때, 중첩된 클래스일 때만 static을 붙일 수 있다고 한다.
자바의 자료형. primitive, reference라는 두가지 타입으로 크게 나뉜다.
primitive - 기본적 값을 기억하는 변수의 자료형. 변수를 위해 할당된 메모리에 실제 값이 저장된다. 우리가 아는 흔한 방식.
reference - 변수를 위해 할당된 메모리에 객체를 참조할 수 있는 참조값(hash code)가 저장된다. 주소를 저장한다고 봐도 무방할 것 같다. 사용할 때는 자바가 알아서 참조를 해서 값을 가져와줄 것 같다.
자바에는 call by value, call by reference밖에 없다고 한다. 각 자료형이 각 호출에 대응된다. 정확하게는, call 대신 pass라는 용어를 사용한다. 엄밀하게는 호출이 아니라고 한다.
primitive 자료형 보자. int가 흔히 기준이다. 4바이트. 보통 byte와 short는 연산 시 자동 int로 형변환되는 편이다.
실수에서는 단정밀도, 배정밀도의 float, double.
char가 2바이트이다.
자바에서는 논리형이 정확하게 따로 있다. 1이 true고, 0이 false로 그런 개념이 아니라고 한다.. 왜?? 논리형은 형변환이 지원되지 않는다.
자동 형변환.
byte - short, char - int - long - float - double
크기 작은 쪽에서 큰 쪽으로는 알아서 형변환이 이뤄진다.
반대로 가려면 명시적으로 형변환을 시켜주어야만 한다.
자기소개할 때 자바 경험 여부와 주언어에 대해 이야기하라.
알고는 파이썬으로 가능? 알고리즘 수업 나갈 때는 자바로 할 것이다.
똑같은 단어 잡는 단축키는 없는가? alt+shift+r로 변수 이름 한번에 바꾸는 건 가능하다.
같은 열 잡는 단축키는? alt+shift+a로 열 잡기 모드에 들어간다.
가비지 컬렉터 기능 때문에 저렇게 공간이 나뉘고 메모리 위치가 이동되는 것인가?
알고 문제 하나
냅색 문제 하나를 풀었다. 나는 냅색에 쥐약인지라 처음에는 냅색인 줄도 모르고 그냥 완탐을 돌렸다. 어차피 나오는 아이템 최대 개수가 20개였기 때문에 문제 없을 것이란 판단이 섰다. 그냥 단순하게 재귀로 구현했는데 문제 없이 통과됐다. 처음에 강사님이 자바로 풀라 하셨다가 첫날이니 본인 주언어로 하기를 허락하셔서 편하게 파이썬으로 풀 수 있었다. 풀고 난 후에는 자바로 알고리즘 문제를 푸는 방법을 익히고, 냅색 알고리즘을 다시 공부했다. 내가 dp에 대해 절망감을 가지게 했던 알고리즘 냅색.. 정말 암만 봐도 풀이법이 확 떠오르지 않는 류의 문제다. 그냥 외워버리던가 해야지.
이 문제 하나 푸는데 한 시간 반 정도의 시간을 줬다. 이게 맞냐..? 우리 반은 오늘 자기소개 시간도 가지지 않았고, 계획에 나와있던 관심사 분석도 진행하지 않았다.
철수 스터디
준희에게 먼저 연락이 와서 진행된 스터디. 솔직하게 시간이 없어서 제대로 공부하지 못 했다는 것을 밝히고, 책 내용은 대충 나간 후에 본격적으로 대회 이야기를 했다. 일단 예선 기간 동안은 기획서를 만드는 게 전부라 어떻게 기획을 잘하냐가 관건인데, 개인적으로는 마땅히 유별난 아이디어가 떠오르지 않았다. 그냥 금융 관련에 해박한 챗봇..?
그래도 계속 이야기하다보니까 어느 정도 가닥은 잡혔다. 웹 크롤링까지 동원해 유의미한 현시점 데이터를 활용한 주가 분석 및, 개인화 추천을 진행하는 챗봇. 그냥 좋은 거 다 때려박은 느낌이지만, 머리가 굳어서 좋은 아이디어를 떠올리기 정말 힘들었다.
회고 및 다짐
오늘은 정말 하루 종일 졸렸다. 커피로도 소용이 없었다. 이럴 거면 커피를 왜 마시냐. 내 아까운 돈. 게다가 친구들과 시간을 보내기 위해 카페를 갔던 것도 있는데 이제는 다 다른 층이 돼서는 점심도 같이 못 먹을 정도로 시간대가 달라져서 카페를 같이 가는 것도 쉽지 않았다. 우리 층 수업이 시작될 때쯤에야 수민이네가 밥을 다 먹더라. 결국 지금 보면 커피를 마실 이유가 1도 없는 거 아니냐..
반 분위기가 조용하니 괜히 기운이 푹 쳐졌다. 알고리즘 문제를 풀 때는 머리도 지끈거려서 고생했다. 자바라는 외계어를 접하면서 생기는 반발감 정도렷다. c언어와는 다르게 자바라는 언어는 공부하는 것만으로도 많은 cs 지식을 익힐 수 있을 것 같다. 알아야 할 개념들이 엄청 많다. 물론 c언어로부터 배울 수 있는 것도 많기는 하다. 다만 나는 c언어로 시작을 했다보니 그로부터 얻어지는 부수적인 지식이 크게 와닿지는 않는다. 반면 자바는 클래스와 메소드라는 개념을 극한으로까지 사용하는 언어다보니 그런 부분에 대한 이해가 깊어지지 않으면 그냥 사용할 수가 없는 언어이다. 거기에 가상머신까지 돌리니 메모리 관리에 대해 더더욱 관심을 가질 수밖에 없기도 하다보니 다른 언어를 배울 때보다 훨씬 피로감이 크다.
하다 보면 괜찮아지겠지. 전공자들과 비비면서 하다보면 그래도 높이 올라갈 수 있을 것이라 생각한다. 아무튼 피로는 많이 쌓였고, 준희가 오는 김에 저녁으로 마라탕을 먹었다. 정신 없는 머리를 매운 맛으로 다스리기. 꽤나 효과는 있었다. 매워도 계속 먹다보니 머리가 조금 맑아지는 기분이 들었다. 역시 스트레스 받을 때는 매운 맛이지.
싸피에서의 괴로운 시간들. 다시 수험생이 된 기분이다. 이 고통을 친구들과 지내면서 좀 풀었는데, 친구들과 이렇게 바로 떨어지게 되니 타격이 좀 있다. 생각보다 따락나는 것이 빡센 전공반의 교육도 한몫 하고 있다. 뭐, 비단 싸피만의 문제는 아니다. 큰 범주로만 나눠도 당장 할 것들이 5개 가량은 넘는다. 그게 가장 괴로운 것이다. 무언가를 쳐낼 필요가 있다. 일단 다음주를 기점으로 인수기는 끝날 것이다. 선형대수학 내용은 끝나고 확률로 들어갔는데 확률은 그래도 조금 공부해둔 게 있어서 크게 거부감은 있다!! .. 아직도 어렵기만 하다 확률의 세계. 개념은 얼추 들어왔지만, 그 많은 분포를 다 외우고 있기가 힘들다. 모양도 비슷하고, 연속분포 쪽은 진짜 생긴 것도 괴상해서 말이다. 내일 퀴즈인데 거의 포기 상태.
내일은 아침 퀴즈, 저녁에는 무료 PT. 또 무엇이 있던가? 무엇 하나 부담스럽지 않은 게 없구만. 금요일에 친구들과 마라탕 먹을 수 있었으면 좋겠다. 술로 적잖이 적셔야지.
괴롭다. 괴로울 때 웃는 사람보다는, 괴롭지 않게 느끼는 사람이 일류다. 책임만 조금 덜고, 즐기고 싶다.
그러고보니 근래에 입에 힘들다는 말이 계속 붙고 있다. 흠. 정신머리를 좀 고칠 필요가 있다. 이 말을 쓰면서도 할 수 있다는 생각과 힘들다는 생각, 왜 이러고 있냐는 생각이 공존하고 있다.
나의 죽음을 떠올린다. 그러고보면 이게 뭐가 힘드냐. 아직 안 죽었으면 되었다. 가는 길이 틀리지 않았다면, 모두를 죽이겠다. 돌아서고 싶은 나부터 저만치 나아가서는 주저앉아버린 나까지, 모두 죽이리라.
'일지 > SSAFY 10기' 카테고리의 다른 글
20230714금-마라탕! (0) | 2023.07.15 |
---|---|
20230713목-자기소개 (1) | 2023.07.14 |
20230711화-승화 (0) | 2023.07.12 |
20230710월-2주차 스타트 (0) | 2023.07.10 |
20230709일-다음 주가 오면 (0) | 2023.07.10 |