#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr;
if (ptr) //에러 발생
printf("ptr is not null");
ptr = (int*)malloc(sizeof(int) * 3);
ptr[0] = 0;
free(ptr);
if (ptr) //에러가 발생하지 않음
printf("ptr is not null : %d", ptr[0]); //실행됨
return 0;
}

 

8번 라인에서 포인터 변수를 초기화하지 않고 사용을 하면 에러가 발생한다.

malloc을 이용해 int *3 만큼의 메모리 할당을 한 뒤 free를 이용해 할당을 해지하고 ptr을 이용해 데이터에 접근한다면 에러가 발생하지 않는다.

 

이는 free를 하면 할당 되었던 메모리에 다른 포인터가 접근 가능하게 하는 것이지 메모리의 내용을 지우는 것이 아니기 때문에 여전히 그 메모리 공간에 데이터가 그대로 남아있기 때문이다.

 

안전하게 free를 이용하기 위해선 다음과 같은 방식을 이용해 free한 포인터를 이용해 해당 메모리의 접근을 막으면 된다.

#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr;
ptr = (int*)malloc(sizeof(int) * 3);
ptr[0] = 0;
if(ptr)
{
free(ptr);
ptr = NULL;
}
return 0;
}

 

42

42 실리콘밸리의 피신 과정에 참여한 지 8개월, 42 서울의 피신 과정에 참여한 지 2달이 조금 지났다. 두 과정 모두 통과하여 본 과정(카뎃)을 참여할 수 있는 카뎃이 되었지만, 42 실리콘밸리에서는 비자와 코로나로 인해 참여할 수 없게 되었고, 42 서울은 8월, 9월로 시작이 조금씩 밀리다가 이번 10월부터 본 과정에 참여할 수 있게 되었다. 두 캠퍼스에서 각각 한 달씩 참여하는 동안 느꼈던 점을 정리해보려고 한다.

 

피신 과정은 배우는 과정이 아니다. 이는 컴퓨터를 처음 시작하는 학생에게 불리한 과제라고 생각되기도 하지만, 주변의 동료들에게 도움을 청하고 공부하면 된다. 42 과정은 혼자하는 과정이 아니다. 함께할 동료가 있다는 건 큰 장점이다. 피신 한 달 동안 과연 이러한 과정이 본인에게 맞는지를 확인하는 기간이다. 42는 사람을 굉장히 몰아붙인다. 정해진 기간 안에 과제를 끝내지 않으면 가차 없이 쫓겨나는 것인데 피신 과정에서는 그렇게 쫓겨나지 않는다. 앞으로 카뎃 과정은 이렇다고 맛보기 식으로 보여준다.

 

공통점

피신 과정에 지원하려면 온라인으로 시험을 본 뒤 합격하면 원하는 시작 날짜를 골라 선착순으로 등록하면 된다. 

 

카뎃 과정에서 레벨 7이 되면 양 캠퍼스에서 모두 승인했을 경우에 다른 캠퍼스로 옮길 수 있다. (실리콘밸리에선 그렇게 파리로 넘어가는 학생이 많다고 한다. 파리 캠퍼스는 학교로 인정받아 비자가 발급되는 대신 다른 별도의 지원은 없다. 서울에서는 가능은 한거 같은데 자세히 모르겠다.)

 

기본적인 커리큘럼은 동일하다. 주어진 과제를 해결하고, 동료 평가를 진행한 다음 뮬리넷이라 부르는 서버를 통해 최종 점수를 받는 과정을 한 달 동안 끊임없이 진행하면 된다. 매주 금요일에는 시험이 있다. 하지만 두 캠퍼스의 진행은 미묘하게 달랐다. 차이점은 아래에 따로 적겠다. 처음에 등록을 마치자마자 자리에 앉으면 알아서 과제를 시작하면 된다. 두 캠퍼스의 첫 과제는 조금 달랐지만 따로 언급하지 않겠다.

 

클러스터에 모여서 다 함께 과제를 진행하게 된다. 여러 사람들이 모이게 되니 과제를 하면서 물어 볼 사람도 많고, 반대로 도움을 주기도 하면서 많은 걸 배울 수 있다. 42 서울은 매일 나가지 못했지만, 매일 클러스터에 나갈 수 있었더라면 더욱 얻은 게 많았을 텐데 그 점이 조금 아쉽다.

 

