Java 20

[Java] Optional

들어가기 앞서 자바를 사용해 프로그래밍을 할 경우 종종 마주치는 예외는 NullPointerException일 것입니다. public class Person{ private Car car; public Car getCar(){ return car; } } public class Car { private Insurance insurance; public Insurance getInsurance{ return insurance; } } public class Insurance{ private String name; public String getName(){ return name; } } public String getCarInsuranceName(Person person){ return person.get..

Java 2024.01.26

[Java] Stream

Stream이란 무엇인가? Java 8에 새로 추가된 기능으로 스트림을 사용하면 선언형으로 Collection 데이터들을 처리 할 수 있다. 예를 들어 칼로리가 400 미만인 요리들을 정렬해 Collection에 저장한다고 가정을 했을 때 스트림을 사용하지 않으면 다음과 같이 구현할 수 있다. List lowCaloricDishes = new ArrayList(); for(Dish dish : menu) { if (dish.getCalories() < 400){ lowCaloricDishes.add(dish); } } Collections.sort(lowCaloricDishes, new Comparator(){ public int compare(Dish dish1, Dish dish2){ return I..

Java 2024.01.24

[Java] 인터페이스 default method, static method

들어가며 자바에서는 인터페이스를 사용해 인터페이스를 구현하는 클래스에서 추상 메서드를 구현해야 합니다. public interface A { void doSomething(); } A 인터페이스에는 doSomething 이라는 추상 메서드가 존재합니다. public class AImpl implements A{ @Override public void doSomething() { System.out.println("this is A"); } } A인터페이스를 구현한 AImpl의 경우 doSomething 메서드를 override 하여 재정의 해 주어야 합니다. 만약 인터페이스에 추상 메소드가 추가되는 경우에는 이를 구현하는 클래스에서 다시 재정의 해 주어야 합니다. public interface A { v..

Java 2024.01.18

[Java] 함수형 인터페이스, 람다, 메소드 레퍼런스에 대하여

함수형 인터페이스, 람다, 메소드 레퍼런스 모두 긴밀한 연관을 가지고 있는 개념입니다. 이번 글을 통해 해당 개념들을 살펴 보고자 합니다. 함수형 인터페이스 @FunctionalInterface public interface Foo { int add (int a, int b); default void printDate(){ System.out.println(LocalDate.now()); } } 함수형 인터페이스란 추상 메소드를 단 하나 가지고 있는 인터페이스를 의미합니다. default method, static method가 몇개 존재하던 추상 메소드를 단 하나만 가지고 있다면 함수형 인터페이스라고 합니다. Q) 추상 메소드란 ? A) 선언만 되어 있고, 구체적인 구현은 되어있지 않은 메소드입니다. ..

Java 2024.01.15

[Java] Enum 전용 Map, Set이 있다?

백기선님의 Effective Java 강의를 듣는 도중 다음과 같은 질문이 있었습니다. enum을 key로 사용하는 Map을 정의하세요. enum을 담고 있는 Set을 만들어 보세요. 이 질문에 자신 당당히 HashMap, HashSet을 생각했습니다. 그런데 난생 처음 듣는 EnumMap, EnumSet이 정답이었습니다. EnumMap과 EnumSet은 HashMap, HashSet과는 어떠한 점이 차이가 있을까요? EnumMap EnumMap의 구조 public EnumMap(Class keyType) { this.keyType = keyType; keyUniverse = getKeyUniverse(keyType); vals = new Object[keyUniverse.length]; } EnumMa..

Java 2023.06.20

[Java] final 키워드 그리고 effectively final

final이란? final은 클래스, 메서드, 변수에 사용될 수 있습니다. final 키워드가 붙으면 특정한 무엇인가를 제한한다는 의미를 공통적으로 가지는데, 이 부분에 대해서 알아보도록 하겠습니다. 변수 변수에 final이 붙는다면 이 변수는 수정할 수 없다 라는 의미를 갖습니다. primitive type의 경우 수정 자체가 불가능 하며, reference type 경우 가르키는 객체의 주소를 변경할 수 없습니다. (객체의 내부 값은 영향을 받지 않습니다.) public class Temporary { public static void main(String[] args) { final int int1 = 2; System.out.println("int1 = " + int1); // int1++; //..

Java 2023.06.13

[Java] Exception의 종류 및 처리 방법

들어가기에 앞서 개발을 하다 보면 다음과 같은 문구들을 자주 만나게 됩니다. 개발 공부를 처음 할 때에는 이런 문구들만 보면 갑자기 기분이 좋다가도 싫어지고, 뭔가 무섭고 그랬습니다. 하지만 예외라는 것은 개발자에게 무서운 것이 아닌 개발자에게 문제 상황을 알려주려고 하는 친근한 친구입니다. 이번 장에서는 Java에서 사용하는 예외에 대해서 알아보려고 합니다. Exception 종류 자바는 총 세 종류의 예외가 존재합니다. Error Runtime Exception (Unchecked Exception) Checked Exception [ Error ] Error란 자바 프로그램 밖에서 일어나는 예외를 말합니다. 서버의 디스크가 고장 났다던가, 메인보드가 제대로 동작을 하지 않는다던가와 같이 자바 내에서..

Java 2023.06.12

[Java] Object란 무엇인가요?

자바에서는 모든 클래스의 부모클래스가 있습니다. 보통 클래스를 상속받는 경우 implments를, 확장받는 경우는 extends를 사용합니다. 클래스에서 아무런 상속을 받지 않는다면 최상위 부모클래스인 Object를 확장합니다. Object 클래스를 상속받는 이유 Object 클래스에 있는 메서드를 통해 클래스의 기본적인 행동을 정의할 수 있습니다. Object가 제공하는 메소드는 크게 두가지로 나뉩니다. [객체를 처리하기 위한 메서드] clone : 객체의 복사본을 만들어 반환 equals : 현재 객체와 매개변수로 넘겨받은 객체가 같은 지 확인 finalize : 현재 객체가 더이상 쓸모 없어졌을 때 GC(가비지 컬렉터)에 의해 호출됨 getClass : 현재 객체의 클래스를 반환 hashCode :..

Java 2023.06.02

[모던 자바 인 액션] 동작 파라미터화

실생활에서는 소비자들의 요구는 시도때도 없이 바뀝니다. 사과를 분류하는 메서드가 있다고 가정하겠습니다. 소비자들의 요구사항은 시도 때도 없이 많을 것입니다. 녹색 사과만 보여줘! 녹색 사과인데 100g 이 넘는 사과만 보여줘! 빨간 사과를 보여줘! 빨간 사과인데 100g 안되는 사과만 보여줘 이 외에도 소비자들이 원하는 조건에 따라 계속 바뀔 것입니다. 이러한 조건을 효과적으로 대응할 수 있는 방법이 바로 동작 파라미터화입니다. 동작 파라미터화 해당 예제에서는 Predicate를 사용했는데, Predicate는 참 혹은 거짓을 반환하는 함수입니다. public interface ApplePredicate { boolean test(FilteringApples.Apple apple); } public cl..

Java 2023.05.10

오버로딩과 오버라이딩에 대해

본문에 들어가기 앞서 오버로딩과 오버라이딩을 한줄 요약한다면 다음과 같습니다. 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것 오버라이딩 (overriding) : 상속받은 메서드의 내용을 변경하는 것 오버로딩 (overloading) 자바에서는 한 클래스 내에서 메서드 매개변수의 개수 혹은 타입이 다르다면 이미 존재하는 메서드명을 다시 사용할 수 있습니다. 오버로딩이 성립하기 위해서는 다음의 조건을 만족해야 합니다. 메서드 이름이 같아야 한다. 매개변수의 개수 혹은 타입이 달라야 한다. 메서드의 반환 타입은 영향을 미치지 않는다. [출력 결과] 이름 : tommy 이름 : tommy, age : 2 예시로 Printer 이라는 클래스를 생성했습니다. print method가..

Java 2023.05.01