전체 글 (276) 썸네일형 리스트형 이코테 - 최종 순위 with JAVA 문제 작년 순위가 주어지고 높고 낮음이 뒤바뀐 사람들이 주어진다. 이때, 순위를 정확히 알 수 없다면, ?, 데이터에 문제가 있다면 Impossible, 그렇지 않다면 순위를 출력하라 로직 순위를 정확히 알 수 있는가에 대한 질문으로 위상정렬이 기본적으로 떠오른다. Base가 되는 구성으로 순위가 낮을 수록 진입 차수가 높아지며 사람들 간 관계를 표현하는 방법으로 graph를 통해 graph[a][b]가 true 이면 a가 b보다 순위가 높음을 표현할 수 있다. 위의 방법으로 위상정렬을 구현하면 진입차수가 0인 사람을 꺼내면 그 사람이 우선적으로 1등이 되고 그 사람과 연결된 사람들 즉, 그 사람보다 순위가 뒤에 있던 사람들의 진입차수를 1씩 뺐을 때, 0이 되면 더이상 그 사람 위에는 사람이 없음 즉,.. Effective JAVA - Item19 : 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라. 결론 상속을 해서 확장을 했을 때 많은 문제를 일으킨다. 해결 방법은 클래스 상속시 상속을 위해 설계하고 설명해주는 문서를 만드는 것이다. 그렇게 만든 클래스가 아니라면 해당 클래스의 상속을 금지시켜라 상속이 위험한 이유 내가 어떤 클래스를 상속해서 클래스를 만든다고 가정하자. 하지만, 그 상위 클래스는 내가 수정할 수 있는 나의 코드가 아닌 다른 패키지의 클래스를 사용한다면 내가 통제를 할 수가 없다. 따라서, 다음 릴리즈 등에서 변경시 내가 할 수 있는 것이 없다. 따라서 코드 수정, 안정성 면에서 다소 위험하다. 상속을 할 수 있게 하는 방법 : 상속을 위한 설계와 API 문서 작성 1. 메서드를 재정의하면 메서드 내부가 어떻게 동작하는지 상세히 정리하여 문서로 남겨야 한다. -> 어떤 순서로 호출.. Effective JAVA - Item18 : 상속보다는 컴포지션을 사용하라. 주제 "다른 패키지의 구체 클래스를 상속하는 것은 위험 하다." 문제점 // 문제점 : 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. // = 상위 클래스가 어떻게 구현되는냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다. // = 상위 클래스는 릴리스마다 내부 구현이 변경될 수 있고 이에 따라 하위 클래스가 동작하지 않을 수 있다. // 상위 클래스의 메서드를 재정의하는 것은 내부 모든 동작을 파악하기도 어렵고 문서에 적혀있지 않은 경우도 존재한다 // 또한, 새로운 릴리스에서 내부 변경시 이에 맞추어 모두 수정해야 하기에 유연하지 못한다. 해결 // 해결책 : 컴포지션 // 방법 // 1. 기존의 클래스를 확장하는 대신, 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조하.. JWT - 공격자 방어 with Access Token, Refresh Token 백엔드를 개발하다 보면 사용자 인증/인가로 JWT를 많이 사용할 것이다. JWT를 사용하면 기본적으로 서버가 클라이언트의 상태를 보존하지 않는다 (stateless 하다). 즉, 매번 서버의 리소스를 접근하기 위해 access를 던질 때마다 해당 유저가 유저 본인인지 공격자인지 구별하지 못한다. 따라서, 이런 문제를 해결하는 방안으로 리플래시 토큰을 추가적으로 사용한다. 이 토큰의 용도는 사용자 인증이 아닌 새로운 엑세스 토큰을 추가적으로 생성하는 용도로만 사용된다. 엑세스 토큰 : 서버의 자원에 접근하기 위한 토큰 리플래시 토큰 : 엑세스 토큰을 발급하기 위한 토큰 엑세스 토큰 탈취, 리플래시 토큰 없음 이를 활용해, 아래와 같은 원리로 공격자 방어를 수행한다. 1. 엑세스 토큰의 유효기간은 가능한 짧.. 이코테 - 행성 터널 with JAVA 문제 최대 100000개의 행성이 있고 각 행성의 3차원 좌표가 주어진다. 이때, 행성 간 연결 비용은 행성 간 x값의 차이에 대한절대값, y값의 차이에 대한절대값, z값의 차이에 대한절대값 중 가장 작은값으로 측정된다. 최소한의 연결 비용을 통해 모든 행성을 연결하라. 로직 기본적으로는 크루스칼 알고리즘을 사용해야함이 읽힌다. '최소한의 비용을 통해 모든 노드를 연결하는 문제' 이기 때문이다. 하지만, 문제는 행성간 도로 설치 비용을 구하는 것이다. 만약 100000개의 행성들간 설치 비용을 모두 구한다면 문제가 발생한다. (n)(n-1)/2를 해보면 수가 너무 커짐을 알 수 있다. 따라서 행성간 도로 설치 비용을 구하는 방식을 설정해야 한다. 문제에서 나온 도로 설치 비용을 자세히 보면 간단한 방법을.. Effective JAVA - Item17 : 변경 가능성을 최소화하라. 1. 불변 클래스 // - 정의 : 그 인스턴스의 내부 값을 수정할 수 없는 클래스 // - 객체가 파괴되는 순간까지 내부 정보는 절대 변경되지 않는다. // - 예시 : String, 기본 타입의 박싱된 클래스들, BigInteger, BigDecimal // - 불변클래스로 만드는 이유 : 설계, 구현, 사용이 쉬우며 오류가 생길 여지도 적고 안전하다. 2. 불변 클래스를 만드는 5가지 규칙 // - 1. 객체의 상태를 변경하는 메서드(변경자, setter)를 제공하지 않는다. // - 2. 클래스를 확장할 수 없도록 한다. // -> 하위클래스에서 악의적으로 변경을 막고 상속을 막는 방법은 final로 선언하는 방법이 있다. // - 3. 모든 필드를 final로 설정한다. // - 4. 모든 필드.. Effective JAVA - Item16 : public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라. // 1. public 클래스라면 private 멤버와 각 멤버의 접근자(getter/setter)를 제공하는 것이 맞음 // 2. package-private 클래스나 private 중첩클래스(클래스 내부 클래스)는 데이터 필드 public 가능 // - 다만, 그 클래스가 표현하려고 하는 추상 개념은 올바르게 표현해야 함. // - 클래스 선언, 클라이언트 코드 등 훨씬 깔끔하다. // - "package 내부에서만 사용하는 클래스라면 웬만하면 package-private로 사용하자" // 3. 클래스의 public 필드가 불변이라도 public 선언은 좋은 방법은 아니다. // 결론 : public 클래스는 절대 가변 필드 노출 x, 불변 필드라면 노출을 생각해볼 수 있지만 안전하진 않다. // p.. Effective JAVA - Item15 : 클래스와 멤버의 접근 권한을 최소화하라. 1. 잘 설계된 컴포넌트 // - 컴포넌트 : 클래스와 객체 // - 클래스의 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 잘 숨긴 구조 // - 오직 API를 통해서만 다른 컴포넌트와 교류하는 구조 // - 정보 은닉(캡슐화)의 근간 2. 정보 은닉의 장점 // 공통 : 시스템을 구성하는 컴포넌트들을 독립시켜 개발, 테스트, 최적화, 적용, 분석, 수정 등을 개별적으로 가능하게 만든다. // 1. 시스템 개발 속도를 높인다. // 2. 시스템 관리 비용을 낮춘다. // 3. 성능 최적화에 도움을 준다. // 4. 소프트웨어 재사용성을 높인다. // 5. 큰 시스템을 제작하는 난이도를 낮춰준다. 3. 자바의 정보 은닉 // - 접근 제어 매커니즘 : 클래스, 인터페이스, 멤버의 접근성을 접근 제어.. 이전 1 2 3 4 5 6 7 ··· 35 다음