각 캠퍼스에서 주는 지원을 계속 받으려면 정해진 조건을 계속해서 충족해야한다.

 

학생들끼리 자체적으로 여러 소모임을 만들고 진행한다. 컴퓨터에 국한되지 않고 운동이나 취미 관련한 소모임도 많아 참여하면 좋다. 42 실리콘밸리는 피시너들끼리 운동 모임을 많이 만들었다. 42 서울은 피신은 잘 모르겠지만, 카뎃이 되고 나니 소모임이 많다.

 

두 캠퍼스 모두 주변에 별 게 없다. 42 실리콘밸리에선 식당 한 번 가려면 몇십 분은 걸어 나가야 했다. 항상 다른 사람의 차를 타고 나가서 모르겠지만 주변에 홈리스들이 많아 분위기가 좋지 않다고 했다. 42 서울은 근처에 개포동 시장이 있지만, 크지 않아 메뉴 고르기 쉽지 않았다.

 

두 캠퍼스 모두 굉장히 불친절하다. 무언가 질문하면 가장 많이 듣게 되는 말이 "저희 운영 원칙상 알려드릴 수 없습니다."였다. 스스로 혹은 동료와 토의를 통해 답을 알아가라는 것인데, 그 취지에는 공감하며 존중하지만 겪어보면 운영 원칙이 제대로 있기는 한 건지 의심스럽기도 하다.

  • 42 실리콘밸리에서는 접수 과정에서 문제가 생겼는지, 피신 과정에 분명 등록이 되었지만 진행 과정에서 모든 정보가 오류가 나서 클러스터에서 공부한 시간이 기록되지도 않고, 정보가 제대로 뜨지도 않는 사람이 있었다. 아무리 문의해도 그냥 피신 과정을 진행해라, 해결을 기다려봐라, 신경 쓰지 말아라 라는 자동 응답기 같은 안내만 받으며 한 달 뒤에 어찌어찌 카뎃이 된 사람도 있었다.
  • 42 서울 피신 과정을 진행하면서 매주 수요일에 일을 했는데 코로나로 인해 격일제로 운영되면서 수요일은 내가 클러스터에 나가는 날이 아니었다. 그런데 팀플을 진행하면서 수요일에 클러스터에 반드시 가야 할 일이 생겼고, 운영진에게 이러한 상황인데 방법이 없겠냐고 문의했더니 돌아온 대답은 "피신을 진행하면서 다른 일 함께 진행하기 힘들 거라고 공지하지 않았느냐, 팀원들에게 피해를 주는 건 당신의 책임이고 잘못이다. 방법은 없다 한 명이라도 나오지 못한다면 전원 0점이다."  42 서울도 일도 원래 겹치지 않는 일정이었으나 코로나로 인해 밀리고 밀리면서 겹쳐졌는데, 일부러 함께 진행한 것도 아닌데 잘못이라는 소리까지 들어야 하는지 억울했지만 어쩔 수 없었다. 그런데 수요일 당일에 운영진이 하는 말이 "미리 말했으면 상관없다. 일하면 재직증명서 가져오면 처리해주겠다."였다. 며칠 사이에 말이 달라진 모습에 당황스러웠다. 미리 문의했을 때 무조건 내 잘못이라고 하더니 방법은 있었다.

 

차이점

