programming 103

[Effective Java] Chapter 5

Chapter 5 제네릭 제네릭을 지원하기 전에는 컬렉션에서 객체를 꺼낼 때마다 형변환을 했다. 그래서 누군가 실수로 엉뚠한 타입의 객체를 넣어두면 런타임에 형변환 오류가 나곤 했다. 반면, 제네릭을 사용하면 컬렉션이 담을 수 있는 타입을 컴파일러에게 알려주게 된다. 그래서 컴파일러는 알아서 형변환 코드를 추가할 수 있게 되고, 엉뚱한 타입의 객체를 넣으려는 시도를 컴파일 과정에서 차단햐여 더 안전하고 명확한 프로그램을 만들어 준다.Item 26 로 타입은 사용하지 말라제네릭 클래스, 제네릭 인터페이스: 클래스와 인터페이스 선언에 쓰이는 타입 매개변수제네릭 타입: 제네릭 클래스와 제네릭 인터페이스를 통틀어 칭한다 각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 먼저 클래스 이름이 나오고, 이어서..

[Effective Java] Chapter 4

Chapter 4 클래스와 인터페이스 클래스와 인터페이스는 자바 언어의 심장과도 같다. 그러니까 열심히 하자.item15 클래스와 멤버의 접근 권한을 최소화하라 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트롤부터 얼마나 잘 숨겼느냐다. 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다.  정보 은닉의 장점은 다음과 같다.시스템의 개발 속도를 높인다.시스템 관리 비용을 낮춘다.정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움을 준다.완성된 시스템을 프로파일링해 최적화할 컴포넌트를 정한 다음 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화할 수 있기 때문이다.소프트웨어의 재사용..

[Effective Java] Chapter 3

Chapter 3 모든 객체의 공통 메서드 Object에서 final이 아닌 메서드는 모두 재정의를 염두에 두고 설계된 것이라 재정의 시 지켜야하는 일반 규약이 명확히 정의되어있다. 메서드를 잘못 구현하면 대상 클래스가 이 규약을 준수한다고 가정하는 클래스를 오동작하게 만들 수 있다.Item 10 equals는 일반 규약을 지켜 재정의하라 아래의 상황에서는 재정의를 최대한 피하도록하자!각 인스턴스가 본질적으로 고유하다.값을 표현하는 게 아니라 동적하는 개체를 표현하는 클래스가 여기 해당한다.인스턴스의 '논리적 동치성(logical equality)'을 검사할 일이 없다.논리적 동치성을 원하지 않다면 재정의하지 않아도 된다.상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다.대부분의 Se..

[Effective Java] Chapter 2

Chapter 2Item 1 생성자 대신 정적 팩터리 메서드를 고려하라정적 팩터리 메서드가 생성자 보다 좋은 장점 다섯가지.- 이름을 가질 수 있다.  정적 팩터리는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. // 생성자BigInteger(int, int, Random)//정적 팩터리 메서드BigInteger.probablePrime  - 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다. 이는 인스터스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 재활용하는 식으로 불피요한 객체 생성을 피할 수 있다. 대표적인 예인 Boolean.valueOf(boolean) 메서드는 객체를 아예 생성하지 않는다. (?)  반복되는 요청에 같은 객체를 반환하는 식으로 정적 팩터리 방식의 ..

[Javascript] TDZ와 Hosting에 대해서 알아보자

1. 개요 회사에서 개발 중 이해하지 못하는 버그가 발생되었다. C++과 Java만 쓰던 나에게는 아직 JS의 문법이 어려운 것 같다. 오늘은 내가 마주친 버그와 이 버그를 이해(?)하기 위해 공부한 내용을 적어보고자한다.2. 본론2.1 C++에 익숙한 내가 마주친 버그 아래의 C++ 코드를 보자. #include using namespace std;int main() { int tmp = 0; cout   tmp라는 변수가 if문의 블럭 밖에서 선언되고 또 그 안에서 한번 더 선언됐다. C++은 이런경우 더 가까운 변수를 참조하는 것으로 되어있다. 따라서 if문 안에 있는 if문은 if문 밖에서 정의된 tmp변수를 참조한다.  그럼 이것과 비슷하게 작성된 JS 코드를 보자. let tmp =..

[백준 알고리즘] 2933번 - 미네랄 (구현, BFS)

