기술없는 기술 블로그 RSS 태그 관리 글쓰기 방명록
전체 글 (18)
2021-05-27 22:05:48


지난주에 마감한 카카오게임즈에서 기술직군 인턴에 지원했는데 코딩테스트 대신 사전과제가 있었다. 인턴십 지원 기간에 업로드 할 만한 내용은 아니라 시간이 좀 지난 오늘부터 포스팅을 시작하기로 했다.


아무래도 사전과제 1번 항목의 경우 업무 수행에 관한 서술과제이다 보니 조금 조사가 필요했다.
채용 정보 사이트에서 카카오게임즈 채용에 대해 검색해 보니 기술지원 PM에 대한 채용의 지원 조건, 우대 사항과 인터뷰 등을 검색으로 확인할 수 있었고 그림처럼 플랫폼과 서비스 인프라 두 가지로 요약할 수 있었다.

플랫폼 연동 기술지원 PM 채용 정보

https://www.inven.co.kr/webzine/news/?news=206550
플랫폼, 서비스 인프라 구축에 대한 발표 내용

해당 항목에 대해선 구체적인 서술 내용은 올리지 않으려 한다. 기술직군 entity 내부의 resolve Technical Issue와 사업, 개발사, 기술직군, QA 사이의 Issue를 연관 관계로 기술직군을 중심으로 개발사와의 어떤 기술적인 이슈 해결을 위해 소통을 할지에 대해 기술했다.

2021-05-25 20:28:46

HTML, CSS, JavaScript는 웹 브라우저에서 페이지를 렌더링하기 위해 필요한 세 가지 요소이다.

 

이 중에서 특별한 경우가 아니라면 눈에 보이는 디자인 요소인 HTML과 CSS파일을 빨리 불러와 페이지 로딩 속도를 높이는 것이 중요하다. 사람 눈이란게 간사해서 0.1초만 깜빡이면서 로딩이 늦어도 페이지 렉이 심하다고 생각하기 때문

 

아무튼 HTML은 위에서부터 차례대로 코드가 실행되기 때문에 <head>가 끝나야 <body>가 실행된다.

즉 header에서 대용량의 제이쿼리와 자바스크립트문이 존재한다면 해당 스크립트문의 처리가 끝나기 전까지는 화면에서는 body 부분이 실행되지 않기 때문에 백지화면만 노출된다.

 

그에 반해서 css는 화면의 디자인을 표현하는 역할을 맡고있으니 head에서 미리 불러 와야한다. css파일을 헤더에서 미리 불러오지 않으면 존재하지 않는 css파일을 참조한 화면이 흔히 말하는 엑박같이 깨진 상태를 유저가 볼 수 있기 때문이다.

로딩이 안되면 자동차가 안나오고 로딩이 덜되면 자동차가 박살난다

2021-05-02 23:11:33

코딩 테스트를 준비하면서 따로 정해진 코스대로 공부하는 건 아니지만

 

카카오 블라인드 기출을 올해 기준으로 지금까지 3회의 코딩테스트(네이버, 라인, 카카오)를 보면서 느낀점은

 

1. 문자열 처리 문제가 약하다. 정규식 공부를 하자

 

2. 슬라이딩 윈도우 알고리즘. 스택, 큐를 활용한 문제를 조금 더 공부하자

 

3. dp와 크루스칼, 다익스트라, 플로이드 와샬 알고리즘 관련 문제를 '완벽히' 풀 수 있다는 것은 오만이고 거짓말이지만 어느정도 손을 대서 풀 수 있다는 확신을 얻었다. 물론 시간 내에 풀 수 있다는 말은 아니고 문제를 이해했다는 소리다.

 

기본적인 구현 문제. 문자열이나 스택, 큐를 활용한 기본 문제에 집중하기로 결심했고

 

알고리즘을 제외한 공부에서는 보통 직무, 기술 인터뷰 내용을 참고해서 공부하거나 공부할 내용을 선정하는 편인데

 