42 실리콘밸리 (프리몬트)

  • 작년 기준으로 지원하는데 시험이 없어졌다. 지원하면 무조건 붙는다. 선착순으로 원하는 과정에 지원하면 된다. 거의 매달 있다.
  • 피신 과정 시작 전에 별도로 모이는 시간이 없다. 시험도 없고 안내도 며칠 몇 시에 어디서 모여라 하고 끝이라 진짜 피신이 된 게 맞는지 긴가민가한 사람이 많다. 기숙사에 입소하려면 전날 가서 등록해야 한다. 아는 사람과 함께 갔다면 한 방을 쓸 수 있다. 커플이 온 경우, 한방에 남녀가 섞일 수 있다. (한방에 3-4명이 쓰며 방마다 생김새나 안에 기물, 크기가 조금씩 다르다.)
  • 피시너로 등록하는 과정에서 프로필 사진을 직접 찍는다. 그래도 아이맥으로 찍는 거라 다들 구도는 비슷하다. 화면에 얼굴을 보고 직접 찍으니 나름 굴욕은 피할 수 있다.
  • 피신 과제의 제출 기한이 정해져 있다. 기한이 지나면 자동으로 0점 처리되고 끝난다. 기한 내에 제출하면 평가는 며칠 걸려도 괜찮다.
  • 과제의 순서가 조금 섞인 느낌이다. 쉬운 문제 -> 어려운 문제 순으로 가지 않는다. 오늘 과제가 어제 과제보다 쉽기도 하다. 뜬금없는 수준의 문제들이 중구난방으로 섞여있다.
  • 시험을 볼 때, 그 문제를 틀리면 그 레벨에서 얻을 수 있는 점수가 깎이고 다른 문제를 풀어한다. 한 문제를 풀 때마다 시험의 레벨이 올라간다. 한 레벨에서 3 문제를 틀리면 시험이 종료된다. 시험이 끝난 뒤 채점 결과를 메일로 전달받는다.
  • 피신 과정을 통과하면 바로 카뎃 슬랙에 초대되며 원하는 카뎃 과정 시작 날짜를 고르면 된다. 통과하고 몇 년 뒤에 시작해도 된다.
  • 피신 과정을 통과하지 못해도 얼마든지 다시 도전할 수 있다. 그래서 세컨드 피시너들이 많다. (온갖 소문이 이들에게서 시작된다.) 단, 처음 피신 과정을 지원할 때 사용했던 이메일로 지원할 수는 없다. 이메일 주소만 다른 걸로 재도전하면 된다.
  • 본 과정 진행 중에 원하면 언제든지 일시로 멈췄다가 진행할 수 있다. (6개월 체류 비자로 과정을 진행했다면, 6개월 뒤에 멈췄다가 비자 해결 후 다시 참가해도 상관없다.)
  • 기숙사를 제공하는 대신 별도의 지원금은 없다.
  • 기숙사를 이용하려면 비자가 있어야 한다. 피시너는 이스타로 가능하지만, 카뎃은 무조건 체류 비자가 있어야한다. 기숙사와 클러스터는 다른 건물이지만 넓은 주차장 끼고 붙어 있다.
  • 비자를 위한 서류를 별도로 제공하지 않으며 카뎃이 되면 근처의 어학원을 다녀 F비자를 받는 학생이 많다고 한다. (그렇게 42를 진행하는 학생이 많아 어학원에서 학생들 기숙사에서 픽업도 해준다고 한다.)
  • 기숙사에 식당이 있어 아침 4-5달러, 점심 5달러, 저녁 6달러로 저렴하게 해결할 수 있다. (양 적고 맛없다.) 저녁 시간이 6시 반에 끝난다. 밤에 배가 많이 고프다.
  • 클러스터에 자판기, 전자레인지, 냉장고, 커피머신, 커피포트, 보드게임 있다.
  • 클러스터에 물을 가지고 자리에 가도 된다. 뚜껑 없는 용기나 책상에 올리면 페널티를 받는다.
  • 모든 카뎃과 피시너가 한 층에서 과제한다.
  • 아침에 푸시업 타임이라고 보칼이 외치면 다 같이 모여 운동 짧게 한다. 첫날 운동장에서 둥글게 모여 자기소개하는 시간도 가졌다. 간식을 먹으며 보드게임을 하는 시간을 갖기도 했다.
  • 비정기적으로 코딩 대회가 열렸다. 참가하고 싶으면 그냥 나가서 줄 서면 참가 가능했다. 팀 나눠 한 줄씩 돌아가며 코딩하기, 모니터 없이 키보드 들고 있는 카뎃에게 코드 설명해서 프로그램 짜기 등의 대회를 열었다. 상품으로 42 티셔츠나 가방을 줬다.
  • 사고 쳐서 쫓겨난 사람이 적지 않다. (주차장에서 스포츠카 위험하게 질주하는걸 인스타에 올리기, 기숙사에서 지내면서 클러스터 안 나가기, 기숙사에 있는 기물 파손 등의 이유)
  • 아이맥끼리 가깝게 붙어있어 옆사람과 이야기하기는 편하고 앞사람은 안 보인다.
  • 실리콘밸리에서 한 달 동안 공짜로 지낼 수 있는 공간을 제공하다 보니, 42 과정에 관심은 없으나 주변의 회사에 면접 볼 기회를 잡기 위해 방문한 학생도 많았다. 함께 했던 피시너 중에 과정 내내 면접을 보러 다니다 3주 차에 회사에 입사 제안을 받아 비자까지 해결한 사람도 있었다.

