벌써 2022년 한해가 지나갔다... 시간이 왜이렇게 빠를까 ㅠㅠㅠㅠㅠㅠㅠ 개발자들의 1년 회고글을 보면서 동기부여되는 점도 많았고 느끼는 것도 많았었다. 이번 1년은 의미있는 일이 많았고 나름(?) 열심히 지냈기에 정리해보며 1년을 마무리해보려한다. 1. SSAFY(삼성 청년 SW 아카데미) 1) 입학 🥳 1월 초부터 시작했던 싸피.. 코로나 때문에 온라인으로 시작했었다. 집으로 배송되었던 웰컴키트.. 받은게 엊그제 같다 ㅎㅎ 운 좋게도 입학식 인터뷰 대상자가 되어서 서울캠퍼스 가서 촬영도 하고 왔었다. 좋은 경험이 될 것 같아 갔다왔지만,,, 영상에서 얼굴이 너무 못나와서 후회했다는,,,,😂 2) 1학기 교육과정 📒 1학기는 전면 온라인으로 진행되었다. 집순이인 나는 온라인 교육이 너무 편했다! 1학..
코딩테스트에서 풀었던 문제다. 물론 100점을 맞지는 못했던 문제라서 내가 풀었던 풀이를 다시 살펴보고, 문제를 다시 풀어보았다. 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 2022 테크 여름인턴십 코딩테스트 해설 2022년 카카오 여름 인턴십 코딩 테스트가 지난 5월 7일에 5시간에 걸쳐 진행되었습니다. 시간이 부족하여 문제를 풀지 못하는 아쉬움이 없도록 1시간을 늘려 테스트를 진행한 것이 작년과 조금 tech.kakao.com 문제 설명 더보기 XX산은 n개의 지점으로 이루어져 있습니다. 각 지점은 1부터 n까지 번호가 붙어있으며, 출입구, 쉼터,..
요즘은 이분탐색 문제를 풀고 있다. 이분탐색은 코드를 짜는것 자체는 어렵지 않지만, 어떤식으로 어떤 값을 탐색해나가야할지를 알아내는 것이 어렵다. 보통, 1억개 연산에 시간이 1초가 걸리기 때문에 이를 고려하여 시간초과가 날 것 같으면 이분탐색을 해야한다. 이 문제 역시, 어떤값을 이분탐색해야할지를 찾지 못해서 다른 사람의 풀이를 참고하였다. https://www.acmicpc.net/problem/1939 1939번: 중량제한 첫째 줄에 N, M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1 ≤ A, B ≤ N), C(1 ≤ C ≤ 1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이 www.acmicpc.n..
[아이템 50]에서 불변인 날짜 범위 클래스를 만드는 데 가변인 Data필드의 불변을 유지하기 위해 생성자와 접근자에서 Date 객체를 방어적으로 복사하느라 코드가 길어졌었다. //방어적 복사를 사용하는 불변 클래스 public final class Period { private final Date start; private final Date end; /** * @param start 시작 시각 * @param end 종료 시각; 시작 시각보다 뒤여야 한다. * @throws IllegalArgumentException 시작 시각이 종료 시각보다 늦을 때 발생한다. * @throws NullPointerException start나 end가 null이면 발생한다. */ public Period(Date..
고민 후 괜찮다고 판단할 때만 기본 직렬화 형태 사용하기 유연성 , 성능, 정확성 측면에서 신중히 고민 후 합당할 때만 사용 이상적인 직렬화 상태 : 객체의 물리적 표현(코드로 어떻게 구현했는지)과 논리적 내용(실제로 의미하는 것)이 같다면 기본 직렬화 형태여도 무방함 //기본 직렬화 형태에 적합 public class Name implements Serializable { private final Stirng lastName; private final String firstName; private final String middleName; } 기본 직렬화 형태가 적합하더라도 불변식 보장과 보안을 위해 readObject 메서드를 제공해야 할 때가 많음. 위의 예시에서 lastName, firstNam..
Serializable Serializable 인터페이스의 구현 클래스는 인스턴스를 직렬화할 수 있다. Serializable 구현은 아주 값비싼 일 Serializable 구현 후 릴리스한 뒤에는 수정이 어려움 직렬화 형태도 하나의 공개 API가 되어 영원히 지원해야함 자바의 기본 직렬화 형태에서는 클래스의 private, protected 필드들도 API로 공개되어 캡슐화가 깨짐 뒤늦게 클래스 내부 구현을 손보면 원래의 직렬화 형태와 달라지게되어 안됨 직렬화 가능 클래스를 만들고자 한다면 고품질의 직렬화 형태도 주의해서 함께 설계해야함 [아이템 87,90] 모든 직렬화된 클래스는 고유 식별 번호를 부여받고 (serialVersionUID라는 static final long 필드), 이 번호를 명시하지..
직렬화 java.io.Serializable 인터페이스를 상속받은 객체를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술 직렬화의 문제는 공격범위가 너무 넓고 지속적으로 더 넓어져 방어하기 어렵다는 점 (객체를 역직렬화할 수 있어서 공격에 위험함) 역직렬화 : 직렬화와 반대로 byte로 변환된 데이터를 객체로 변환하는 기술 자바의 표준 라이브러리, 서드파티 라이브러리, 애플리케이션 자신의 클래스들 모두 공격범위에 포함된다. 가젯 보안 전문가들이 찾은 자바 라이브러리와 서드파티 라이브러리에서 직렬화 가능 타입들을 연구하여 역직렬화 과정에서 호출되어 잠재적으로 위험한 동작을 수행하는 메서드들 여러 가젯을 사용하여 네이티브 코드를 마음대로 실행하는 공격을 하기도 함 → 아주 ..
스레드 스케줄러 여러 스레드가 실행중이면 운영체제의 스레드 스케줄러가 어떤 스레드를 얼마나 오래 실행할지 정한다. 운영체제는 모두 공정하게 수행하지만 구체적인 운영정책은 운영체제마다 다를 수 있다. 이 정책에 좌지우지 되지 않아야 좋은 프로그램이다. 정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램은 다른 플랫폼에 이식하기 어렵다. 실행 가능한 스레드 수를 적게 유지하는 방법 실행 가능한 스레드의 평균적인 수를 프로세서 수보다 지나치게 많아지지 않도록 해야한다. 1) 스레드는 당장 처리해야할 작업이 없다면 실행돼서는 안된다. 스레드 풀 크기를 적절히 설정하고 작업은 짧게 유지해야하나, 너무 짧으면 오히려 분배 부담이 늘어나 성능이 떨어진다. 바쁜 대기(busy waiting) 상태가 되면 안된다..