Java

  • Managed - Unmanaged 언어의 차이는 무엇이고 어떤 장 단점이 있나요?
  • Java 접근 제어자에 대해서 각각 설명해 주세요.
  • JVM의 구조에 대해서 설명해 주세요.
  • Garbage Collector 에 대해서 설명해 주세요. 어떻게 동작하나요?
  • GC의 종류에 대해서 말해보세요.
  • Java 버전 별 특성에 대해서 아는대로 말해주세요.
  • Java는 Call By Value일까요, Call By Reference 일까요?
  • Shallow Copy와 Deep Copy의 차이는 무엇인가요? 자바에서 Deep Copy를 하기위해선 무엇을 사용하여야 하나요?
  • 리플렉션(Reflection)이란 무엇인가요?
  • Java Instrumentation이란 무엇인가요?
  • Stream API란 무엇인가요?
  • Lambda란 무엇인가요?
  • 함수형 인터페이스란 무엇인가요?
  • JVM 기동시 주로 사용되는 옵션들을 아는대로 말해보세요.
  • foreach를 사용할 수 있는 자료구조는 어떤 인터페이스를 상속받고 있나요?
  • iterator와 iterable 차이는 무엇인가요?
  • synchronized 키워드에 대해 설명해 주세요.
  • Java의 synchronized Lock 범위에 대해서 알려주세요.
  • volatile 키워드에 대해 설명해 주세요.
  • atomic Type는 무엇이고 언제 사용하여야 할까요?
  • 스레드에서 Race condition에 대해서 설명해주세요.
  • final 키워드에 대해서 설명해주세요. 각각의 쓰임에 따라 어떻게 동작하나요?
  • Wrapper Class란 무엇인가요?
  • 클래스, 객체, 인스턴스 차이에 대해서 설명해 주세요.
  • 불변 객체는 무엇이고 어떻게 구현할까요?
  • 직렬화(Serialization)과 역직렬화(Deserialization)에 대해서 설명해 주세요.
  • Java Generic에 대해서 설명해 주세요.
  • 재 정의된 equals와 ==의 차이는 무엇인가요?
  • hashCode란 무엇인가요?
  • 문자열을 리터럴(string = "abcd")로 할당하는 것과 객체(string = new String("abcd"))로 할당하는 방식의 차이가 무엇인가요?
  • 추상 클래스와 인터페이스의 차이는 무엇인가요?
  • 본인 관점에서, 인터페이스는 주로 어떨 때 사용하나요?
  • 객체 지향을 왜 쓴다고 생각하시나요?
  • Java의 Collection에 대해서 설명해 주세요.
  • Array와 ArrayList의 차이점은 무엇인가요?
  • LinkedList와 ArrayList의 차이점은 무엇인가요?
  • 컴파일러는 문자열 연산 최적화를 어떻게 진행하나요?
  • SringBuilder를 사용하는 것과 String을 사용하여 연산하는 것에서 어떠한 큰 차이가 존재할까요?
  • Stack을 사용하지 못하는 상황에서 대체할 수 있는 Collection은 무엇이 있을까요?
  • Vector와 Stack을 사용하지 않는 이유는 무엇인가요?
  • Lock Stripping은 무엇이고 어떠한 자료구조가 해당 방식을 구현하였나요?
  • 해시테이블에 대해서 설명해주시고, 해시 충돌 발생시 자바는 어떻게 대처하나요?
  • char type과 string type으로 나뉘어져 있는 이유는 무엇인가요?