42 서울

  • 지원을 위해 시험을 봐야 하고 다음날이면 결과를 통보받는다. 합격 시 원하는 기수에 지원하면 된다. 
  • 피신 과정 시작 전에 모이는 시간이 있다. 코로나로 인해 온라인으로 진행했다.
  • 피시너로 등록하는 과정에서 프로필 사진을 직접 찍을 수 없다. 굴욕적인 프로필 사진은 바꿀 수 없다. 나중에 카뎃이 되면 월렛을 모아 후드티보다 비싼 프로필 사진 바꾸기 기능을 이용할 수 있다.
  • 피신 과제의 제출 기한이 없다. 제출하고 평가를 모두 받아도 일정 점수를 얻지 못하면 다른 과제를 할 수 없다. 제출 버튼을 누른 후에 하루 안에 평가를 받지 못하면 자동으로 평가되고 재제출해야 한다.
  • 과제가 실리콘밸리보다 정돈된 느낌이다. 전 과제를 잘 이해하고 있으면 다음 과제를 풀기 용이해진다. 난해한 문제들이 정리되었다.
  • 시험을 볼 때, 한 문제를 틀려도 계속해서 시도할 수 있지만 페널티를 받아 일정 시간동안 제출하지 못한다. 재도전 할 수록 페널티 시간이 길어진다. 풀지 못하면 다음 레벨로 넘어갈 수 없다. 몇 번을 틀려도 문제의 점수는 그대로다. 시험이 끝나도 관련된 메일이 오지 않는다.
  • 피신 과정을 통과하면 카뎃 과정이 시작되기 조금 전에 슬랙에 초대된다. 카뎃 과정은 피신 과정을 시작하면서 정해진 날짜가 있다.
  • 피신 과정에 참여할 수 있는 기회가 단 한번뿐이다. 탈락하면 다시는 도전할 수 없다.
  • 본 과정 진행 중에 몇 가지 정해진 경우가 아니면 과정을 중도에 일시로 멈출 수 없다.
  • 기숙사 대신 지원금이 나온다.
  • 지원금을 받으려면 4대 보험에 가입이 되어있지 않아야 한다. 외국인의 경우 지원금을 받을 수 없다.
  • 42 서울을 진행하고 있다는 관련 증빙 서류를 받을 수 없다. 카뎃 과정까지 모두 끝마치면 수료증이 발급된다고 한다.
  • 식사하러 밖으로 나가야 한다. 시간을 아껴야 하니 주로 가까운 시장으로 간다.
  • 클러스터에 자판기 없다. (전자레인지, 냉장고, 커피머신, 커피포트, 보드게임 모르겠다.)
  • 클러스터에 물 가지고 가면 안 된다. 물 마실 수 있는 오아시스라는 공간이 있다.
  • 카뎃과 피시너가 이용하는 층이 분리되어 있다. 피시너도 2개 층, 각 2개의 구역으로 나눠져 있어 모두 보기 힘들다.
  • 피시너가 모이게 되는 시간이 없었다. (코로나 때문일지도 모르겠다)
  • 슬랙을 통해 노래 맞추기 등의 대회가 열렸다. (슬랙으로 공지하고 진행했는데 잘 모르겠다.)
  • 피신 중도에 쫓겨난 사람이 있는지 모르겠지만 운영 원칙 보면 쫓겨날 수 있다.
  • 아이맥을 대체 왜 그렇게 배치했는지 모르겠다. 옆사람은 너무 멀고 고개 들면 부담스럽게 앞사람과 바로 얼굴 마주친다.

끝으로

쓰다 보니 글이 꽤나 길어졌다. 이 외에도 여러 가지 다른 점이 있지만 코로나로 인해 생긴 상황이기도 하니 따로 언급하지 않았다. 어서 코로나가 종식되어 사람들과 복작복작하게 클러스터에 모여서 코딩하고 싶다.

 

