java
Java CharAt CharArray
Java CharAt CharArray 실험 내용 자바에서 String의 각 원소를 순회하는 방법은 여러 가지가 존재 index와 charAt 메소드를 이용해 for 문으로 이용해 순회 toCharArray 메소드를 이용해 char 배열로 만든 후 개선된 for 문으로 각 원소를 순회 chars 메소드를 통해 정수 stream으로 바꾼 후 forEach로 순회 이 방법들의 시간 소모 비교 Java11, wsl2에서 실험 실험 코드 메인 함수 Test2In.txt 파일에 기록된 1000만 자리의 String을 읽어 옴 option 변수에 따라 각 함수를 실행해서 파일에 기록 각 함수는 위에서 설명한 1 ~ 3번 방법을 수행하고 출력에 걸린 총 시간을 반환 public static void main(String[] args) throws IOException { File readFile = new File(".
read morejava
Java String Compare
Java String Compare Java String 저장 위치 Java에서 String은 다음과 같은 두 가지 방법으로 생성되고, 이 방법에 따라 저장 위치가 다름
"ABC"와 같은 리터럴을 이용 Heap의 Constant String pool에 저장됨 이 방식으로 똑같은 문자열을 가진 두 개의 변수를 생성하면 두 변수의 주소값이 같음 new String("ABC")와 같은 new 생성자를 사용 Heap에 생성됨 (Constant String pool 외부) 매 번 문자열이 생성될 때 마다 새로운 객체가 생성됨 문자열의 내용과는 달리 모든 변수들의 주소값이 다름 Java String Compare Java에서 두 String 변수 s1, s2를 비교하는 방법은 다음과 같이 두 가지가 있음
read morejava
MyBatis
MyBatis MyBatis 자바 퍼시스턴스 프레임워크 중 하나 SQL을 annotation 혹은 XML등으로 코드로부터 분리해주고, 자바 객체와 연결시켜줌 Apache License 2.0으로 배포되는 free 소프트웨어 장점 SQL과 프로그래밍 언어간의 분리를 제공 모든 DB 기능을 사용 가능하며, JDBC보다 사용이 쉬움 JDBC 혹은 JPA와 비교해서 배우기 쉽고, 코드가 간결함 새로운 DB 관련 프로그래밍 기술을 익힐 필요 없이 SQL만으로 코딩할 수 있게 해 줌 단점 DB에 종속적이므로 DB 자체를 변경할 경우 수정해야 할 부분이 많음 스키마를 변경했을 때 관련 SQL을 모두 수정해야 함 DB에 종속적이라는 점 때문에 유지보수 및 테스트가 힘듦 References https://en.
read morejava
Why AOP
Why AOP AOP AOP란 Aspect oriented programming의 약자 프로그래밍 패러다임의 일종으로, 각 기능에서 공통 관심사(기능)를 분리시키는 개념 공통 기능 예시: 로그, 인증, 보안, 예외 처리, 시간 측정 등 OOP와 상충되는 개념이 아닌 OOP를 보완하고 확장시키는 개념 예시 함수의 호출 시간을 측정하는 기능이 필요한 경우, 모든 함수에 시간을 측정하는 코드를 넣는 것은 비효율적 그렇다고 시간을 측정하는 클래스를 상속받기도 힘듦 이 때 시간을 측정하는 기능은 여러 함수에서 필요한 공통 관심사(기능)이기 때문에 별도로 분리해서 작성해야 함 각 함수(모듈)는 핵심 기능(비즈니스 로직)만 작성하고, 공통 기능은 코드 밖에서 필요한 시점에 실행됨 Spring에서 AOP가 필요한 이유 Java는 다중 상속이 불가능하기 때문에, 공통 기능을 상속으로 해결하기에는 제약이 존재 공통 기능을 핵심 기능으로부터 분리하기 때문에 코드가 깔끔하고 명확해짐 코드의 모듈화가 수행되기 때문에 생산성 및 유지보수성 증가, 중복 감소 References https://mangkyu.
read morejava
Java 정수 + newLine 비교
Java 정수 + newLine 비교 실험 내용 자바에서 여러 정수값들을 각 줄에 출력하는 방법은 다음과 같이 여러 가지 방법 존재 정수를 i라는 변수에 넣었다고 가정할 때, 각 i마다 i + "\n" 을 출력 각 i마다 i를 string으로 바꿔서 출력하고 BufferedWriter의 newLine 함수 이용 각 i마다 StringBuilder로 i와 "\n"을 합친 문자열을 출력 StringBuilder 하나를 만들어 모든 i에 대해 i와 \n을 합쳐 한 문자열로 출력 System.out.println(i)를 이용 이 방법들의 시간 소모 비교 Java11, wsl2에서 실험 실험 코드 메인 함수 option 변수에 따라 각 함수를 실행해서 파일에 기록 각 함수는 위에서 설명한 1 ~ 5번 연산을 수행하고 출력에 걸린 총 시간을 반환 public static void main(String[] args) throws IOException { File file = new File(".
read morejava
Lombok Careful Annotation
Lombok Careful Annotation Lombok Careful Annotation Lombok의 annotation은 자바 코딩을 쉽게 도와주지만, 특정 annotation은 부작용이 있어서 사용이 지양됨 @AllArgsConstructor
모든 필드를 사용하는 생성자를 만들어줌 이 과정에서 동일한 타입의 필드의 순서를 바꾸면 lombok은 생성자의 파라미터 순서를 바꿈 IDE가 리팩터링을 진행해주지 않으므로, 이 과정에서 값이 잘못된 필드에 들어갈 확률이 높음 그러나 같은 타입이기 때문에 오류가 발생하지 않아 알기 어려움 @RequiredArgsConstructor도 동일한 문제 @NoArgsConstructor
아무 필드도 사용하지 않는 생성자를 만들어줌 final 필드가 있는 경우 생성자를 만들 수 없고 오류가 발생 @EqualsAndHashCode
read morejava
Abstract Class vs Interface
Abstract Class vs Interface Abstract Class vs Interface 추상 클래스와 인터페이스는 상속받는 / 구현하는 클래스가 추상 메소드를 구현하도록 강제하는 서로 비슷한 부분이 존재 그러나 분명한 차이가 있음 구분 추상 클래스 인터페이스 정의 클래스 내 추상 메소드가 하나 이상 모든 메소드가 추상 메소드 목적 상위 클래스를 상속받아서 “확장” 함수 틀만 있는 것을 “구현” 다중 상속 클래스이므로 불가능 인터페이스는 가능 상속 대상 상속받은 클래스들이 동일한 동작 보장 X 구현한 객체들은 동일하게 동작 기능 재사용 상위 클래스의 기능을 가져와 사용 가능 모두 직접 오버라이딩 해야 함 가질 수 있는 것 변수 / 상수, 생성자, 일반/추상 메소드 상수, 추상 메소드 상속 키워드 extends implements References https://brunch.
read morejava
OCP
OCP OCP Open Closed Principle의 약자로 기존의 코드를 변경하지 않으면서 기능을 추가 / 확장 할 수 있게 설계하도록 하는 디자인 패턴 OCP를 따르면 변경을 최소화하며 확장을 쉽게 할 수 있음 예시 User 클래스가 A 클래스를 참고해 의존적으로 구현되었다고 가정 만약 새로운 기능을 추가한 클래스인 B 클래스가 추가된다면 User 클래스의 코드를 전체적으로 수정해야함 (OCP 위배) 인터페이스를 만들고, A, B 클래스 및 추후에 추가될 클래스도 해당 인터페이스를 상속받도록 수정 User 클래스가 해당 인터페이스를 사용하도록 하면, 이후 또다른 C 클래스로 변경할 일이 생겨도 쉽게 변경 가능 References https://nesoy.
read morejava
StringBuilder
StringBuilder StringBuilder Java에서 string은 immutable 하기 때문에, string의 + 연산은 새로운 string을 만듦 이 과정에서 시간, 공간 및 garbage collection 등 많은 오버헤드가 발생 따라서 문자열을 합치는 연산을 많이 수행한다면 +연산은 지양되고, StringBuilder클래스 를 이용할 것을 권장 StringBuilder는 변경 가능한 문자열을 만들어 주는 클래스 사용법 // 1. StringBuilder 생성 StringBuilder sb = new StringBuilder(); // 2. append 함수를 통해 문자열 추가 sb.append("aaa"); sb.append("bbbb"); sb.append("cc"); // 3. 출력; 다음 두 코드는 결과가 같음 System.
read morejava
Stream vs For loop
Stream vs For loop Stream vs For loop Java에서 반복문을 수행하기 위해 stream을 이용하거나 for loop를 사용 가능. 두 방법에는 각각 장단 존재
Stream은 lazy하게 연산의 파이프라인을 반환하고, 마지막에 한꺼번에 연산함 For loop는 단순히 인덱스 기반으로 계산하지만, stream은 JVM에서 추가로 수행하는 연산들이 존재하기 때문에 오버헤드 존재 JIT 컴파일러가 40년 이상 for loop를 다뤄왔기 때문에 최적화가 잘 되었으나, stream은 아직 최적화가 부족 For loop와 Stream을 primitive type의 데이터를 순회하는 시간을 비교하면 for loop가 압도적으로 빠름 Primitive type의 데이터는 stack 영역에 저장되기 때문에 값을 빠르게 불러 올 수 있음 Primitive type의 데이터가 아닌 경우 for loop는 그만큼의 성능을 내지 못함 heap 영역에 저장되는 데이터를 참조하기 위해서는 메모리의 주소를 이용해 참조 이 과정에서 JIT 컴파일러의 최적화 이점이 사라짐 순회 자체는 for loop가 빠르다고 해도, 각 원소에 대한 계산 비용이 비싸지면 얘기가 달라짐 계산하는데 극단적으로 오래 걸리는 함수라면, for loop가 빠르다고 보장할 수 없음 Stream의 forEach 함수는 함수 중 가장 기능이 적고, 비효율적 마지막에 결과를 출력할 때 사용하는 정도가 적당 Stream에서 forEach만 사용하는 것은 for loop보다 성능이 떨어짐 map, filter, reduce와 같은 함수를 사용하면 stream을 통해 가독성 향상 가능 Stream은 복잡한 호출 구조 때문에 오류 메시지를 분석하기 어려울 수 있음 References https://sigridjin.
read more