Spring

  • CGI는 무엇이고 Servlet API는 무엇이며, 어떤 차이가 있나요?
  • Spring이란 무엇인가요?
  • IoC, DI가 왜 좋은 걸까요?
  • IoC Container란 무엇인가요?
  • Spring, Spring Boot의 차이점에 대해 각각 설명해 주세요.
  • Spring Boot가 해결하려고 했던 문제는 무엇이고 어떻게 해결하였나요?
  • Spring Framework의 빈 생명 주기에 대해서 말해주세요.
  • 순환 참조는 무엇이고 어떻게 발생하나요?
  • 생성자 주입은 빈 생성 때 사용되는 리플랙션 외에 추가적인 리플랙션을 진행하나요?
  • Bean이란 무엇인가요?
  • Bean Scope와 종류에 대해 아는 만큼 설명해주세요.
  • Bean Lite Mode는 무엇인가요?
  • @Bean과 @Component은 각각 언제 사용되고 어떤 차이점을 가지나요?
  • Interceptor와 Filter의 차이점을 말해주세요.
  • 스프링에서 Bean으로 Filter를 구현할 수 있을까요? 혹시나 가능하다면 어떻게 할 수 있을까요?
  • Message Converter 와 MV Container는 각각 어떻게 개입하고 어떤 방식으로 동작하나요?
  • Spring AOP는 CTW, LTW, RTW 중에 무엇이고 Aspactj 와 비교하여 언제 사용하는 것이 좋고 언제 사용하지 않는 것이 좋을까요?
  • VO, DTO, DAO에 대해서 각각 설명해 주세요.
  • Spring AOP는 어떻게 동작할까요? (프록시는 언제 생성되고 요청은 어떻게 잡아내나요?)
  • MVC1, 2 개념에 대해서 설명해 주세요.
  • Dispatcher-Servlet이란 무엇인가요?
  • Spring MVC에서 HTTP 요청이 들어왔을 때의 흐름을 설명해 주세요.

Etc.

  • 프레임워크와 라이브러리 차이는 무엇인가요?
  • 디자인 패턴이란 무엇인가요?
  • Monolitc Architecture, Micro Service Architecture에 대해 각각 설명해 주세요.
  • Thread-safe한 프로그래밍이란 어떤 것인가요?

 

출처 : https://www.notion.so/d917555436e84d2a9c9acf454f4446ab#8cfcde05f6ce49f88ccc2c024fe9c4d6

 

신입 개발자의 자바, 스프링 학습 자료

ol은 학습 순서 순

www.notion.so

 

www.youtube.com/channel/UCSEOUzkGNCT_29EU_vnBYjg

 

개발바닥

본격 세계최초 개발 엔터테인먼트 토크쇼!! 스타트업 개발자와 유니콘기업 개발자!! 구독 안하면 장애남!!

www.youtube.com

 

굳이 따로 정리하진 않았지만 창천향로님과 호돌맨님이 말씀하신 걸 보면서 이것 저것 찾아보고 있다.

 

원래 공부하던 mulitithread나 multiprocessing 관련으로는 손을 조금 놓고 있는 모습이다.

 

하긴 알고리즘 언어로 파이썬으로 잠시 넘어가면서 멀티 스레드 관련을 공부하기엔 환경상 맞지 않는 부분도 있다.

 

분산 처리로는 상관없지않나..? 라는 생각을 하지만 일단 할 수 있는 것부터 조금씩 하기로 하자

'자유 > 잡담' 카테고리의 다른 글

라즈베리파이 서버 구축  (0) 2021.04.06
2021-04-17 00:02:08

programmers.co.kr/learn/courses/30/lessons/42626

 

import java.util.PriorityQueue;

class Solution {
    public int solution(int[] scoville, int K) {
        
        // 전처리 ,입력
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        int answer = 0;
        for ( int i : scoville ){
            pq.add(i);
        }
        
        // 계산
        int a, b;
        try{
            while (pq.peek() < K ){
                a = pq.poll();
                b = pq.poll();
                pq.add(a + 2 * b);
                answer++;
            }
        } catch(Exception e){
            return -1;
        }
        return answer;
    }
}

 

프로그래머스에서 기본 연습문제로 제공하는 Heap 문제

 

 

우선순위 큐를 사용해서 첫번째와 두번째 값을 가져오는데 특정 값 K가 만족 되지 않으면 계속 반복하는데 while(true)를 사용하면 불가능한 경우에도 출력하려다가 NullPointException을 발생시키게 된다. 그 에러 케이스를 이용해서 return -1을 사용하여 문제 해결

