[JAVA] 전략 패턴을 이용해 런타임 중 알고리즘 선택 요구 사항 기능 구현 요구 사항 중에 사용자가 선택한 메신저에 메시지를 전송해야 하는 것이 있었습니다. 각 메신저마다 자체 Format이 있어 해당 Format으로 메시지를 변환시켜야 하고, 연동할 메신저는 더 늘어날 수가 있습니다. 따라서 확장에 용이하게 하기 위해 조건문이 아닌 자바의 다형성을 이용해야 했고, 들어오는 사용자의 요청에 따라 런타임에서 동적으로 각 메신저에 맞는 알고리즘을 선택하여 메시지를 변환해야 했습니다. 이해를 돕기 위해 비즈니스 로직이 담기지 않은 단순한 형식의 전략(알고리즘)으로 구현하겠습니다. Strategy 인터페이스에 convertMessage() 메서드를 정의 전략으로는 RepeatStrategy, ReverseStrategy 두 개를 클래스로 구현하고 모두 Strate..
썸네일 [JAVA] Comparator와 Comparable Comparator와 Comparable 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있으며, Comparable을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 비교할 수 있는 클래스들이며, 기본적으로 오름차순으로 정렬되도록 구현되어 있다. 알고리즘 문제를 풀 때 정렬 기준을 바꿔야 하는 경우가 많아 유용하게 쓰인다. 👉 Comparable: 기본 정렬기준을 구현하는 데 사용 (클래스의 기본 정렬 기준을 재정의하는 데 사용) 👉 Comparator: 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용 (클래스 단위가 아닌 객체마다 정렬 기준을 다르게 하는 데 사용) 실제 소스: public interface Comparator{ int compare(Object o1, Ob..
썸네일 [JAVA] 지네릭스(Generics) 지네릭스란? 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크(compile-time type check)를 해주는 기능이다. 장점 1. 타입의 안정성을 제공한다. 👉 의도하지 않은 타입의 객체가 저장되는 것을 막고, 객체를 꺼내올 때 다른 타입으로 잘못 형변환되는 것을 방지한다. 장점 2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다. 🔎 지네릭스 용어 class Box{ } Box : 지네릭 클래스 T : 타입변수 or 타입 매개변수 Box: 원시 타입 타입변수는 T는 'Type'의 첫 글자에서 따온 것이며 다른 문자를 사용해도 되며, '임의의 참조형 타입'을 의미한다는 것은 모두 같다. 지네릭스의 제한 (static, new, instanceof) 1. st..
썸네일 [JAVA] HashSet, TreeSet, 해싱 HashSet 중복된 요소를 저장하지 않는다. 내부적으로 HashMap을 이용해 만들어졌다. 저장순서를 유지하지 않으므로 중복을 제거하고 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다. 공식문서 public class Person{ private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString(){ // Overrides method in Object return name + " : " + age; } } import java.util.*; public class Test { public static vo..
썸네일 [JAVA] ArrayList vs LinkedList ArrayList Object배열을 이용해서 데이터를 순차적으로 저장한다. 크기를 변경할 수 없다. 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장한다. -> 이 과정에서 처리시간이 많이 소요되기 때문에 ArrayList를 생성할 때, 실제 저장할 개수보다 약간 여유 있는 크기로 지정하는 것이 좋다. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다. 공식문서 아래는 list2에서 list1과 공통되는 요소들을 삭제하는 코드다. for문에서 변수i를 list2.size()-1 부터 감소시켜야 올바른 값을 얻을 수 있다. import java.util.ArrayList; public class Test { publi..
썸네일 [JAVA] Collections Framework 인터페이스 컬렉션 프레임웍 (Collections Framework) 컬렉션 프레임워크에서는 컬렉션데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고 각 컬렉션을 다루는데 필요한 기능을 가진 3개의 인터페이스 - List, Set, Map 를 정의하였다. 이중 List와 Set 인터페이스는 Collection 인터페이스를 상속받는다. 컬렉션 프레임워크의 모든 컬렉션 클래스들은 List, Set, Map 중의 하나를 구현한다. Collection 인터페이스 메서드: boolean add(Object o) boolean addAll(Collection c) void clear() boolean contains(Object o) boolean containsAll(Collection c) boolean equals(O..
썸네일 [JAVA] 인터페이스 인터페이스 작성 및 구현 인터페이스의 멤버들의 제약사항 - 모든 멤버변수는 public static final (상수)이어야 하며, 이를 생략할 수 있다. - 모든 메서드는 public abstract (추상 메서드)이어야 하며, 이를 생략할 수 있다. 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. public interface Movable { void move(int x, int y); // (1) } public class Person implements Movable{ // void move(int x, int y) { // (2) // } @Override public void move(int x, int y) { } } (1) 인터페이스에 생략된 제어자는..
썸네일 [JAVA] 제어자(modifier)와 다형성(polymorphism) 제어자 클래스, 변수, 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다. 접근 제어자 : public, protected, default, private 그 외 제어자: static, final, abstract 등 final final 클래스: 변경될 수 없고 확장될 수 없는 클래스, 다른 클래스의 조상이 될 수 없다. final 메서드: 변경될 수 없고 오버라이딩을 통해 재정의 될 수 없다. final 멤버변수, 지역변수: 값을 변경할 수 없는 상수가 된다. public class Card { final int NUMBER; // (1) final String KIND; // (1) static int width = 100; static int height = 250; public Ca..
썸네일 [JAVA] 오버라이딩 (overriding) 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것 오버라이딩 조건 이름이 같아야 한다. 매개변수가 같아야 한다. 반환타입이 같아야 한다. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다. (대부분 같은 범위의 접근 제어자를 사용) 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다. 인스턴스 메서드를 클래스 메서드로 또는 그 반대로 변경할 수 없다. (static멤버는 자신이 정의된 클래스에 묶여있다고 생각) 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(Instantiate)라고 한다. 어떤 클래수로부터 만들어진 객체를 그 클래스의 인스턴스(Instance)라고 한다. 오버라이딩 vs 오버로딩 오버라이딩(overriding): 상속받은 메서드의 내용을 변경하는 ..
썸네일 [JAVA] 생성자와 변수의 초기화 생성자(Constructor) 생성자란 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다. 생성자 이름은 클래스 이름과 같아야 하며 리턴값이 없다. 인스턴스를 생성할 때는 반드시 클래스 내에 정의된 생성자 중의 하나를 선택하여 지정해주어야 한다. 기본 생성자(Default Constructor) 클래스명(){ } 클래스 내에 생성자가 하나도 없을 때는 컴파일러가 자동적으로 기본 생성자를 추가해준다. 하지만 클래스 내에 생성자가 하나라도 있으면 기본 생성자는 자동으로 생기지 않으므로 정의되지 않은 생성자를 호출하려고 할 때 컴파일 에러가 발생한다. this(), this 같은 클래스의 다른 생성자를 호출할 때 사용된다. class Data { String color; String type; int ..
썸네일 [JAVA] 메서드(Method) 메서드를 사용하는 이유 1. 높은 재사용성(reusability) 2. 중복된 코드 제거 3. 프로그램의 구조화 Return문 반환 타입이 void인 경우 return문을 안 써줘도 된다라고만 알고 있었으나, 원래는 모든 메서드에는 적어도 하나의 return문이 있어야 한다. 반환 타입이 void인 경우, 컴파일러가 마지막에 'return;'을 자동적으로 추가해줬기 때문에 return문을 쓰지 않아도 문제가 생기지 않았던 것이다. JVM의 메모리 구조 (1) 메서드 영역 어떤 클래스가 사용되면 JVM은 해당 클래스 파일을 읽어 클래스 데이터를 이곳에 저장한다. 클래스 변수도 이 영역에 함께 생성된다. 메소드, 클래스, 인터페이스, 필드 등의 바이트 코드가 저장된다. (2) Heap 영역 프로그램 실행 중..
썸네일 [JAVA] 변수 - 인스턴스변수, 클래스변수, 지역변수 변수의 종류 변수의 선언된 위치에 따라 멤버변수와 지역변수로 나뉘고 멤버변수 중 static이 붙은 것은 클래스변수(static변수, 공유변수), 붙지 않은 것은 인스턴스변수이다. class Person { int age; // 인스턴스 변수 static int countryCode; // 클래스 변수 void isPretty(){ boolean goodLooking = true; // 지역변수 } } 인스턴스 변수, 클래스 변수 인스턴스변수와 클래스변수는 모두 클래스 영역에서 선언된다. 인스턴스변수 클래스의 인스턴스를 생성할 때 만들어진다. 인스턴스마다 독립적인 저장공간을 가지므로 인스턴스마다 서로 다른 값을 가질 수 있다. 클래스변수 클래스가 메모리에 올라갈 때 생성되며 프로그램이 종료될 때까지 유지..