본문 바로가기
반응형

DEV/Java28

[객체지향설계] SOLID 원칙 SRP : 단일 책임 원칙(Single responsibility principle) 한 클래스는 하나의 책임만 가져야 한다. 하나의 책임이란 말은 모호하다. 판단의 기준은 변경이다. 즉, 변경이 있을 때 파급 효과가 적을수록 단일 책임 원칙을 잘 따른 것이다. 범위를 너무 작게하면 단위가 너무 쪼개져서 문제고, 너무 크게 하면 책임이 커져서 문제다. OCP : 개방-폐쇄 원칙(Open/closed principle) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 확장을 하려면 당연히 코드 변경이 필요한데, 이해하기 힘들수 있다. 자주 변하는 기능을 추상화함으로써 기존 코드를 수정하지 않고도 기능을 확장할 수 있어야 한다. public class MemberService { //pr.. 2023. 3. 3.
[자바] java.util.function 패키지 일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해 놓은게 java.util.function 패키지이다. 인터페이스에 정의된 메서드 이름도 통일되고, 재사용성이나 유지보수 측면에서 매번 새로운 함수형 인터페이스를 정의하지 말고, 가능하면 이 패키지의 인터페이스를 활용하는 것이 좋다. 기본 함수형 인터페이스 java.lang.Runnable void run() 매개변수도 없고, 반환값도 없음. Supplier T get() -> T 매개변수는 없고, 반환값만 있음. Spplier : 공급자 - 받는거 없이 주기만 한다. Consumer T -> void accept(T t) Supplier와 반대로 매개변수만 있고, 반환값이 없다. Consumer : 소비자 - 받기만 하고 주는게 없다.. 2023. 3. 3.
[자바] 제네릭 Parameter Type - Naming Conventions 자바 제네릭을 공부할 때 T, V, U, N, K, V, E 등의 알파벳을 볼 수 있는데 의미는 아래와 같다. 파라미터 네이밍 규칙은 아래와 같다. E Element K Key N Number T Type V Value S, U, V etc. 2nd, 3rd, 4th types 꼭 위 알파벳을 써야되는건 아니지만 이런건 이렇게 표현하겠다라는 약속과 같다고 보면 될 것 같다. 2023. 2. 24.
[자바] 메소드 참조 Function f = (String s) -> Integer.parseInt(s); 위 람다식을 표현하면 아래와 같다. Integer wrapper(String s) {//메서드 이름은 의미없음. return Integer.parseInt(s); } 이 때 wrapper 메서드는 그저 값을 받아와서 Integer.parseInt()에게 넘겨주는 일만 한다. 이때 거추장스러운 메소드를 벗겨내고 Integer.parseInt()를 아래와 같이 직접 호출할 수 있다. Function f = Integer::parseInt; //메서드참조 컴파일러는 생략된 부분을 우변의 parseInt메서드의 선언부로부터, 또는 좌변의 Function 인터페이스에 지정된 제네릭 타입으로부터 쉽게 알아낼 수 있다. 또 다른 예.. 2023. 2. 23.
[자바] 함수형 인터페이스(Functional Interface) 자바에서 모든 메서드는 클래스 내에 포함되어야 하는데, 람다식은 메서드가 하나의 독릭접인 기능을 하기 때문에 함수라는 용어를 사용한다고 했다. 사실 람다식은 익명 클래스의 객체와 동등하다. (int a, int b) -> a > b ? a : b new Object() { int max(int a, int b) { return a > b ? a : b; } } 위 코드에서 max는 임의로 이름을 붙인것일뿐 의미는 없다. 람다식으로 정의된 익명 객체의 메서드를 어떻게 호출할 수 있을까? 객체의 메서드를 호출하려면 참조변수가 있어야 한다. 타입 f = (int a, int b) -> a > b ? a : b; 이 경우 참조변수 f의 타입은 어떤 걸로 해야 될까? 참조형이므로 클래스 또는 인터페이스를 사용할 .. 2023. 2. 22.
[자바] 람다식(Lambda expression) JDK1.8 부터 추가된 람다식은 자바가 등장한 이후 가장 큰 변화였다. 람다식의 도입으로 인해, 자바는 객체지향언어인 동시에 함수형 언어가 되었다. 1. 람다식이란? 람다식(Lambda expression)은 간단히 말해서 메서드를 하나의 식(expression)으로 표현한 것이다. 람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로, 람다식을 '익명 함수(anonymous function)'이라고도 한다. int[] arr = new int[3]; Arrays.setAll(arr, (i) -> (int)(Math.random() * 5) + 1); 위의 식에서 '(i) -> (int)(Math.random() * 5) +.. 2023. 2. 22.
[자바] 제네릭 와일드 카드 제네릭 와일드 카드 제네릭은 아래와 같이 오버로딩하면 컴파일 에러가 발생한다. 제네릭 타입이 다른 것만으로는 오버로딩이 성립하지 않기 때문이다. static Juice makeJuice(FruitBox box) { ... } static Juice makeJuice(FruitBox box) { ... } 제네릭 타입은 컴파일러가 컴파일할 때만 사용하고 제거해버린다. 그래서 위 두 메서드는 오버로딩이 아니라 '메서드 중복 정의'이다. 이럴 때 사용하기 위해 고안된 것이 바로 '와일드 카드' 이다. 와일드 카드는 기호 '?'로 표현하는데, 와일드 카드는 어떠한 타입도 될 수 있다. '?' 만으로는 Object 타입과 다를게 없으므로, 다음과 같이 'extends' 와 'super' 로 상한(upper bou.. 2023. 2. 16.
[자바] Properties Properties Properties는 HashMap의 구버전인 Hashtable을 상속받아 구현한것으로 (String, String) 형태로 저장하는 단순화된 컬렉션클래스이다. 주로 애플리케이션의 환경설정과 관련된 속성(property)을 저장하는데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다. 그래서 간단한 입출력은 Properties를 활용하면 몇 줄의 코드로 쉽게 해결될 수 있다. 메서드 설명 Properties() Properties 객체를 생성 Properties(Properties defaults) 지정된 Properties에 저장된 목록을 가진 Properties 객체를 생성 String getProperty(String key) 지정된 키의 값을 반환 String ge.. 2023. 2. 16.
[자바] HashMap HashMap은 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로 저장한다는 특징을 갖는다. 그리고 해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다. public class HashMap extends AbstractMap implements Map, Cloeable, Serializable { transient Entry[] table; ... static class Entry implements Map.Entry { final Object key; Object value; ... } } HashMap은 Entry 라는 내부 클래스를 정의하고, 다시 Entry 타입의 배열을 선언하고 있다. 키와 값은 별개의 값이 아니라 서로 관련된 값.. 2023. 2. 15.
반응형