'study > algorithm' 카테고리의 다른 글

Java에서 쓰는 equals()와 hashCode()  (0) 2021.04.06
2021-04-10 23:55:12

마리아디비 설치는 sudo apt-get install mariadb-server를 터미널에 입력하면 설치할 수 있고 mysql과 사용법이 똑같아서 sudo mysql -uroot -p로 쉽게 접속할 수 있지만 라즈베리에 설치하다 보니 온라인으로 접속할 필요를 느껴서 워크벤치랑 온라인으로 연결하기로 했다.

나는 mariadb-server를 사용하니까 /etc/mysql/mariadb.conf.d 디렉토리 안에 있는 50-server.cnf를 편집한다.

$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf

bind-address = 127.0.0.1 부분을 주석처리하거나 지워준다.
일부러 구분하기 편하게 ## 두개로 주석처리했다.

bind-address는 해당 IP 주소에서 접속만 허용한다는 의미다. 루프백 IP 혹은 localhost로 부르는 IP가 127.0.0.1이니까 컴퓨터 내부에서만 접속을 허용한다는 의미다.

$ sudo service mysql restart


service 대신에 systemctl을 써도 상관없다. 설정을 바꿨으니 재실행 시킨다.

[mysql]> grant all on <DB이름>.<테이블> to <'user'>@<'host'> identified by <'password'>; [mysql]> flush privileges;


host 부분에 '%'를 넣으면 모든 IP에서 접근이 가능해지고 'localhost' 혹은 '127.0.0.1'을 넣으면 라즈베리파이에서만 접근이 가능하다. 원격으로 조회가 안된다는 뜻.

모든 DB와 테이블에 권한을 부여하고싶으면 *.* 을 특정 DB만 부여하고싶으면 <특정 DB이름>.* 를 특정 DB의 특정 테이블만 권한을 부여하고싶으면 <DB 이름>.<해당 DB에 있는 테이블 이름>을 적는다.

2021-04-07 23:27:01

라즈베리파이 ftp 연결하다 service랑 systemctl 차이가 궁금해서 찾아봤다

 

간편하게 말하면 service는 systemctl의 wrapper script다

밑에 있는 사이트에서 systemctl을 검색하면 systemctl call이라는 주석이 보인다.

start나 stop과 같은 기능을 할 때 부가적인 요소들을 어느정도 같이 제어해준다고 생각하면 될 것 같다.

 

git.launchpad.net/~usd-import-team/ubuntu/+source/init-system-helpers/tree/script/service?h=ubuntu/xenial

 

service\script - ~usd-import-team/ubuntu/+source/init-system-helpers - [no description]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 8

git.launchpad.net

 

 

2021-04-06 23:47:47

홈 서버 구축 해보려고 이것저것 깔아서 깔기 시작했다.

 

라즈비안 + MariaDB 베이스로 이것저것 공부용 토이프로젝트를 해보는게 목표

 

아이폰이나 맥은 없지만 안드로이드는 대충 만들줄 아니 웹까지해서 디자인 신경안쓰고 로그인 기능부터 하나씩 구현해보고 궁금하거나 이해안되는 부분이 나오면 하나씩 공부한걸 쓰기로 결정

'자유 > 잡담' 카테고리의 다른 글

최근 들어 공부하고 있는 것들  (0) 2021.05.02
2021-04-06 18:01:20

Java에서 동치성을 확인 할 때 equals()와 hashCode() 두 개의 메서드로 확인하는 데 예전에 공부했던 기억은 있는데 정확하게 기억이 안나서 다시 보기로 했다.

 

Java API에서 hashCode()와 equals() 메서드의 정의는 java.lang.Object에 있다.

 

docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--

 

Object (Java Platform SE 8 )

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup. The general contract of fi

docs.oracle.com

해시코드

This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java™ programming language.

 

해시코드 메서드는 따로 오버라이딩을 하지 않으면 객체의 내부 주소를 정수형으로 반환한다.

 

