본문 바로가기

전체 글36

Week 회고 회고재미로 만든 추억 사이트지난주는 html + css + js + pyhton을 이용해 미니 프로젝트를 만들었다.pythonanywhere를 이용해 배포를 했다. 나름 재미있어서 친구들과의 사진을 저장하는 페이지를 만들어 목록마다 특정 친구들 사진을 불러오게 하는 작업도 했다.  약 2일간 미니 팀 프로젝트 DevMinds3명이서 간단한 프로젝트를 만들었다. 주제는 블로그로 velog를 모티브로 삼았다. https://github.com/DevMinds-inno/DevMinds GitHub - DevMinds-inno/DevMindsContribute to DevMinds-inno/DevMinds development by creating an account on GitHub.github.com내가 맡.. 2024. 6. 17.
[Effective java] 상속보다는 컴포지션을 사용하라 목적 확장할 목적으로 설계되었고 문서화도 잘 된 클래스라면 상속도 안전합니다. 하지만 일반적인 다른 패키지의 구체 클래스를 상속하는 일은 위험할 수 있다고 합니다. 오늘은 상속을 쓰기 좋은 상황과 상속의 위험성과 상속대신 컴포지션을 사용하는 방법을 알아보려고 합니다. 상속의 위험성 상위 클래스는 릴리스마다 내부 구현이 달라질 수 있습니다. 해당 여파로 하위 클래스가 오동작할 수 있습니다. 하위클래스가 상위클래스로 인해 깨지기 쉬운 예시 1. HashSet - 문서화가 잘 안되어 있을 경우 HashSet으로 생성된 이후 원소가 몇 번 더해졌는지 알 수 있어야한다라고 했을 때 다음과 같이 상속으로 구현할 수 있을 것입니다. import java.util.Collection; import java.util.H.. 2023. 9. 9.
[Effective java] Comparable 구현 고려하기 목적 Comparable 인터페이스에는 compareTo 메서드가 있습니다. compareTo는 단순 동치성 비교뿐 만이 아닌 순서를 비교할 수 있고, 추가로 제네릭한 특징을 가지고 있습니다. Comparable을 구현했다는 것은 자연적인 순서가 있음을 뜻하게 되어 Arrays.sort()와 같은 메서드, 자동 정렬되는 컬렉션(ex. TreeSet) 등과 함께 사용하면 관리가 쉬워집니다. 단순히 Comparable을 구현해서 정렬만 쉽게 하면된다고 생각했는데, 몇 규약을 지키지 않을 경우 문제가 발생할 수 있다고 합니다. 그래서 오늘은 Comparable 인터페이스를 구현할 때 지켜야하는 규약과 규약을 지키지 않았을 때 문제점, 작성 요령에 대해 알아보고자 합니다. Comparable 인터페이스를 구현할.. 2023. 9. 2.
[백준][JAVA] 11725: 트리의 부모 찾기 https://www.acmicpc.net/problem/11725 11725번: 트리의 부모 찾기 루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오. www.acmicpc.net 처음에 문제 이해를 잘 못했었다. 정확히 무엇을 출력해야하는 것인지를 이해하지 못했었는데 알고보니 노드 2번부터 N번까지 차례대로 부모노드가 몇번인지를 알려달라는 것 이었다. dfs를 적용하면 간단하게 해결할 수 있던 문제였다. 트리의 루트가 1번이기 때문에 dfs로 1번부터 순차적으로 방문을 체크하면서 확인해주면 된다. import java.util.*; import java.io.*; class Main{ static boolean[] visited; st.. 2023. 8. 26.
[Effective java] 불필요한 객체 생성 피하기 목표 똑같은 기능의 객체를 여러번 생성하는 것 보단 객체 하나를 재사용하는 것이 나을 때가 많습니다. 이 점을 고려할 때. 피해야하는 방법과 권장되는 방법 등을 알아봅시다. 1. 문자열 생성에서의 불필요한 객체 생성 피하기 문자열을 선언하는 방법에는 String 리터럴과 new String() 두 가지가 있습니다. "abc" 리터럴 값을 사용하여 새로운 인스턴스를 만드는 대신 하나의 String인스턴스를 사용할 수 있습니다. 반면, new String("abc")는 새로운 인스턴스를 만들기 때문에 이를 반복문이나 빈번하게 호출되는 메서드 안에서 호출하게 된다면 불필요하게 매모리를 낭비하게 될 수 있습니다. 참고: "abc" vs new String("abc") 더 알아보기 https://je-pa.tis.. 2023. 8. 22.
[JAVA] Supplier<T> 인터페이스 Supplier 인터페이스는 Java 8부터 추가된 함수형 인터페이스(Functional Interface) 중 하나로서, 데이터 공급자 역할을 수행하는 함수를 나타냅니다. Supplier 인터페이스의 메소드인 get()은 매개변수를 받지 않고, 데이터 값을 반환합니다. 즉, 파라미터를 받지 않고 값을 리턴하는 메서드를 나타내기 위해 사용됩니다. Supplier는 다양한 기능과 유연성을 제공하며, 람다 표현식 및 스트림 API와 함께 사용하여 코드를 간결하고 가독성 좋게 작성할 수 있습니다. package java.util.function; @FunctionalInterface public interface Supplier { /** * Gets a result. * * @return a result *.. 2023. 8. 22.
[JAVA] 리터럴 String vs String 객체 목표 문자열을 선언하는 방법에는 String 리터럴과 new String() 두 가지가 있다. 둘의 차이를 알아보자. String 리터럴 값 Java의 문자열 리터럴은 상수로 취급되며, 이러한 문자열들은 JVM 내부의 특정 영역인 상수 풀(String pool)이라고 하는 공유된 메모리 영역에 해당 문자열이 저장됩니다. 따라서 동일한 값을 가진 다른 변수가 같은 메모리 위치를 참조하게 되어 메모리를 절약할 수 있습니다. 참고: JAVA7부터 문자열 상수풀 위치가 Perm영역에서 Heap영역으로 옮겨졌다고 한다. String 객체 새로운 String 객체를 생성합니다. 이렇게 하면 항상 새로운 객체가 만들어지기 때문에, 같은 값의 문자열도 매번 새로운 메모리 공간에 할당됩니다. 즉, 가상 머신 안에서 이와.. 2023. 8. 22.
[Effective java] 필요한 자원, 의존 객체 주입 사용하기 목표 A를 사용하기 위해서는 B가 필요할 때, A는 자원 B를 의존한다고 볼 수 있습니다. 이렇게 많은 클래스는 하나 이상의 자원에 의존합니다. 의존 자원을 어떻게 사용하는 것이 좋을지 알아봅시다. 책을 읽고 정리하자! 의존 객체 주입법에 대해 알아보자. 의존하는 자원을 직접 명시한다면? 맞춤법 검사기(spellChecker)는 맞춤법을 검사하기 위해 사전(dictionary)이 필요할 겁니다. 먼저 검사기에서 직접 자원을 명시하여 사용하는 법을 살펴봅시다! 1. 정적 유틸리티 클래스로 구현했을 때 // 객체 생성을 방지한 정적메서드와 필드만을 담은 유틸리티 클래스(SpellChecker)로 구현한 예 public class SpellChecker{ private static final Lexicon d.. 2023. 8. 21.
LIST