Language/Java 55

Java 8 - 함수형 인터페이스를 사용하는 방법!

함수형 인터페이스 함수형 인터페이스는 1개의 추상 메소드를 갖는 인터페이스를 말합니다. 함수형 인터페이스는 함수형 프로그래밍에 주로 사용하고, 꼭 함수형 프로그래밍이 아니더라도 적용할 수 있습니다. Q. 함수형 인터페이스를 왜 사용할까? A. 자료뿐만 아니라 행위(함수)도 하나의 값으로 취급하기 위함입니다. 함수를 하나의 값으로 취급해서, 함수들을 조립하고 배치하면서 개발하기 위해 함수형 인터페이스를 사용합니다. 구현 An informative annotation type used to indicate that an interface type declaration is intended to be a functional interface as defined by the Java Language Specif..

Language/Java 2022.03.05

Java - 참조(reference) 객체가 아닌 값(value) 객체 사용하는 방법

Reference Object vs Value Object 기본적으로 객체는 참조 객체(Reference Object)를 많이 사용합니다. 하지만 값 객체(Value Object)를 사용하면 해결할 수 있는 문제도 많고, 적합한 경우도 아주 많습니다. 그래서, 참조 객체와 값 객체를 사용하는 기준과 사용하는 방법에 대해 다루겠습니다. 선택 기준 가장 중요한 기준은 mutable(가변) vs immutable(불변) 입니다. 내부에 있는 값을 바꾸면서 사용해야 하고, 변경된 값을 여러 곳에서 사용해야 한다면 Reference Object를 사용하고 그렇지 않은 경우 Value Object입니다. 두 번째 기준은 객체의 고유성을 어떻게 판단할 지 입니다. 이해가 어려우실 것 같아 코드로 가져왔습니다. cla..

Language/Java 2022.03.05

Java14 - Record (Data class) 정리

Record 자바 14 버전부터 record 키워드를 지원합니다. record를 사용하면 Data class를 훨씬 간결하게 작성할 수 있습니다. 파이썬의 dictionary, C#의 Record, 코틀린의 Data class와 유사한 역할을 합니다. 기존 Data class 클래스를 만들 때 생성자를 정의합니다. 그리고, 필드를 캡슐화하고, getter를 정의한 클래스가 있다고 가정합니다. public class UserDto { private final int name; private final int address; public User(int name, int address) { this.name = name; this.address = address; } public String getName(..

Language/Java 2022.02.12

Java - Atomic Variable (+ 동시성 제어 비교 with volatile, synchronized)

동시성 제어 in 자바 자바에서 Multi Thread 환경의 동시성을 제어를 위한 방법은 대표적으로 3가지가 있습니다. volatile synchronized Atomic variable 3가지 방법은 모두 쓰임새가 다른 데 같이 살펴보겠습니다! volatile volatile을 키워드를 사용하면 멀티 쓰레드 환경에서 변수를 공유할 수 있습니다. public class SharedObject { public volatile int counter = 0; } 단, 여러 개의 스레드가 읽을 수 있지만, write할 수 있는 쓰레드는 하나만 존재해야 합니다. Volatile 키워드는 각 스레드가 가진 CPU cache가 아닌, 공유하는 Main memory에서 읽고 Write하는 방법입니다. 즉, A클래스에..

Language/Java 2022.02.12

Java 8 - 메소드 레퍼런스(Method Reference) : 람다식 간단하게 표현하기!

