개요 자바에는 데이터의 그룹(자료구조)을 나타내기 위한 Collection 인터페이스가 존재한다. Collection 인터페이스에는 List, Set, Queue가 존재하며, 해당 인터페이스들을 구현하는 다양한 구현체들이 존재한다. + Collections라는 클래스도 존재하는데, 여기에는 Collection과 그 하위 클래스들을 조작하기 위한 static 메서드들이 존재한다. 다양한 컬렉션 인터페이스들(+Map)을 살펴보고, 각 인터페이스를 구현하는 구현체의 특징과 자료구조, 시간복잡도 등에 대해서 정리해보겠다. 1. List List는 순서를 보장하는 컬렉션 인터페이스이며, 중복을 허용한다. 1-1. ArrayList - [배열 기반의 리스트]public class ArrayList extend..
개요 자바에서 일반적으로 사용되는 변수는 여러가지가 있는데, 흔히 유명한 것들이 메소드나 블록 내에서만 유효한 로컬 변수(local variable)나 매개변수(paramter), 객체의 생성과 함께 관리되는 인스턴스 변수(instance variable), static 키워드와 함께 선언되어 클래스 로딩 시점에 초기화되는 스태틱 변수(static variable)와 같은 변수들이 있다. 하지만 위와 같은 변수들은 멀티쓰레드 환경에서의 safety를 보장하지 않는다. 멀티쓰레드 환경에서는 여러 쓰레드가 동시에 동일 데이터에 접근을 시도하는 경우 race-condition으로 인한 가시성 문제(한 쓰레드에서 수정한 사항이 다른 쓰레드에서 보이지 않음)나 동시 접근 문제(여러 쓰레드가 동시에 접근하여 값이..
1. 에러(Error)와 예외(Exception) 일반적으로 자바에서는 잡을 필요도 없고, 회복또한 불가능한 것을 에러(Error)라고 하며, 잡을 수 있고 회복이 가능한 것을 예외(Exception)이라고 부른다. 위 그림에서 나타나는 에러들을 보면 쉽게 이해할 수 있을 것이다. 예를 들어 OutOfMemoryError라는 에러는’ 메모리 부족’이라는 예상할 수 없고, 프로그램상으로 해결할 수도 없는 문제를 나타내고 있다. 아마 자연스럽게 느껴질텐데, 이러한 이유로 프로그램을 짤 때 주로 개발자는 에러보다는 예외에 대해서 고려하게 된다. 2. 예외(Exception)의 종류 자바에서 모든 예외도 객체이므로 Object를 상속받으며, 최상위 예외로는 Throwable클래스를 갖는다. Throwa..
람다란 익명 함수(이름이 없는 함수)를 말하는데, 자바에서의 람다식 표현법과 활용되는 예를 정리했다. 람다식 람다식은 이름이 없는 함수를 의미하는데, 즉 함수를 하나의 식으로 표현하는 방법이다. 가장 간단한 람다식은 다음과 같이 표현할 수 있다. 이때 expression은 바로 return값이 나와야 한다. 예를 들면 public String getName() { return "name"; } () -> "name" 과 같이 바로 리턴값이 나와야 한다. 만약 다양한 변수나 선언문, 배정문등을 쓰기 위해서는 중괄호를 사용해주면 된다. 이러한 람다식은 불필요한 코드를 줄이고, 가독성을 높이기 위해서 사용될 수 있다. 함수형 인터페이스 배열을 정렬하는 Arrays.sort() 함수에서 사용되는 예를 보자. I..
자바에서 배열 혹은 컬렉션 인스턴스의 조회를 위해서 흔히 for문 또는 foreach(iter)문을 사용하면서 요소 하나씩을 꺼내서 조회하였다. 간단한 경우에는 크게 문제되지 않지만, block으로 관리되는 특성상 로직이 복잡해지면 코드가 복잡해지는 문제가 있다. 자바 api 문서를 보면 스트림은 'A sequence of elements supporting sequential and parallel aggregate operations'라고 나와있다. 즉 배열이나 컬렉션과 같이 데이터를 나란히 저장하는 자료구조에서 원하는 결과를 필터링해서 얻어낼 수 있는 방법이다. 스트림을 사용하기 위해서는 크게 생성-필터링의 가공을 거쳐 결과를 사용하게 된다. 1. 생성 배열과 컬렉션 등의 다양한 자료구조에서 스트림..
개요"JAVA는 자바 가상 머신(Java Virtual Machine) 위에서 동작한다" - 자바를 처음 배울 때 들어봤을 개념이다. 그렇다면 왜 자바는 가상머신 위에서 동작하도록 설계된 것일까? 이번 포스팅에서는 자바의 동작 방식과 배경에 대해서 정리해보도록 하겠다. C언어로 프로그램을 작성해 본 적이 있다면, 아마 다음과 같은 과정을 거쳐 소스파일을 실행파일로 변환했을 것이다.gcc -c test.c -o test.o # 소스파일(test.c)을 이용해 오브젝트 파일(test.o)를 만든다.gcc test.o -o test.out # 오브젝트 파일(test.o)를 이용해 실행 파일(test.out)을 만든다. C언어는 "Write Once, Complie Anywhere"(WOCA)라는 특징을 가진다..
Singleton(싱글톤 패턴) 어떤 클래스가 최초 한번만 메모리를 할당하고, 그 메모리에 객체를 만들어 재사용하는 디자인 패턴을 의미한다. 즉, 생성자의 호출이 반복적으로 호출되었을 때에도 실제로 하나의 객체만이 생성되어 사용되는 패턴으로, 특히 스프링에서 스프링 빈의 관리를 싱글톤으로 하여 객체 인스턴스를 하나만 생성하여 DI(Dependency Injection)와 OCP(개방 폐쇄 원칙) 위반없이도 자유롭게 싱글톤을 사용하게 한다. 이는 메모리의 낭비를 방지할 뿐만 아니라, 객체가 전역성을 띄기에 다른 객체와 공유 또한 용이하다. - 싱글톤 인스턴스는 전역 인스턴스로 데이터를 공유하기 쉽다.- 공통된 객체를 여러개 생성해서 사용해야 하는 상황에서 많이 사용한다.- 두 번째 이용시부터는 객체 로딩 ..
BufferedReader 기존에 java에서 입출력을 관리할때는 흔히 Scanner를 사용했다. Scanner는 정수값으로 int, long, short, 부동소수값으로 float, double, 문자열은 String값으로 구분해서 읽을 수 있다. Scanner sc = new Scanner(System.in); int i = sc.nextInt(); long l = sc.nextLong(); short s = sc.nextShort(); float f = sc.nextFloat(); Double d = sc.nextDouble(); String str = sc.next(); String str2 = sc.nextLine(); 반면 BufferedReader는 문자열만을 읽을 수 있기 때문에 Scann..
개요 "자바에서 객체의 동등성 비교를 위해서는 equals() 메서드가 사용되며, equals()메서드를 오버라이딩해줄 경우 hashCode()메서드도 오버라이딩해 주어야 한다. 단, 역은 성립하지 않는다" 자바를 처음 공부했을 때 equals와 hashCode라는 메서드에 대해서 나는 이정도로만 이해하고 있었다. 그런데 여러 프로젝트를 진행하면서도 equals를 오버라이딩 할 일이 없어서 한번 실습하면서 정리해보려고 한다. equals와 hashCode앞서 이야기했듯이 equals는 참조 변수의 동등성을 비교하는 함수이다. 최상위 클래스인 Object 클래스를 들어가보면 equals() 메서드를 확인할 수 있는데, 위와 같이 '=='연산을 통해 단순히 두 객체의 참조(주소)가 같은지를 비교하고 있다. ..
java에서 static키워드를 사용하면 객체를 생성하지 않고 클래스의 필드와 메서드를 바로 사용할 수 있다. 그래서 객체에 할당될 메모리를 절약하거나, 코드의 길이를 줄일 수 있다. 여기까지는 자바 개념만 배우면서도 알 수 있는 내용이다. 그런데 이번에 웹 프로젝트 코드를 짜면서 '어떤 경우에 static으로 사용하고, 어떤 경우에 인스턴스를 생성해서 사용해야 할지 기준에 대한 명확한 이해가 가지 않았다. 내 머리로는 객체지향적 관점에서 클래스명으로 접근한다는 것은 클래스, 즉 설계적 관점에서 접근한다는 의미이고, 인스턴스로 접근한다면 그 '고유한 객체'만의 속성에 접근한다는 의미이지 않을까? 정도까지만 생각이 가능했다. Human.getAgeAvg(); Human human1 = new Human("..
Comparable과 Comparator는 둘 다 객체 비교를 위한 인터페이스이다. 따라서 이것들의 사용을 위해서는 인터페이스 내에 선언된 메소드를 반드시 오버라이드 해주어야 한다. 요즘 정리하고 있는 jpa에서의 값 타입에서 컬럼 분리를 위해서 equalsTo 메소드를 오버라이드 해주는 것과 비슷한 맥락인데, 이 비교를 위한 메소드도 자바에서 primitive type 자료형은 값의 비교가 이루어지고, reference type은 참조 비교가 이루어진다는 사실 때문이다. 풀어서 설명하자면, int나 long같은 primitive type의 경우 부등호를 이용하여 간단하게 비교할 수 있다. int a=1; int b=2; System.out.println(a 0반환 3. 작으면 > 양수값 반환 간단하게 ..