Java 21

[Java] LinkedList 파헤쳐 보기

Java의 ArrayList의 실제 구현코드를 살펴보았던 이전 게시글에 이어서 LinkedList도 소스코드를 파헤쳐보자. (참고: 2021.10.06 - [Language/Java] - [Java] ArrayList 파헤쳐 보기) Doubly-linked list implementation of the List and Deque interfaces. LinkedList는 이전/이후의 리스트와 연결되어 있는 구조이다. 이는 다음과 같은 특징을 가진다. o element 갯수에 대해 정해진 limit 없음 o Reference Type만 가질 수 있음 o Thread Safe 하지 않음 ArrayList가 내부적으로 Object[]으로 이루어졌던거에 비해 LinkedList는 Node로 이루어져있다. 코드..

Language/Java 2021.10.06

[Java] ArrayList 파헤쳐 보기

Java 개발에서 Collection의 데이터 타입을 사용하면서 내부 코드를 볼 생각을 하지는 않았었는데, 직접 ArrayList 클래스를 살펴보며 어떻게 동작하는지 공부해보니 흥미로운 부분이 많았다. 여기서는 ArrayList의 생성자, 삽입/삭제/초기화/정렬 메소드 중심으로 정리해보려 한다. Resizable-array implementation of the List ArrayList란 Size가 변하는 배열을 말한다. 그리고 다음과 같은 몇가지 특징을 가진다. o 중간에 데이터를 삽입, 삭제하는 것이 가능 o Reference Data Type만 넣을 수 있음 o Thread Safe 하지 않음 그럼 코드를 한 번 살펴보자. o 인스턴스 변수 : ArrayList는 값을 담고있는 Object배열과 ..

Language/Java 2021.10.06

[Java] 자바에서의 다중상속과 인터페이스의 Default Method

Java는 다중상속을 허용하지 않는다. 자바를 사용하면서 당연하게 생각하는 규칙인데, 그렇다면 그 이유가 무엇일까? 그리고 정말로 자바에서 다중상속이 불가능한지 알아보자. 다이아몬드 문제 (Diamond Problem) 다음과 같은 구조에서 다중상속을 허용한다고 가정해보자. Father, Mother 클래스는 Parent 클래스의 추상메소드 funcA() 를 각각 구현한다. Child 클래스가 Father, Mother 클래스를 둘 다 extends 한다면, Child.funcA() 는 어떤 메소드를 상속받아야할지 알 수 없다. ==> 다중상속의 모호성으로 이를 금지한다. 인터페이스를 사용한 다중상속 (Default Method) 클래스의 상속과 반대로 인터페이스는 여러 개를 implements 할 수 ..

Language/Java 2021.09.18

[Java] Wrapper Class의 생성과 Cache

Java의 데이터 타입은 크게 Primitive Type (기본형), Reference Type (참조형) 두가지가 있다. Java의 기본형 변수는 참조형으로 바꿀 수 있는데 이를 Wrapper Class라고 한다. Wrapper Class는 왜 쓰는걸까? 사실 코딩을 하면서 개발자가 직접 기본형 -> 참조형으로 변수 타입을 변경(Boxing)하는 일은 많지 않은 것 같다. JDK 1.5버전 이후부터 자동으로 변수타입을 바꾸어주기 때문인데, 내부적으로는 Wrapper Class는 몇가지 특징을 가진다. 1) 다형성 자주 쓰는 java.util.*의 Collections 함수들은 대부분 Object 타입으로 매개변수를 받고, 반환한다. 마찬가지로 Generic Type도 마찬가지다. 기본형의 변수를 Wra..

Language/Java 2021.09.13

[Spring] 템플릿/콜백 패턴 (Template/Callback Pattern)