1. 개요2시간 녹인 문제... 늘 내 블로그에 적는 말이지만 구현은 초반 설계가 잘못된다면 정말 힘든 문제인 것 같다. 여러 예외도 생각해야하고... 이래서 난이도 높은 문제들은 구현인가...? 싶기도 하다. 문제를 나누고 나올 수 있는 예외를 전부 처리해야 성공하는 문제이기에 시간도 많이 들고 힘도 많이 들었다... 출처: https://www.acmicpc.net/problem/2933 2. 본문내가 생각한 구현 문제의핵심은 다음과 같다. 물론 말 그대로 타고난 능력이 좋은 사람들은 저런 방법이 필요 없겠지만 말이다.. ㅋㅋㅋ1. 문제를 단계별로 나눈다.2. 예외사항을 처리한다.3. 구현- 문제 나누기 문제를 나누면 다음과 같다.1. 방향에 맞는 미네랄 제거.2. 떨어지는 미네랄 조사.3. 떨어질 ..

[programmers] 340211번 - 충돌위험 찾기 (구현, [PCCP 기출문제] 3번)

1. 문제 및 예제 문제를 제대로 읽지 않아 두바퀴 정도 뺑뺑 돌다가 해결한 문제다. 아까운 내 한 시간이 날아갔다. 이렇게 장문의 문제를 푸는 요령이라도 터득해야할 것 같다. 집중력 문제인 것 같기도해서 최근에는 시간을 정해두고 문제를 풀고있다. 이런 구현 문제는 지금 회사에서도 비슷한 일을 하는데 이렇게 시간이 오래 걸리다니... 충격적이긴 하다 ㅋㅋhttps://school.programmers.co.kr/learn/courses/30/lessons/340211 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr2. 본론 이런 복잡한 문제들은 문제를 나누고 ..

[programmers] 258712번 - 가장 많이 받은 선물(DP, 2024 KAKAO WINTER INTERNSHIP)

1. 문제 및 예제 DP 열심히 풀던 와중에 이런 문제가 나오다니.. 행복했다. 회사에서는 JS를 쓰기 때문에 다시 C++을 사용해보니 메소드도 기억 안나서 그냥 내가 몇개 만들었다. 그래도 첫 제출에 맞춰서 나름 뿌듯했다. 1분 뒤에 레벨1 원트에 맞았다고 뿌듯해하는 내 자신을 보면서 자괴감도 조금 들었다...https://school.programmers.co.kr/learn/courses/30/lessons/258712 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr2. 본론 선물을 주고받은 기록을 따로 배열에 저장하면 해결되는 간단한 DP문제이다. 선물..

[Javascript] 객체에 정의되지 않은 요소의 참조를 예방하는 방법

1. 서론 회사에 큰 손해를 끼치며 배운 JS문법을 정리하고 같은 실수를 반복하지 않기 위해 과정을 정리하고자 한다. 사견이지만 JS는 자유도가 너무 높은 객체인 것 같다. 코테는 C++, 서버는 JAVA로 개발하고 지금 사이드 프로젝트에서는 Python을 사용하고 있기에 JS는 이번에 입사한 회사에서 처음 사용해본다. 처음 접한건 학교 웹 개발 수업에서 들은 정도...  자랑은 아닌데 따로 JS를 공부하지는 않았다. "여기저기 경험하고 다치면서 성장하는거지 뭐!" 라고 생각했는데 8톤 트럭에 치이고 콤마 상태 한 번 갔다 와보니 심각성을 느꼈다. 어떤 실수였는지에 대한 자세한 내용은 아래의 포스팅에 정리하였다.https://apape1225.tistory.com/169 [산업기능요원] 크나큰 실수 기념..

[백준 알고리즘] 2579번 - 계단오르기 (Dynamic programming)

1. 문제 및 예시 실행 결과  중구난방으로 알고리즘 문제를 풀다 이러면 아무것도 안 될 것 같아서 내가 약한 유형의 문제를 우선적으로 공부해야겠다는 생각해 DP문제를 쭉 풀어보았다. 바킹독님의 블로그에서 공부하고 있는데 풀이가 달라 한 번 정리해보았다. 출처: https://www.acmicpc.net/problem/25792. 본문  DP는 데이터 구조를 먼저 생각해보고 점화식을 세우는 두가지의 단계로 나뉜다고 생각한다. 물론 점화식을 세운다는 것 자체가 안 되는 문제이기에 구현 다음으로 손에 익어야하는 문제가 아닌가 싶다. 어쨎든 해당 문제의 데이터 구조와 점화식은 다음과 같이 정했다.데이터 구조: cache[i] = i번째 계단으로 얻을 수 있는 점수 중 최대값. 이제 데이터 구조를 구하는 점화식..