java Array vs ArrayList
- 둘 다 배열이라는 점은 동일하나, Array는 인덱스로 접근하는 반면, ArrayList는 메서드를 통해 접근합니다.(index로 접근하는 것은 동일)
- Array는 Object뿐만 아니라 원시 형태(int, double 등)도 담을 수 있지만, ArrayList는 Object형(Reference, 객체)만 담을 수 있습니다.
- 따라서 정수를 ArrayList에 넣을 경우 Integer형은 가능하지만 int형은 불가능합니다.
- 덧붙여서, Integer처럼 int오 같은 원시타입을 담을 수 있는 객체를 Wrapper Class라고 합니다.
- 결국 Array와 ArrayList의 가장 큰 차이는 길이를 조정할 수 있는가입니다.
- Array 같은 경우는 고정 길이이고, ArrayList는 가변 길이입니다.
ArrayList vs LinkedList의 차이(java)
공간적 제약
- ArrayList는 결국 배열이므로 길이가 고정되어 있습니다. 그래서 배열에 새로운 요소를 추가하려고 할 때, 배열의 용량이 이미 가득 차있다면 새로운 배열을 생성해주어야 합니다.
- 이 때, 새로 생성된 배열이 메모리 상에 연속해서 생길 수도 있지만, 이미 다른 값이 메모리를 사용하고 있는 경우, 새로운 위치에 배열이 생성되어야 하고 이는 모든 요소를 옮긴다는 얘기가 됩니다.
- 또한, 메모리에 여유공간이 없는 경우 에러가 발생할 수 도 있습니다.
- 반면, LinkedList는 한 개의 Node는 다른 Node에 대한 참조만 가지고 있습니다. 따라서 공간적 제약을 ArrayList에 비해 받지 않습니다.
| ArrayList | LinkedList |
---|
접근 | O(1) | O(n) |
추가 | O(n) | O(1) |
삭제 | O(n) | O(1) |
OOP, AOP, FP
OOP(객체지향 프로그래밍)
- 객체지향 프로그래밍은 컴퓨터 프로그래밍 패러다임(견해, 사고법)의 하나로, 프로그래밍에서 필요한 데이터를 추상화 시켜서 상태(속성)와 행위(메서드)를 가진 객체로 만들고, 그 객체 간의 상호작용을 통해 로직을 구성하는 방법
장점
- 다른 클래스를 가져와 사용할 수 있고, 상속받을 수 있어 코드의 재사용성 증가
- 절차지향보다 유지보수가 간단
- 클래스 단위로 모듈화가 가능하여, 대형 프로젝트에 적합
단점
- 처리속도가 상대적으로 느립니다.
- 객체가 많으면 용량이 커집니다.
- 설계 시 많은 노력과 시간이 필요합니다.
OOP의 6가지 키워드
- 클래스 : 현실 세계의 객체를 추상화시켜, 속성과 메서드로 정의한 것(논리적 개념)
- 인스턴스 : 클래스에서 정의한 것을 토대로 만든 실제 메모리 상에 할당된 것, 실제 데이터
- 추상화 : 객체지향 관점에서 클래스를 정의하는 것, 불필요한 정보 외에 중요한 정보만 표현함으로써 공통의 속성과 기능을 묶어 이름을 붙이는 것
- 캡슐화 : 코드를 수정없이 재활용 하는 것을 목적으로 함. 클래스라는 캡슐에 기능과 특성을 담아 목적을 기준으로 묶는다.
- 상속 : 클래스로부터 속성과 메서드를 물려받는 것을 말합니다. 다른 클래스를 가져와서 수정할 일이 있다면, 그 클래스를 직접 수정하는 대신 상속을 받아 변경하고자 하는 부분만 변경
- 다형성 : 하나의 변수명이나 함수명이 상황에 따라 다르게 해석될 수 있음. 대표적인 다형성이 오버라이딩과 오버로딩
OOP의 5가지 법칙(SOLID)
- Single Responsibility Principle(단일 책임 법칙) : 각 클래스는 목적을 하나씩만 가지고 그에 대한 책임을 져야 합니다.
- Open Close Principle(개방 폐쇠 법칙) : 각 클래스는 클래스에 대한 수정을 폐쇄하고, 확젱 대해 개방해야 합니다. 즉 클래스를 수정해야 한다면 그 클래스를 상속, 즉 확장하여 수정해야 합니다.
- Liskov Substitusion Principle(리스코프 치환 법칙) : 자식 클래스를 사용 중일때, 거기에 부모 클래스로 치환하여도 문제가 없어야 합니다.
- Interface Segreation Principle(인터페이스 분리 법칙) : 각 행위에 대한 인터페이스는 서로 분리되어야 합니다. 예를 들면, 전화를 하는데 휴대폰 카메라가 방해가 되면 안된다는 말
- Dependency Inversion Principle(의존성 역전 법칙) : 상위 클래스가 하위 클래스에 의존하면 안된다는 법칙. 즉 기본적인 공통되는 속성을 하위 클래스에 의존하면 안됩니다.
AOP(관점지향 프로그래밍)
- 스프링 프레임워크의 핵심 요소 중 하나. 비즈니스 로직과 공통 모듈로 분리하고, 핵심 로직 사이사이에 공통 모듈을 잘 끼워 넣는 것을 말함
- 이 때 공통 모듈을 코드 밖에서 설정된다는 것이 핵심. 인증, 로깅, 트랜잭션 처리에 용이
FP(함수형 프로그래밍)
- 함수형 프로그래밍은 선언현 프로그래밍으로, 어떻게가 아닌 무엇을 정의합니다.
- C, Java 등의 언어는 명령형 프로그래밍으로, 알고리즘을 기술하고 목적을 기술하지 않습니다.
- 선언형은 반대로 알고리즘은 기술하지 않고 목적 위주로 기술하며, 데이터 입력이 주어지고 데이터의 흐름을 추상적으로 정의하는 방식
- 객체지향은 동작하는 부분을 캡슐화하여 이해를 돕고, 함수형은 동작하는 부분을 최소화하여 이해를 돕습니다.
MVC
- 모델-뷰-컨트롤러의 약자로, 디자인 패턴의 하나입니다.
- 비즈니스 처리 로직과 사용자 인터페이스를 구분시켜 서로 영향없이 개발이 가능하다는 장점이 있습니다.
- 모델(Model)은 어플리케이션이 "무엇"을 할 지에 대한 정의입니다. 처리되는 데이터, 데이터베이스, 내부 알고리즘 등 내부 비즈니스에 관한 로직의 처리를 수행합니다. 즉 사용자에게 보이지 않는 로직
- 뷰(View)는 말 그대로 사용자에게 보여지는 영역입니다. JSP 등 사용자 인터페이스를 담당합니다.
- 컨트롤러(Controller)는 모델에게 "어떻게"할 것인지를 알려주며, 모델과 뷰 사이를 연결하는 역할을 합니다. 사용자의 입출력을 받아 데이터를 처리합니다.
스프링 및 웹 개발
스프링 MVC에서의 컴포넌트
- View = JSP
- Controller = Java Class
- Model = Java Bean
컨테이너
- 프레임워크 안에서 인스턴스들의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 부여합니다.
- 작성한 코드의 처리과정을 컨테이너에서 수행합니다. 스플링 컨테이너는 스프링 프레임워크 핵심에 위차하여, DI를 통해 컴포넌트들을 관리합니다.
IOC
- Inversion Of Contorl, 제어의 역행이라는 뜻으로, 인스턴스의 생성 및 소멸을 개발자 대신 스프링 컨테이너가 합니다.
- 그외 제어권을 프레임워크에서 가져간다는 말로도 쓰입니다.
DI
- Dependency Injection, 의존성 주입이라는 뜻으로, IOC를 실제로 구현하는 방법.
- 의존성이 있는 컴포넌트를 개발자가 코드로 명시하는 것이 아니라 Spring이 런타임에서 연결해 처리해줍니다.
- XML파일을 통해 설정한대로, Bean객체 생성 시 의존성 주입을 수행합니다.
웹 브라우저에서 Spring MVC로 요청했을 때의 과정
- 요청된 URL을 dispatcher-servlet에 전달
- 핸들러 매핑은 해당 URL에 매핑된 컨트롤러가 있는지 검사 후 컨트롤러에 전달
- 해당 컨트롤러가 로직을 처리
- 결과를 ModelAndView 객체 생성 후 담아 dispatcher-servlet에 전달
- dispatcher-servlet은 전달 받은 View(JSP)가 있는지 검사하기 위해 ViewResolver로 보냅니다.
- ViewResolver는 받은 View(JSP)가 있는 지 검사 후 View로 보냄
- View에서 Model과 같이 View(JSP)를 그린 후에 dispatcher-servlet으로 전달
- 최종적으로 컨텐츠를 클라이언트에게 전달
Bean 객체
- 자바에서의 POJO(Plain Old Java Object)로, XML 설정파일을 통한 생명주기, 종속성 등의 메타데이터를 가지고 스프링 컨테이너에서 생성된 객체입니다.
- 컨테이너에서 생성되었다는 점을 제외하면 일반 자바객체와 같습니다.
DTO, DAO, VO
- VO : Value Object의 줄임말로, 값을 갖고있는 객체입니다. 비즈니스 값을 가져올 때 사용하며, 보통 값을 수정할 수 없는 것으로 합니다. DTO와 혼용해서 쓰기도 합니다.
- DTO : Data Transfer Object의 줄임말로, VO와 같이 값을 갖고 있는 객체입니다. VO와의 차이점은 DB로 치자면 하나의 인스턴스로, 데이터 핸들링 사용되는 객체입니다. DTO를 통해 데이터를 전달할 수 있습니다.
- DAO : Data Access Object의 줄임말로, 실제 DB에 접속하는 객체입니다. Service의 DB사이에서 가져온 데이터를 엔티티로 변환시켜 가져옵니다. 대부분 CRUD API를 제공합니다.