토비의 스프링 3장: 템플릿 템플릿/콜백 패턴 (Template/Callback Pattern) 앞에서 살펴본 전략패턴(Strategy Pattern)의 기본 구조에서 익명의 내부 클래스를 활용한 방식을 스프링에서는 템플릿/콜백 패턴이라고 한다. 전략패턴과는 다르게 보통 단일 메소드 인터페이스를 사용한다. 먼저 각각의 용어들을 살펴보자. o 템플릿(Template) : 만들어져 있는 틀을 템플릿이라고 하는데, 프로그래밍에서는 고정된 틀 안에 변경되는 부분을 넣어 사용하는 것을 말한다. o 콜백(Callback) : 다른 오브젝트에서 메소드로 사용되기 위해 전달되는 오브젝트를 말한다. 자바에서는 메소드를 파라미터로 전달하는 방법이 없기 때문에 메소드를 담은 오브젝트를 전달하는 것이다. (= function..

[Spring] 전략패턴(Strategy Pattern)

토비의 스프링 3장: 템플릿 전략패턴(Strategy Pattern) 이란 분리와 재사용을 위한 디자인 패턴 간단한 예제로 숫자 5개를 입력받아 덧셈, 뺄셈 결과를 출력하는 코드이다. 빨간색 박스 부분을 제외하고는 메소드마다 동일한 코드가 반복되고 있다. 이런 메소드가 여럿 있을 때, 매번 이전 코드를 Copy&Paste하면서 변하는 부분의 코드만 수정하는 방식으로 구현한다면? 공통된 구조에 수정이 생길 경우에 메소드의 갯수만큼 코드를 수정해줘야 하는 비효율성이 발생한다. 이런 경우에 메소드에서 변하지 않는 부분(Context)과 변하는 부분(Strategy)을 분리하여 변하지 않는 부분은 재사용하고, 변하는 부분의 코드만 목적에 따라 주입시켜주는 것이 바로 전략패턴이라고 할 수 있다. 이는 일정한 구조..

[Spring] 자바 테스팅 프레임워크 JUnit (기본편)

토비의 스프링 2장: 테스트 JUnit (자바 테스팅 프레임워크) 지난 게시글에서는 JUnit 단위테스트를 왜 쓰는지, 어떻게 쓰는지에 대해서 기본 개념을 알아보았다. (이전게시글 참고: 2021.07.16 - [책책책/토비의 스프링 3.1] - [Spring] 자바 테스팅 프레임워크 JUnit (개념편)) 어플리케이션 코드 뿐만이 아니라 테스트 코드도 리팩토링이 필요한데, JUnit의 기능들을 사용하며 이전 게시글에서 작성했던 코드를 개선해보자. 1) 반복적인 코드를 제거 : @Before / @After 어노테이션을 메소드에 써주면 각각의 @Test 메소드의 테스트 전 / 후에 공통기능들을 자동으로 호출하여 수행한다. 단, 자동으로 호출되기 때문에, 서로 주고 받을 정보들은 인스턴스 변수를 이용해야 ..

[Spring] 자바 테스팅 프레임워크 JUnit (개념편)

토비의 스프링 2장: 테스트 JUnit (자바 테스팅 프레임워크) 기존 웹 프로젝트에서는 테스트를 위해서 화면에서 값 입력 -> 기능 수행 -> 결과확인을 위해 뷰, 컨트롤러, 서비스 클래스 등... 모든 레이어의 개발이 완료되어야 한다는 어려움과 에러 발생시에 위치 파악 문제점이 있었다. 이를 해결하기 위해 테스트 대상을 분리하여 단위테스트(Unit Test)를 가능하도록 하는 자바의 테스트 지원도구가 바로 JUnit이다. JUnit의 작성 조건은 다음과 같다. 1)메소드는 Public으로 선언 2)메소드에 @Test 어노테이션 또한, JUnit에서 테스트 메소드의 실행순서는 보장되지 않는다. 예로 게시판 기능(Board 추가 / 조회)의 Dao를 테스트 하는 JUnit 코드를 작성해보자. (*프로젝트..

[Spring] 스프링 XML 설정

토비의 스프링 1장: 오브젝트와 의존관계 XML 설정 스프링에서는 ApplicationContext에서 Factory 자바 클래스를 이용하는 것 외에도 다양한 방법으로 DI 의존관계 설정정보를 만들 수 있다. 가장 대표적인것이 바로 XML이다. o 장점 - 텍스트파일이라 다루기 쉬움 - 별도의 빌드 작업이 없음 - 빠르게 변경사항을 반영할 수 있음 - 스키마나 *DTD를 이용한 포맷확인이 가능 *DTD(Document Type Definition) : XML파일 내부 .. 사이에 쓰여진 부분으로 XML 데이터를 validate. 자 그럼 이전 Factory 자바 클래스의 @Configuration, @Bean으로 나타냈던 부분을 XML로 변경해보자. - @Configuration은 으로 변경된다. - @..

[Spring] 의존관계 주입 (DI: Dependency Injection)

토비의 스프링 1장: 오브젝트와 의존관계 의존관계 주입 (DI: Dependency Injection) 이전게시글에서 살펴본 Ioc방식의 동작원리를 설명하는 용어가 바로 "의존관계주입(DI)"이다. (이전 게시글 참고:2021.06.05 - [책책책/토비의 스프링 3.1] - [토비] 제어의 역전 (IoC: Inversion of Control)) 외부로부터 생성된 오브젝트의 레퍼런스를 제공(주입)받고, 이를 통해 오브젝트간 의존관계가 생성되는 것을 말한다. 이는 의존(종속) 오브젝트 주입이라고도 불리며, 스프링 프레임워크의 차별화되는 특성이다. 다음 그림을 예시로 설계 모델 관점에서 의존관계를 설명하면, Solution 오브젝트는 IfSettingMaker를 통해 ASettingMaker를 사용하기 때..