메소드 레퍼런스(Method Reference) comments라는 List타입의 리스트가 있다고 가정하겠습니다. 해당 배열에 대한 내용을 하나씩 출력할 때 코드는 어떻게 작성할까요..? 아마 리팩토링 경험이 많이 없으신 분들은 아래와 같이 작성하실 수 있습니다. for(int i = 0; i < comments.size(); i++) { System.out.println(comment.get(i)); } 또는 조금 간추려서, 아래처럼 작성할 수도 있습니다. for(String comment : comments) { System.out.println(comment); } 람다식 리팩토링 경험이 조금 있으신 분들은 람다식을 사용해서 코드를 단 한 줄로 표현할 수 있습니다. comments.forEach(c..

Language/Java 2022.02.11

Effective Java - Wrapper 클래스 사용 시 주의할 점 (오토 박싱, 오토 언박싱)

Wrapper 클래스 자바에는 기본 타입과 Wrapper 클래스가 존재합니다. 기본(primitive) 타입은 int, long, float, double, boolean 등을 말하고, Wrapper 클래스는 Integer, Long, Float, Double, Boolean 등을 말합니다. Wrapper 클래스는 기본 타입을 Object로 변환하기 위해 사용합니다. Object를 매개변수로 받는 함수에 기본 자료형을 담기 위해서 사용합니다. 대표적으로는 Collection(List, Set, Map)에 기본 타입을 담을 떄 많이 사용합니다. 객체의 재사용 객체는 일반적으로 무겁기 때문에, 가능하면 재사용하는 것이 좋다는 점은 알고 계실거라 생각합니다. 가독성을 해치지 않는 범위 내에서는 재사용해서 Pe..

Language/Java 2022.01.14

Effective Java - 생성자 대신 정적 팩토리 메서드를 사용하라!

정적 팩토리 메서드 저는 클래스를 작성할 때 객체를 인스턴스화 하는 코드를 작성할 때는 무조건 생성자를 사용했었어요! Effective 자바의 내용 중에 생성자 대신 정적 팩토리 메서드를 사용하는 것을 검토해봐야 한다는 논의가 있었는데 좋은 내용 같아서 가지고 왔어요! 팩토리 메서드란 객체를 생성하는 메서드를 말합니다! 정적 팩토리 메서드는 객체를 생성하지 않고, 정적 메서드를 활용해서 객체를 만드는 방법이겠네요 ! 정적 팩토리 메서드를 사용하는 이유 1. 이름을 가질 수 있다. 생성자는 클래스명을 이름으로 하고, 클래스 하나당 생성자 1개 밖에 둘 수 없기에 어떤 객체를 생성하는 지 직관적이지 않습니다. public class Car{ String brand; String color; public Ca..

Language/Java 2022.01.02

StringBuilder를 초기화 하는 방법 3가지 성능 비교

StringBuilder와 StringBuffer는 String의 불변성(Immutable) 때문에 연산이 많아질수록 속도, 메모리 효율 등 퍼포먼스가 크게 떨어지는 점을 극복하기 위해서 사용하는 대표적인 클래스입니다. 알고리즘 문제를 풀 때는 비동기적이지만 퍼포먼스가 뛰어난 StringBuilder를 주로 사용하죠. 보통 반복문에서 지역변수를 사용할 때는 어떻게 사용하시나요? 그럼 StringBuilder는? Q. 아래는 반복문에서 지역변수를 사용하는 예시 2가지입니다. 다음 코드 중 더 좋은 코드는 몇 번 일까요? 변수를 매번 새로 할당하는 방법 변수를 1번만 할당하고 초기화하는 방법 // 1번 int num = 0; for(int c : array) { num = c + 10; System.out...

Language/Java 2021.10.07

JAVA - 재귀함수 파라미터 vs 전역변수

요즘 구직을 위해 코딩테스트를 보고 있습니다. 프로그래머스 문제를 풀다가 재귀함수를 사용할 때 사용할 변수의 위치가 제각각이라는 것을 알게 되었습니다. 아래의 문제를 예시로 들겠습니다. https://programmers.co.kr/learn/courses/30/lessons/43165 코딩테스트 연습 - 타겟 넘버 n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+ programmers.co.kr 아래 함수는 숫자 배열(numbers)와 목표 숫자(target)을 인자로 받고, 주어진 숫자 배열을 가지고 적절히 연산해서..

Language/Java 2021.09.17

JAVA - 프로젝트 패키지이름 명명(Naming) 관례

패키지 이름은 다른 회사의 다른 애플리케이션과 달라야만 합니다. 예를 들어, 안드로이드 app의 경우 패키지명을 경로로해서 애플리케이션이 설치되는데, 다른 애플리케이션과 패키지명이 같다면 같은 애플리케이션이라고 인식하고 충돌할 것입니다. 아래는 패키지명을 지을 때 권고되는 관례입니다. # 규칙 소문자를 사용 dot(.)으로 그룹을 구분 도메인 주소를 주로 사용 (유일하기 때문) URL에서 순서는 역순 com / kr.co . 회사명 . [플랫폼] . 애플리케이션명 # 예시 com.nexon.maplestory com.nexon.android.maplestorym

Language/Java 2021.02.04