42 실리콘밸리는 20년 2월 피신 과정이 끝난 뒤에 바로 카뎃으로 들어간 사람들 외에 학생을 더 이상 받고 있지 않으며, 코로나가 한창 심각했을 땐 기숙사에 지내는 카뎃을 제외하곤 출입 금지를 하기도 했다.

 

42 서울은 피신 과정을 격일로 진행했으며, 클러스터 내에서도 거리두기를 시행해 앞 줄에 사람이 앉지 못했다. 피신과 카뎃 과정은 코로나 상황에 따라 시작하는 날이 무기한으로 미뤄졌다가 상황이 완화되었을 때 과정이 시작되는 식을 반복하고 있다. 현재 카뎃 과정은 온오프라인으로 병행하고 있으며 오프라인으로 진행하려면 클러스터 이용을 예약하고 가야 한다. (온라인으로 시작 가능한데 왜 카뎃 시작을 두 달 가까이 미뤘는지 모르겠다.)

 

42 서울 카뎃이 되면 여러 가지 혜택이 많다. 기업에서 진행하는 세미나나 프로젝트에 지원할 수도 있으니 좋은 기회가 될 것이다. (피신을 통과하고 카뎃 시작 날짜가 되기 전까지 온라인 세미나조차 참가 제한을 둬서 놓친 게 많아 아쉽다.)

 

42 실리콘밸리에선 기숙사를 제공하니 밤새 여러 사람들과 코딩도 하고 놀기도 즐거운 시간을 많이 보냈다. 장기 체류 비자도 있어 카뎃을 진행하려고 했으나 일이 꼬여 앞으로 42 실리콘밸리에 참여할 가능은 낮아졌다. 코로나로 인해 42 서울 피신 과정에서 더 많은 사람을 만나지 못한 점은 아쉽다.

 

42 서울의 카뎃 과정을 시작한 지 얼마 안 됐지만, 과정에서 정말 많은 공부를 하게 될 거 같다. 앞으로가 기대된다.

'Review > Event' 카테고리의 다른 글

[컨퍼런스] if kakao 개발자 컨퍼런스 2019  (0) 2019.08.29

문제

카카오맵 API에서 키워드로 검색을 사용하기 위해 quey 파라미터를 주는데 다음과 같은 문제를 발견했다.

query=분식,떡볶이일 떄와 query=떡볶이,분식의 경우에 결과가 다른 것을 볼 수 있다.

keyword를 보면, 파라미터에 분식,떡볶이가 하나의 키워드로 묶여서 검색된 것이다.


해결

이를 해결하기 위해선 query 파라미터에 각 파라미터를 ""로 감싸서 보내면 된다.

qurey="분식","떡볶이" 이렇게 보내면 각각 keyword에 따로 들어가 qurey="분식","떡볶이"와 qurey="떡볶이","분식"의 결과가 같은걸 확인 할 수있다.


sequel pro를 사용해 MySQL을 쓸 때 사용자 지정 함수를 생성하는 방법은 다음과 같다.

DROP FUNCTION 'ufn_board_no'
delimiter ||
CREATE DEFINER=`test`@`%` FUNCTION `ufn_board_no`() RETURNS int(11)
BEGIN
DECLARE v_result INT(11);
SELECT MAX(a.no) + 1 INTO v_result
FROM table_sequense a
WHERE 1=1
AND a.name='board_no';
if v_result is null then
set v_result = 1;
end if;
INSERT INTO TABLE_SEQUENSE (`no`, `name`) VALUES (v_result, 'board_no');
RETURN (v_result);
END;
||
delimiter;

 

기존에 있는 함수의 syntax를 확인하면 다음과 같다.

CREATE DEFINER=`test`@`%` FUNCTION `ufn_board_no`() RETURNS int(11)
BEGIN
DECLARE v_result INT(11);
SELECT MAX(a.no) + 1 INTO v_result
FROM table_sequense a
WHERE 1=1
AND a.name='board_no';
if v_result is null then
set v_result = 1;
end if;
INSERT INTO TABLE_SEQUENSE (`no`, `name`) VALUES (v_result, 'board_no');
RETURN (v_result);
END;

 새로 함수를 생성하려면 Query 탭에서 제일 위의 코드와 같이 다음 코드를 추가해주면 된다.

