Java

    힙 / 이진 탐색 트리

    힙 / 이진 탐색 트리

    힙 최소/최대값을 빠르게 찾기 위해 고안된 완전 이진 트리 형태의 자료구조 완전 이진 트리: 노드를 삽입할 때 최하단 왼쪽 노드부터 차례로 삽입하는 트리 힙의 구조: Max Heap / Min Heap Max Heap: 최대값이 루트노드이고, 각 부모노드는 자식노드보다 크거나 같은 값을 가짐 Min Heap: 최소값이 루트노드이고, 각 부모노드는 자식노드보다 작거나 같은 값을 가짐 우선순위 큐의 구현을 위해 사용된다. 큐는 선입선출 방식이지만, 우선순위 큐는 들어간 순서와 상관없이 높은 우선순위를 가진 원소가 가장 먼저 나오는 방식이다. 작은 숫자부터 나오는 큐를 Min Heap, 큰 숫자부터 나오는 큐를 Max Heap이라고 한다. 이진 탐색 트리와는 달리 중복된 값이 허용되고, 자식노드의 좌우는 크기..

    정규표현식

    정규표현식

    자주 쓰는 정규표현식 숫자: ^[0-9]*$ 영문자: ^[a-zA-Z]*$ 한글: ^[가-힣]*$ String 클래스 String에 바로 정규표현식을 적용하여 필터링이 가능하다. boolean matches(String regex): 인자로 주어진 정규식에 매칭되는 값이 있는지 확인 String replaceAll(String regex, String replacement): 정규식과 매치되는 모든 문자열을 replacement 문자열로 바꾼 문자열을 반환 String[] split(String regex): 인자로 주어진 정규식과 매치되는 문자열을 기준으로 분할 // matches String txt1 = "123456"; boolean result1 = txt1.matches("[0-9]+"); /..

    람다식

    람다식 함수형 인터페이스를 사용할 때 람다식을 사용하면 코드가 간결해진다. 람다식은 하나의 익명 객체로, 인터페이스 참조 변수에 담아줘야 한다. 함수형 인터페이스는 추상 메소드가 단 하나 존재하므로, 람다식을 사용하면 명시하지 않아도 해당 메소드를 의미하게 된다. public class Main { public static void main(String[] args) { MyRunnable object2 = () -> System.out.println("Let's run"); object2.run(); } } 람다 사용법 기본: (int num) -> { System.out.println(num); } 단일 실행문은 중괄호 제거: (int num) -> System.out.println(num); 단일 ..

    익명 클래스

    함수형 인터페이스 추상 메소드가 단 하나만 선언된 인터페이스 (다른 존재 여부는 상관 x) 추상 메소드는 인터페이스와 추상 클래스에서 사용이 되고, 선언만 되어있는 메소드로 자식 클래스에서 반드시 구현이 되어야 한다. @FunctionalInterface // 함수형 인터페이스 o interface MyRunnable { void run(); } @FunctionalInterface // 함수형 인터페이스 o interface MyRunnable2 { void run(); default void sayHello() { System.out.println("Hello"); } } // 함수형 인터페이스 x interface MyRunnable3 { void run1(); void run2(); } 인터페이스..

    equals, hashCode

    equals public boolean equals(Object obj) { return (this == obj); // 주소값 비교 } 자바의 최상위 클래스인 Object의 메소드 인자로 들어온 Object가 같은 객체인지 확인해서 boolean 타입으로 리턴한다. 그렇다면 같은 문자열인지를 비교하는 것이 아니므로, 밑에서 둘이 다른 객체가 출력되어야 할 것 같다. String str1 = new String("apple"); String str2 = new String("apple"); if (str1.equals(str2)) System.out.println("둘이 같은 객체"); // 출력 else System.out.println("둘이 다른 객체"); System.out.println(str1..

    String / int 변환

    String / int 변환

    Integer.parseInt() String 객체를 기본형 정수(int)로 변환하여 반환한다. String이 유효한 숫자를 포함하고 있지 않으면 NumberFormatException이 발생한다. String string = "25"; try { int number = Integer.parseInt(string); // 음수도 가능 } catch (NumberFormatException e){ e.printStackTrace(); } Integer.valueOf() String 객체를 정수 객체(Integer)로 변환하여 반환한다. valueOf() 인자로 String 값을 넣으면, 자동으로 new Integer(Integer.parseInt(string))이 된다. String string = "25..

    Collections.sort / Arrays.sort

    기본(오름차순) 정렬 순서는 숫자 대문자 > 소문자 > 숫자 Collections.sort collections.sort()는 따로 기준을 정의하지 않으면 오름차순 정렬을 한다. 숫자나 문자가 아닌 새롭게 정의한 클래스에 대해서는 Comparable 인터페이스의 compareTo()를 오버라이딩 해줘야 한다. a.compareTo(b) a > b : 양수 반환 a == b : 0 반환 a < b : 음수 반환 public class Person implements Comparable{ String name; int age; public Person(String name,int age) { this.name = name; this.age = age; ..

    Collection

    Collection

    컬렉션 프레임워크 컬렉션은 다수의 데이터들(객체의 모음)을 의미하고, 프레임워크는 표준화된 프로그래밍 방식(사용 방법을 정해놓은 라이브러리)을 의미한다. 컬렉션은 널리 알려진 자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 만든 가변 크기의 컨테이너이고, 이 인터페이스와 구현 클래스들을 컬렉션 프레임워크라고 부른다. 컬렉션에 저장할 수 있는 데이터는 오로지 객체(Object) 뿐이다. 객체를 담는 것은 곧 주소 값(객체의 번지)을 담는 것이므로 null도 저장할 수 있다. 컬렉션 밑의 모든 클래스들은 컬렉션에서 상속받은 통일된 메소드를 사용하게 된다. 컬렉션 프레임워크는 크게 Collection 인터페이스와 Map 인터페이스로 나뉜다. 대부분의 컬렉션 클래스들은 List, Set,..

    Stack, Queue

    Stack, Queue

    Stack 자바의 컬렉션 프레임워크에서 제공하는 LIFO(후입선출) 자료구조 클래스이다. 자바에서 제공하는 Stack 클래스는 java.util.Vector 클래스를 상속받았으므로, 해당하는 기능을 전부 쓸 수 있다. 다음은 Stack 클래스의 주요 메소드이다. Stack 객체를 생성하려면 E 타입 파라미터 자리에 저장할 객체 타입을 표기하고, 기본 생성자를 호출하면 된다. Stack stack = new Stack(); Stack stack = new Stack(); // 타입파라미터 생략하면 왼쪽타입 따라감 Queue 자바에서의 큐는 인터페이스로만 정의되어 있고, 별도로 클래스를 제공하지 않고 있다. 따라서 Queue 클래스 인스턴스를 생성하기 위해선 Queue 인터페이스 구현체인 LinkedList..

    다형성

    다형성이란 프로그램 언어 각 요소들(상수,변수,객체,메소드 등)이 다양한 자료형(type)에 속하는 것이 허용되는 성질을 의미한다. 즉, 하나의 타입에 여러 객체를 대입할 수 있는 성질을 말한다. 다형성을 구현하는 방법에는 대표적으로 오버로딩, 오버라이딩, 함수형 인터페이스가 있다. 오버로딩 여러 종류의 타입을 받아들여 결국엔 같은 기능을 하도록 만든 것이다. 주로 생성자 오버로딩에 자주 쓰인다. public class PrintStream { ... public void println() { this.newLine(); } public void println(boolean x) { synchronized(this) { this.print(x); this.newLine(); } } public void ..