분류 전체보기

    [Java] Stream

    배열이나 컬렉션들 자료들의 대해 연산을 해준다. 연산들의 처리가 추상화 되어 있고 일관성 있게 제공해주는 기능이다. 스트림은 한번 생성하고 사용한 스트림은 소모가 되므로 재사용할 수 없다는 단점이 있다. 스트림 연산은 기존 자료를 변경하지 않는다. 스트림 연산은 중간 연산과 최종 연산이 있다. 중간 연산은 1 ~ n 번 연산 가능 최종 연산은 중간 연산이 된 후 에 1 번 연산 가능 중간 연산 중에 결과는 연산 중에 알 수 가 없다. 최종 연산이 되어야 결과를 알 수 있다 이를 “지연 연산" 이라 한다. 기본적인 최종 연산을 알아보자. int[] arr = {1, 2, 3, 4, 5}; int sum = Arrays.stream(arr).sum(); int count = (int) Arrays.strea..

    [Java] Lambda expression

    자바의 기능이 늘어남으로 심플성과 안정성을 추구하는 자바는 jdk8 부터 람다식(함수형 프로그래밍 방식)의 스펙을 제공해준다. 매개변수를 받고 받은 매개변수를 기반으로 내부에서만 함수가 진행 되기 때문에 외부 자료에 부수적인 영향을 주지 않는 장점이 있다. 즉, 내부적인 작업이 가능하기 때문에 병렬 처리가 가능하고 멀티 스레드 환경에서 안정성의 장점을 가진다. 하지만 가독성이 떨어지는 단점이 존재하긴 한다. 장점 외부 자료에 영향을 주지 않고 내부 작업이 가능 병렬 처리가 가능 멀티 스레드 환경에서 안정성 단점 가독성이 떨어짐 람다식 문법 (매개변수) → (실행문) 두 수를 입력 받아 sum 하는 sum() funtional interface 사용 @FunctionalInterface public int..

    [Java] Inner Class

    클래스 내부에 선언한 클래스로 중첩 클래스라고도 말한다. 이 클래스를 둘러싼 외부 클래스와 밀접한 연관이 있는 경우가 많다. 내부 클래스의 종류 인스턴스 내부 클래스 정적(Static) 내부 클래스 지역(local) 내부 클래스 익명(anonymous) 내부 클래스 인스턴스 내부 클래스 내부적으로 사용할 클래스를 private으로 선언하기를 권장한다. private 이 아닌 다른 접근 제어자를 사용하면 다른 외부 클래스에서 생성할 수 있는 문제. 외부 클래스가 생성된 후에 생성된다. 예시 // Outer 를 생성한 후 Outer outer = new Outer(); // Inner 생성 가능 Outer.Inner inner = outer.new Inner(); 생성자를 사용하여 내부 클래스를 생성하는 것..

    [Java] Generic Programing

    클래스에서 사용하는 변수의 자료형이 여러개 일 수 있고, 그 기능이 동일한 경우 클래스의 자료형을 정하지 않고 추후 해당 클래스를 사용할 때 지정 할 수 있도록 선언해주는 프로그래밍이다. 실제 사용되는 자료형의 반환은 컴파일러에 의해 검증되므로 기존에 instancof 연산자로 타입 체크의 수고를 덜어주고 의도치 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때 원래의 타입과 다른 타입으로 잘못 형변환되어 발생할 수 있는 오류들을 줄여든다. 한마디로 객체의 타입 안정성과 형변환의 번거로움을 줄인다. 라는 장점이 있다. 주로 사용하는 곳은 컬렉션 프레임워크와 jpa 등 여러 곳에서 많이 쓰이는 것을 볼 수 있다. Generic의 장점을 보여주는 예제 구현 public class Bread ..

    [ITEM 13] clone 재정의는 주의해서 진행해라

    Cloneable 인터페이스 Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 인터페이스다. public class Person implements Cloneable { //..... } 아쉽게도 Cloneable 인터페이스는 의도한 목적을 제대로 이루지 못했다. 왜냐하면 Cloneable 인터페이스에는 아무런 정의가 되지 않은 빈통 인터페이스다. public interface Cloneable { } clone 메서드가 정의 된 곳은 Object 클래스에 protected로 정의 되어 있다. @HotSpotIntrinsicCandidate protected native Object clone() throws CloneNotSupportedException; 그러면 Cloneable 인터페이스..

    [ITEM 12] toString을 항상 재정의하라

    Object의 기본 toString 메서드가 해당 클래스의 적합한 문자열을 반환하는 경우는 거의 없다. 이 메서드는 단순히 클래스이름@16진수로표현한해시코드 를 반환 할 뿐이다. toString의 일반 규약 ‘간결하면서 사람이 읽기 쉬운 형태의 유익한 정보' 를 반환해야 한다. ‘모든 하위 클래스에서 이 메서드를 재정의하라' 객체가 가지고 있는 주요 정보들을 모두 반환하는 것이 좋고 toString을 잘 구현한 클래스는 사용하기에 쉽고 디버깅하기 쉽다. toString을 구현할 때면 반환값의 포맷을 문서화할지 정해야 한다. 포맷을 명시하면 그 객체는 표준적이고, 명확하고, 사람이 읽을 수 있게 된다. 정적 팩터리나 생성자를 함께 제공하면 좋다. 단점 명확성을 얻을 수 있고 코드를 수정해야하는 유연성을 잃..

    [ITEM 11] equals를 재정의하려거든 hashCode도 재정의하라

    equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다. 그렇지 않으면 equals 재정의 규약을 어기게 되어 문제를 일으킨다. 규약 equals 비교에서 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. equals 메서드가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다. equals 메서드가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다. hashCode 재정의를 잘못했을 때 크게 문제가 되는것은 ‘논리적으로 ..

    [Tree] 트리

    [Tree] 트리

    트리 ( Tree ) 트리란? 부모 자식 관계를 가진 자료구조이며 나무의 뿌리? 를 연상캐하는 자료구조입니다. 트리를 구성하는 요소로 노드와 간선으로 표현되어 구성되어있다. 위의 구성 노드를 구성한 코드입니다. public class Node { private int value; private Node left; private Node right; } 데이터 표현은 int로 받기위해 int 타입으로 구성하고 왼쪽 오른쪽 노드를 구성하였습니다. 트리의 특징 및 구성요소 비선형 구조이며 계층구조를 나타낸다. 각 노드는 하나의 부모노드를 가진다. 자식 노드 개수는 0개 이상을 가진다. 노드 개수가 n일 때, 간선의 개수는 n-1개 이다. 이진트리 ( Binary Tree ) 각각의 노드는 최대 2개의 자식 노..

    [ITEM 10] equals는 일반 규약을 지켜 재정의하라

    equals() 메서드를 재정의 하지 않고 그냥 두면 해당 클래스의 인스턴스는 오직 자기 자신하고만 같게 된다. 재정의하지 않는 것을 권장 각 인스턴스가 본질적으로 고유 Thread 클래스의 equals() 가 좋은 예 인스턴스의 ‘논리적 동치성(logical equality)’을 검사할 일이 없다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 맞는다. 예) 컬렉션 프레임워크의 구현체들은 추상클래스의 equals를 그대로 사용한다. equals() 를 호출할 일이 없다. 재정의해야 할 때는 언제일까? 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의 되지 않았을 때 값 클래스들이 해당됨 Integer String ….. 등 재정의를 하지 않아도 될 때 싱글톤이 보장되면 equals..

    [Java] Inheritance in Java

    자바에서 상속이란? OOP에서 상속은 기존 코드를 재사용하거나 기존 유형을 확장하는 용도로 사용합니다. 자바에서 클래스는 다른 클래스와 여러 인터페이스를 상속할 수 있는 반면 인터페이스는 다른 인터페이스를 상속할 수 있습니다. 필요성 게임들의 캐릭터를 객체화를 시켜봅시다. 캐릭터라는 클래스는 여러가지 직업들을 가질 수 있고 무기도 가질 수 있어 너무 추상적인 클래스입니다. 기본적인 특징만 정의하고 이를 재사용하는 상속이 필요합니다. public class Character { private String weapon; private int level; private long hp; private long mp; // 스텟 클래스를 따로 만들어 참조하는 식으로 하는게 좋을거 같다! private int st..

    [Java] Java Interface

    인터페이스는 추상 클래스와 동일한 미완성 설계도?? 추상적인 계층이다. 객체 지향 관점에서 추상 클래스는 is a 관계에 풀어서 사용하고 인터페이스는 has a 관계에 풀어서 사용한다. 이점을 꼭 기억하자. 추상 클래스에 관한 글에 Car클래스의 자율주행기능 modeChange() 메서드를 따로 인터페이스로 빼서 구현해보겠습니다, public interface DrivingFunction { void modeChange(); } DrivingFunction 인터페이스는 자율주행 기능을 정의해놓았다. 그냥 기본 틀이고 구현은 안되어 있다. 자율주행 기능이 있는 차들에게만 이 기능을 구현 해주면 된다. public class Tesla implements DrivingFunction { // fields....

    [Java] Abstract Classes in Java

    추상 클래스란 공통된 기능과 속성들을 정의한 클래스를 말한다. 공통된 기능은 메서드를 구현하여 한 곳에서 사용할 수 있게 정의해두고 공통된 기능인데 내부 로직을 다르게 만들어야 한다면 메서드 시그니처만 정의 해주면 된다. 추상 클래스는 is a 관계에 사용되는 것을 알고 들어가자. 다음으로 is a 관계인 “테슬라와 현대차는 자동차다" 로 예를 들어볼것입니다. 테슬라는 자율주행 모드를 지원하는 대표적인 차량이다. 현대차도 최근에 자율주행 모드를 지원하는 차량을 많이 판매하고 있다. 두 차량의 공통된 기능은 자율주행모드 다. 하지만 자율주행모드를 구현하는 로직은 서로 다를 것이다. 같으면 내부 스파이가 있을 수 도!!!! 차량들을 클래스로 만들어 구현해보자. 자동차 → 상위 클래스 public abstra..

    [Java] Polymorphism in Java

    사전적 의미 여러 다른 형태로 발생하는 조건 프로그래밍 루틴이 서로 다른 시간에 서로 다른 유형의 타입 사용할 수 있도록 하는 기능 직원과 매니저의 관계 현실 매니저는 직원에게 일을 하나하나 간섭하여 시키고 알려준다. 직원은 매니저를 욕하며 일한다. (넝~담!) 프로그램 매니저는 직원에게 일만 시킴 → 무슨일을 하는지 모름! 직원은 일을 함 → 자율적으로 일한다 구현 코드 public class Manager { private List employees = new ArrayList(); public void orderToDoJop() { for (Employee employee : employees) { if (employee != null) { employee.work(); } } } public vo..

    [Sort] 퀵 정렬 (Quick Sort)

    소개 Pivot 기준으로 정렬을 진행한다. 앞서 배운 정렬들에 비해 빠른 속도를 가진다. 시간 복잡도는 평균적으로 O(nlogn) 을 가진다. 하지만 최악일 경우엔 O(n2) 을 가진다. 동작원리 배열 안에 기준이 될 원소를 선택 → Pivot Pivot을 기준으로 pivot 보다 작은 원소는 모두 왼쪽으로 옮기고 큰 원소는 모두 오른쪽으로 옮겨 분할 과정을 거친다. pivot 을 제외한 왼쪽 배열과 오른쪽 배열의 리스트를 정렬한다. 분할된 배열을 가지고 위의 순서를 더이상 분할이 안될 때 까지 반복한다. 구현코드 public static void sort(int[] arr, int left, int right) { if (left >= right) { return; } int i = left; int ..

    [Sort] 병합 정렬 (Merge Sort)

    소개 많은 양의 데이터가 한 개가 될 때까지 반으로 분해하고 또 분해한다. 그리고 다시 그 데이터를 정렬하고 병합하는 알고리즘을 병합정렬이라 한다. 시간복잡도는 O(nlogn)을 가진다. 동작원리 배열을 반으로 계속 나눈다. 왼쪽배열이 오른쪽배열보다 작아질 때 병합을 시켜준다. 병합할 때 정렬을 하면서 병합한다. 구현 코드 public void mergeSort(int[] arr, int left, int right) { if (left < right) { int middle = (left + right) / 2; mergeSort(arr, left, middle); mergeSort(arr, middle + 1, right); merge(arr, left, middle, right); } } priva..