DROP FUNCTION 'ufn_board_no'
delimiter ||
||
delimiter;
// Grid 출력하기
jQuery(document).ready(function(){
jQuery("#list1").jqGrid({
url:'bbsListAjax',
datatype: 'json',
mtype: 'POST',
jsonReader : {
page: "page",
total: "total",
root: "rows",
records: function(obj){return obj.length;},
repeatitems: false,
id: "bbs_no"
},
colNames:['수정일자','게시글번호','입력구분','등록일자', '등록자','제목','내용'],
colModel:[
{name:'MODI_DATE',index:'MODI_DATE', width:100, align:"center"},
{name:'BBS_NO',index:'BBS_NO', width:80, align:"center"},
{name:'BBS_DV_CD',index:'BBS_DV_CD', width:150, align:"center"},
{name:'REG_DATE',index:'REG_DATE', width:150, align:"center"},
{name:'REG_NO',index:'a.auth_nm', width:150, align:"center"},
{name:'SUBJECT',index:'SUBJECT', width:60, align:"center"},
{name:'CONTENT',index:'CONTENT', width:150, align:"center"},
],
rowNum:20,
autowidth: true,
height:'auto',
pager: jQuery('#pager1'),
sortname: 'BBS_NO',
viewrecords: true,
sortorder: "desc",
caption:"게시글목록",
onSelectRow: function(id){
if (id) {
ajaxEdit(id);
}
}
}).navGrid("#pager1",{search:false,edit:false,add:false,del:false});
});

데이터를 Json 객체로 받아와 화면에 JqGrid로 출력하려고 하는데 화면에 아무것도 출력되지 않았다.

DB에 아에 샘플 데이터가 없는 경우에는 다음과 같이 문제 없이 파싱이 잘 됐는데 샘플 데이터가 있는 경우에는 파싱이 되지 않는 것을 크롬 개발자 도구를 통해 확인할 수 있었다.

파싱 성공
파싱 실패

{"total":1,"record":1,"page":1,"rows":[{"MODI_DATE":"2020-02-02 02:02:02.0","BBS_NO":"1","BBS_DV_CD":"1","REG_DATE":"2020-06-19 00:16:08.0","SUBJECT":"This is Test","DEL_DATE":"2033-03-03 03:03:03.0","CONTENT":"I have a parsing problem"}]}

Json 객체를 보니 TIMESTAMP에 소수점까지 표시되고 있는걸 확인했다.

SQL SELECT문에서 날짜와 관련된 칼럼명을 모두 지우자 다음과 같이 문제없이 파싱이 되었다.

이를 해결하기 위해 mapper.xml에서 SELECT문에서 BBS.MODI_DATE를 다음과 같이 고치자 소수점이 더 이상 출력되지 않았고 파싱도 문제 없이 잘 되었다.

SELECT
DATE_FORMAT(BBS.MODI_DATE,'%Y-%m-%d %H:%i:%s') AS MODI_DATE

버튼을 눌러 주사위를 굴려 값을 얻는 예제를 실행하기 위해 다음과 같이 코드를 작성하였다.

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.roll_button)
rollButton.setOnClickListener{
rollDice()
}
diceImage = findViewById(R.id.dice_image)
}
private fun rollDice() {
val randomInt = Random().nextInt(6) + 1
val drawableResource = when (randomInt){
1 -> R.drawable.dice_1
2 -> R.drawable.dice_2
3 -> R.drawable.dice_3
4 -> R.drawable.dice_4
5 -> R.drawable.dice_5
else -> R.drawable.dice_6
}
val diceImage: ImageView = findViewById(R.id.dice_image)
diceImage.setImageResource(drawableResource)
}
}

26번째 줄을 보면 함수가 실행 될 때마다 diceImage 변수를 생성하여 findViewById 함수를 이용하여 초기화를 하기 때문에 비효율적이다.

val diceImage: ImageView = findViewById(R.id.dice_image)

findViewById 함수는 Id의 트리를 모두 탐색하기 때문에 여러번 호출하는 것은 앱의 실행 시간에 영향을 끼칠 수 있다.

 

따라서 다음과 같이 코드를 수정하였다.

