Java의 모든 객체는 Object 클래스를 상속받고 있다. Object 클래스는 객체의 동일성을 비교하기 위한 equals와 hashCode 메서드가 정의되어 있다. 따라서 Java의 모든 객체는 필요에 따라 equals와 hashCode를 재정의할 수 있다. equals() equals()는 두 객체의 값이 같은지 여부를 비교할 때 사용하는 메서드이다. 객체를 비교할 때 기본적으로 객체의 주소를 비교한다. public static void main(String[] args) { Car car1 = new Car(1111, "blue"); Car car2 = new Car(1111, "blue"); System.out.println(car1 == car2); //두 객체는 주소가 다르기 때문에 fals..
Item1 : 생성자 대신 정적 팩토리 메서드를 고려하라 클래스의 인스턴스를 얻는 가장 기본적이고 전통적인 방법은 public 생성자이다. new 키워드를 이용하여 인스턴스를 생성할 수 있다. Item item = new Item(); 이 방법과는 별도로 정적 팩토리 메서드(static factory method)를 제공하는 방법을 꼭 알아두면 좋다. 해당 클래스의 인스턴스를 반환하는 단순한 정적 메서드이다. 예를 들면 아래와 같이 primary type인 boolean의 boxing class Boolean에서 정적 팩토리 메서드를 이용해서 boolean을 Boolean으로 변환하는 메서드가 있다. public static Boolean valueOf(boolean b) { return (b ? TRU..
빈 스코프란? 스프링 빈은 기본적으로 싱글톤으로 관리된다. 그래서 스프링 컨테이너는 스프링 싱글톤 컨테이너라고 불리기도 한다. 그러나 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. "스코프"는 빈이 존재할 수 있는 범위를 뜻한다. 한마디로 빈 스코프는 빈이 존재할 수 있는 범위 또는 빈의 라이프사이클의 범위라고 생각할 수 있을 것 같다. 스프링은 아래와 같이 다양한 빈 스코프를 지원한다. 싱글톤 : default, 스프링 컨테이너의 시작부터 종료까지 유지되는 가장 넓은 범위의 스코프 프로토타입 : 스프링 컨테이너는 빈의 생성과 의존성 주입까지만 관여하고, 더 이상 관리하지 않는 짧은 범위의 스코프 웹 관련 스코프 : request, session, application 등 여러 스코프..
Spring Bean LifeCycle Spring DI 컨테이너는 Bean으로 등록된 객체의 생명주기 관리를 위임받아서 관리하고, 객체가 필요한 곳에서 이 Bean을 의존성 주입받아서 사용할 수 있다. 스프링 컨테이너가 생성될 때 객체(Bean)를 생성하고 의존성을 주입하는데, 의존관계 주입 후 Bean을 초기화하고, 스프링 컨테이너를 종료하기 전에 객체를 소멸시켜야 한다. 객체의 생성과 초기화 분리 객체를 초기화 한다는 것은, 객체 생성 이외에 외부 커넥션을 연결하거나, 초기값을 등록하는 등의 여러 작업을 말한다. 이 과정을 생성자에서 진행해도 되지만, 객체 생성에 비해 초기화는 비교적 무거운 일을 수행하기 때문에 객체를 생성하는 부분과 초기화하는 부분을 명확하게 나누는 것이 좋다. 빈 생명주기 스프..
DI : Dependency Injection (의존성 주입) 의존성 주입은 객체 간의 의존성을 줄이고 유지보수성을 높이기 위해 사용된다. Spring 컨테이너에 여러 컴포넌트를 Bean으로 등록하여 생명주기 관리를 위임하고, 이 Bean으로 등록한 객체를 주입받아서 사용할 수 있다. DI 덕분에 개발자가 객체 생성에 대한 부분을 신경 쓰지 않고 비즈니스 로직에만 집중할 수 있게 된다. 의존성 주입 방법 의존성 주입 방법은 4가지가 있다. 생성자 주입 Setter 주입 Field 주입 일반 메서드 주입 이 중, 생성자 주입을 가장 많이 사용하고 Spring에서 권장하는 방법이다. 생성자 주입 생성자를 통해 의존성을 주입하는 방법이다. 생성자 호출 시점에 딱 한 번만 호출되는 것이 보장된다. 불변, 필수 ..
조인 (Join) 조인(join)은 하나의 쿼리로 두 개 이상의 테이블을 묶어서 불러오는 것을 말한다. Join은 크게 inner, left, right, outer join으로 나뉜다. INNER JOIN 두 개의 테이블 간의 교집합을 나타낸다. A 테이블과 B 테이블에서 조건을 만족하는 row만 조회한다. SELECT * FROM TableA A INNER JOIN TableB B ON A.key = B.key LEFT OUTER JOIN 왼쪽 테이블 A를 기준으로 오른쪽 테이블 B의 일치하는 부분의 레코드와 함께 출력된다. 만약 테이블 B에 일치하는 항목이 없으면 해당 값은 null로 출력된다. A 테이블의 데이터가 모두 출력되지만, 조건에 만족하는 경우 B 테이블의 데이터도 출력되고, 조건에 만족..
(운영체제) 프로세스 메모리 구조 일반적으로 프로세스의 메모리 구조는 아래의 4가지 영역으로 나눠진다. 스택(stack), 힙(heap), 데이터(data), 코드(text) 영역 stack과 heap 영역은 런타임 단계에서 메모리를 할당받는 동적 영역이고, data와 code 영역은 컴파일 단계에서 메모리를 할당받는 정적 영역이다. Stack : 임시 데이터 (함수 실행을 위한 지역 변수 등)가 저장된다. Heap : 코드에서 동적으로 만들어지는 데이터가 저장된다.(동적으로 할당된 데이터) data : 전역 변수, 초기화된 데이터 등 code : 프로그램 코드 JVM(Java Virtual Machine) Java의 특징 객체지향 프로그래밍 언어 기본 자료형(Primitive type : 원시 자료형)..
이 글은 제 포트폴리오에서 사용된 기술에 대한 내용을 다루고 있습니다. 자세한 내용은 추가로 검색을 해보셔서, 본인의 언어로 정리하시길 추천드립니다. 이 글 역시 제 생각과 언어에 맞게 정리하였고, 틀린 부분이 있을 수 있으니 댓글로 지적해 주시면 감사하겠습니다! [Redis] 💡Redis의 특징 ⬇️정리 더보기 key - value쌍의 해시맵과 같은 구조를 가진 NoSQL이다. 오픈소스 기반으로 인메모리 데이터 저장소로, 메모리에 데이터를 저장한다. 1. 성능 모든 데이터를 메모리에 저장되어 대기 시간을 낮추고 처리량을 높인다. 읽기, 쓰기 속도가 RDBMS에 비해 빠르다. 2. 유연한 데이터 구조 String, List, Set, HashMap 등 다양한 데이터타입을 지원한다. 3. 개발 용이성 쿼리..