따로 객체를 만들고 오버라이딩 하지 않은 후 System.identityHashCode()를 사용해서 비교해봤다.

public class A{
	priavte int a;
    
	A(int a){
		this.a = a;
	}
}


public class Main(String[] args){
	A a = new A(1);
	A b = new A(1);

	System.out.println("address of a\t: " + System.identityHashCode(a));
	System.out.println("hashCode of a \t: " + a.hashCode());
		
	System.out.println();
	System.out.println("address of b\t: " + System.identityHashCode(b));
	System.out.println("hashCode of b \t: " + b.hashCode());

	System.out.println();
	System.out.println("a.equals(b) : " + a.equals(b));
}

 

실행 결과

 

당연히 해시코드를 따로 선언해주면 잘 돌아간다.

 

public class A{
	priavte int a;
    
	A(int a){
		this.a = a;
	}
    
    @Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + a;
		return result;
	}
}

hashCode() 오버라이드 결과

 

해시코드하면 떠오르는 게 있는데 HashMap, HashSet, HashTable들이다.

해시코드를 키로 사용하는 애들이니까 hashCode()만 오버라이드하면 같은 객체로 인식하지 않을까 테스트 해봤다.

 

import java.util.HashMap;

public class Main(String[] args){

	HashMap<A, Integer> hm = new HashMap<>();
	A a = new A(1);
	A b = new A(1);
    
	hm.put(a, 1);
	hm.put(b, 1);
    
	System.out.println("address of a\t: " + System.identityHashCode(a));
	System.out.println("hashCode of a \t: " + a.hashCode());
		
	System.out.println();
	System.out.println("address of b\t: " + System.identityHashCode(b));
	System.out.println("hashCode of b \t: " + b.hashCode());

	System.out.println();
	System.out.println("a.equals(b) : " + a.equals(b));

	System.out.println("HashMap Size : " + hm.size());
}

HashMap

 

 

 

해시맵 사이즈를 보면 해시코드값만 같다고 키값이 같은건 아니란걸 알 수 있다.

 

자세히 알아본 결과 해시 구조를 사용한 자료구조에서는 HashCode를 먼저 비교한 후에 해시코드가 동일하면 equals()를 통해서 동치성을 확인한다는 내용이었다.

 

잘찾아보면 친절하게 설명도 해주신다

 

docs.oracle.com/javase/8/docs/api/java/util/HashMap.html#get-java.lang.Object-

 

HashMap (Java Platform SE 8 )

If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null. If the function returns null no mapping is recorded. If the function

docs.oracle.com

 

More formally, if this map contains a mapping from a key k to a value v such that (key==null ? k==null : key.equals(k)), then this method returns v; otherwise it returns null. (There can be at most one such mapping.)

 

여기서 K가 의미하는 자료형이 해시코드라는걸 생각한다면 해시구조에서 동치성을 확인 할 때 해시코드를 먼저 비교하고 해시코드가 같으면 equals()로 동치성을 확인한다는걸 알았다.

 

만약에 해시코드만 다르다? 동치성은 확인조차 못하고 넘어간다.

 

# Reference Type의 경우는 위에서 서술한 Object Class에서 상속받은 HashCode()와 equals()를 오버라이딩 하거나 시메모리 기본 메서드를 활용해서 동치성을 확인하지만 Primitive Type은 어떻게 동치성 ( == )을 확인할 수 있는 이유는 다음과 같다.

변수 선언부는 JVM의 Runtime Data Areadptj JVM Stack에 저장되고 기본형 타입의 데이터는 스택에 바로 저장하는 것이 아니라 Method Area 내부에 상수를 저장해둔 공간의 주소를 point 한다.

그래서 각 기본형 타입의 변수는 Method Area에 저장된 상수값을 불러오는 것이도 동치성을 확인하는 작업 ( == ) 에서는 상수의 주소를 비교해서 동치성을 체크하게 된다.

 

 

'study > algorithm' 카테고리의 다른 글

프로그래머스/Java - 더 맵게(level 2)  (0) 2021.04.17