class MainActivity : AppCompatActivity() {
val diceImage: ImageView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.roll_button)
rollButton.setOnClickListener{
rollDice()
}
diceImage = findViewById(R.id.dice_image)
}
private fun rollDice() {
val randomInt = Random().nextInt(6) + 1
val drawableResource = when (randomInt){
1 -> R.drawable.dice_1
2 -> R.drawable.dice_2
3 -> R.drawable.dice_3
4 -> R.drawable.dice_4
5 -> R.drawable.dice_5
else -> R.drawable.dice_6
}
val diceImage: ImageView = findViewById(R.id.dice_image)
diceImage.setImageResource(drawableResource)
}
}

3번째 줄에 변수로 diceImage를 생성, null로 초기화해준다.

val diceImage: ImageView? = null

그러나 이 코드 역시 변수를 사용하기 위해서 null 체크를 해줘야 하는 번거로움이 남는다.

이를 다음과 같이 lateinit을 사용하면 나중에 변수의 값을 초기화 해줄 수 있다.

lateinit val diceImage: ImageView

하지만 이 코드를 실행하려고 하면 'lateinit' modifier is allowed only on mutable properties 라는 에러가 발생하는데

이는 lateinit 은 immutable(불변) 타입인 val에 사용할 수 없기 때문이다.

따라서 val 변수을 mutable(가변) 타입인 var으로 바꿔주면된다.

lateinit var diceImage: ImageView
class MainActivity : AppCompatActivity() {
lateinit var diceImage: ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.roll_button)
rollButton.setOnClickListener{
rollDice()
}
diceImage = findViewById(R.id.dice_image)
}
private fun rollDice() {
val randomInt = Random().nextInt(6) + 1
val drawableResource = when (randomInt){
1 -> R.drawable.dice_1
2 -> R.drawable.dice_2
3 -> R.drawable.dice_3
4 -> R.drawable.dice_4
5 -> R.drawable.dice_5
else -> R.drawable.dice_6
}
diceImage.setImageResource(drawableResource)
}
}

val 변수의 초기화를 나중에 하고 싶다면 'by lazy'를 사용하면 되는데 val 변수이기 때문에 나중에 한번 초기화한 이후엔 바꿀 수 없다.

val diceImage: ImageView by lazy

 

 

결론

- findViewById 함수를 여러번 호출하는 것은 앱의 실행 시간에 영향을 끼칠 수 있다.

- lateinit val은 불가능 하며 lateinit var를 사용하거나 by lazy를 사용한다.

 

참고
 

Developing Android Apps with Kotlin

Learn the fundamentals of the Kotlin programming language from Kotlin experts at Google.

www.udacity.com

 

클라우드의 충격

이 책을 중고서점에서 구매한 지는 몇 년이나 되었지만 책장 한편에 방치하고는 읽을 생각을 전혀 못하고 있었다. 최근 클라우드 서버에 대한 관심이 생기면서 읽을 책을 찾아보다가 불현듯 내가 이 책을 소장하고 있었다는 점이 생각나서 읽게 되었다. 책의 초반에는 SaaS, PaaS, HaaS에 대한 설명으로 시작하는데 익숙하지 않은 용어에 읽는 데에 시간이 꽤나 걸리겠다는 예감이 들었다. 그러나 다양한 회사의 사례를 기반으로 이야기를 풀어나가면서 용어에 대한 개념이 어느 정도 잡히자 순식간에 책 한 권을 다 읽을 수 있었다. (사실 그렇게 두꺼운 책도 아니다.)

 

책이 쓰인 2008년은 아마존이 막 AWS 서비스(Amazon Web Services)의 베타 테스트를 끝내고 정식 운영을 시작한 즈음이다. 2020년인 지금 십 년도 더 된 일이지만 현재 얼마나 많은 사업이 AWS을 이용하고 있는지를 생각하면 클라우드 컴퓨터는 한순간 지나가는 유행이 아닌 기본으로 자리 잡아가고 있다고 해도 과언이 아니다. 이 책에서는 아마존을 비롯해 구글, 마이크로소프트, AT&T, 세일즈포즈닷컴, IBM 등 각 대기업이 어떤 식으로 클라우드 컴퓨팅 시대를 주도하는지에 대해 이야기한다. 

 

일반 컴퓨터 사용자로서 역시 가장 피부에 와 닿는 서비스는 SaaS이다. Gmail 같은 이메일 서비스를 이용한다면 이미 클라우드 서비스를 사용하고 있다고 할 수 있다. SaaS는 컴퓨터에 소프트웨어를 설치하여 사용하는 것이 아니라 인터넷 서비스로서 이용하는 형태의 서비스를 말한다. 이러한 형태의 서비스는 설치하는 번거로운 과정을 생략할 수 있으며, 일정 기간 혹은 사용량에 따른 사용료를 지불하는 방식을 채택한 경우가 많다. 이러한 서비스는 역시 구글이 강자가 아닐까 싶다. 나는 평소에 구글 Docs를 자주 사용한다. 파일을 어느 기기에서나 인터넷만 된다면 읽고 쓸 수 있으며, 무엇보다 다른 사람들과 함께 문서를 편집할 수 있다는 점에서 굉장히 편리하다.

 

'우리가 정말 필요로 했던 것은 평범한 브라우저가 아니라 웹 페이지와 웹 애플리케이션을 위한 모던한 플랫폼이다.'라고 구글이 독자 브라우저 개발에 착수한 경위가 구글 공식 블로그에 설명되어 있다. 구글은 앞으로 더욱 복잡해질 웹 애플리케이션이 쾌적하게 동작할 플랫폼으로서의 역할을 브라우저에 맡긴 것이다.
- 클라우드의 충격 P.159

현재 크롬에서 지원하는 웹 애플리케이션을 보면 별도의 소프트웨어 설치 없이 크롬만으로 모든 기능을 다 할 수 있을 듯 보인다. 실제로 2011년 크롬북이 출시될 수 있었던 이유는 구글이 클라우드 컴퓨팅을 위한 투자를 꾸준히 했기 때문이다.

 

클라우드 컴퓨팅이 어떤 것인지 개념은 알고 있었지만 이렇게 실생활에 깊숙하게 만연해 있다는 점은 인식하지 못하고 있었다. 비록 출간된 지 십 년도 넘은 데다 절판된 책이지만 클라우드에 대한 기초 상식을 채우는 데에는 매우 유익한 책이다. 이렇게 오래된 책을 읽을 때는 저자가 예상한 미래가 얼마나 일치하는지 알아보는 재미도 있다. 앞으로 클라우드에 대한 공부를 계속하면서 이 책에 나온 내용을 적용, 비교하는 재미가 있으리라 기대해 본다.

ResumeGenius
 

Free Resume Builder | Create a Professional Resume Fast

The only online resume builder that’ll land you interviews. Create a professional resume in minutes, download, and print. Join 10 million happy job seekers.

resumegenius.com

  • 회원가입을 별로로 하지 않아도 바로 다양한 이력서 양식을 채워서 PDF 파일을 다운로드할 수 있다.
  • 구직 중인 업종별로 자조서 샘플을 제공한다는 장점이 있다.
  • 어떤 식으로 이력서와 자소서를 쓰면 좋은지에 대한 다양한 포스팅을 볼 수 있다.

 

Creddle
 

Creddle

Creddle helps you make beautiful, modern, paper-friendly web résumés.

creddle.io

  • 회원가입 후 이용할 수 있다.
  • 이력서 내용을 Content에 먼저 채운 후에 이를 바탕으로 Format를 채운다.
  • 양식의 폰트나 색상, 정렬 등 세부 사항을 커스터마이징 할 수 있다는 장점이 있다.

 

Novoresume
 

Resume Builder for 2020 | Free Resume Builder | Novorésumé

Make a perfect resume in 2020 and get your dream job using the free resume builder. Select a template. Personalize it. Get more interviews.

novoresume.com

  • 회원가입 후에 이용할 수 있다.
  • 무료 버전에서는 한 개의 이력서만 작성할 수 있으며 이력서가 한 장 이상일 경우 다운로드할 수 없다.
  • 커버레터는 여러개 작성할 수 있다.
  • Content를 채울 때 작성한 항목에 대한 조언을 볼 수 있다. (ex. 경력사항은 몇 가지 항목으로 작성하는 것이 좋다. 등)
  • Language나 Skill 등의 항목을 아이콘으로 표현해 깔끔한 이력서를 작성할 수 있다.
  • 간단한 커스터마이징이 가능하지만 Creddle처럼 자유도가 높지는 않다.

+ Recent posts