JAVA, JSP 면접질문 정리
JAVA 장점, 단점
1. JVM에서 동작하기 때문에, 운영체제가 독립적이다.
2. 자동으로 메모리 관리를 해준다.
#JVM(Java Virtual Machine)
- 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행한다.
- 메모리관리, Garbage Collection
- 스택기반의 가상머신이다.
- 왜 JVM을 알아야 하는가?
* 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해
자바프로그램 실행과정
1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램에 필요로 하는 메모리를 할당 받는다.
JVM은 이 메로리를 용도에 따라 여러 영역으로 나누어 관리한다.
2. 자바컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.
3. Class Loader를 통해 class파일들을 JVM으로 로딩한다.
4. 로딩된 class 파일들은 Execution engine을 통해 해석된다.
5. 해석된 바이트코드는 Runtime Data Areas 에 배치되어 실질적인 수행을 하게 된다.
이러한 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization 과 GC 같은 관리작업을 한다.
JVM의 구성
Class Loader(클래스 로더) - class로드 및 배치
Execution engine(실행 엔진) - class 실행
Interpreter(인터프리터) - 한줄씩 내려가면서 실행
JIT(Just - In - Time) - 적절한 시점에 네이티브코드로 변환
#Garbage Collector
stop-the-world는 GC를 실행하기위해 JVM이 애플리케이션을 멈추는 것이다.
stop-the-wolrd가 발생하면 GC는 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다.
GC 작업이 완료되면 중단했던 작업을 다시 시작한다.
java에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에 가바지 콜렉터가
더이상 필요없는 객체(쓰레기)를 찾아 지우는 작업을 한다.
3. 객체지향 언어이다.
절차지향
장점 - 처리속도가 빠르다.
단점 - 유지보수가 어렵다.
객체지향
장점 - 코드 재사용성 / 유지보수가 쉽다 / 대규모 프로젝트 적합
단점 - 처리 속도가 느리다 / 객체에 따른 용량 증가
객체지향의 특징 4가지(추상화, 캡슐화, 상속, 다형성)
1. 추상화(Absctraction)
객체에서 공통된 속성과 행위를 추출하는 것을 의미한다.
- 다른 객체들과 구분되는 핵심적인 부분에 집중하여, 복잡도를 관리할 수 있게 된다.
2. 캡슐화(Encapsulation)
연관있는 변수와 메소드를 묶어주는 작업을 말한다.
- 접근제어자[public, private, protected, default]를 통해 외부로부터 접근을 제한하여
객체내에서만 접근이 가능하도록 해준다.
public - 접근 제한이 없다.(같은 프로젝트 내에 어디서든 사용가능)
protected - 같은 패키지 내, 다른 패키지에서 상속받아 자손클래스에서 접근 가능
default - 같은 패키지 내에서만 접근 가능
private - 같은 클래스 내에서만 접근 가능
public | ○ | ○ | ○ | ○ |
protected | ○ | ○ | ○ | X |
default | ○ | ○ | X | X |
private | ○ | X | X | X |
3. 상속(Inheritance)
클래스개념이 도입되면서 상속을 통해 부모클래스의 속성과 기능을 이어받아 사용하는 것을 말한다.
- 프로그램을 개발하다보면 중복되는 속성과 기능을 개발해야되는 일이 발생하는데 상속을 사용한다면 중복되는 기능을
반복하여 사용하지 않고 작업할 수 있게 해준다.
4. 다형성(Polymorphism)
프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 동일한 변수, 함수명 등이 다양한 방법으로
기능하는것을 말한다.
오버라이딩 - 두 메서드가 같은 이름을 갖고 있으나 인자의 수나 자료형이 다른 경우
오버로딩 - 상위 클래스가 가지고 있는 메서드를 하위 클래스에서 재정의
오버로딩(Overloading)과 오버라이딩(Overriding) 성립조건
메서드 이름 | 동일 | 동일 |
매개변수, 타입 | 다름 | 동일 |
리턴 타입 | 상관없음 | 동일 |
3. 오픈소스이다.
4. 멀티스레드를 쉽게 구현할 수 있다.
프로세스 - 실행 중인 하나의 프로그램
멀티프로세스 - 독립적으로 프로그램을 실행하고 여러가지 작업 처리
멀티 스레드 - 한 개의 프로그램을 실행하고 내부적으로 여러가지 작업 처리
메인 스레드
- 모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하면서 시작된다.
- main() 메소드의 첫 코드부터 아래로 순차적으로 실행한다.
- main() 메소드의 마지막 코드를 실행하거나, return 문을 만나면 실행이 종료된다.
- main 스레드(JVM이 생성)는 작업 스레드를 만들어서 병렬로 코드를 실행할 수 있다.
즉 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.
프로세스의 종료
- 싱글 스레드 : 메인 스레드가 종료하면 프로세스도 종료된다.
- 멀티 스레드 : 실행 중인 스레드가 하나라도 있다면, 프로세스는 종료되지 않는다.
5. 동적로딩(Dynamic Loading)을 지원한다.
애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 각 객체가 필요한 시점에 클래스를 동적 로딩해서 생성한다.
또한 유지보수 시 해당 클래스만 수정하면 되기 때문에 전체 애플리케이션을 다시 컴파일할 필요가 없다.
따라서 유지보수가 쉽고 빠르다.
자바 프로그램은 한 개 혹은 그 이상의 클래스들의 조합으로 실행된다.
그리고 실행 시 모든 클래스 파일드이 한 번에 JVM 메모리에 로딩되지 않고 요청되는 순간 로딩된다.
자바의 클래스 로더가 이런 역할을 수행한다.
클래스 로더란 '.class' 바이트 코드를 읽어 들여 class 객체를 생성하는 역할을 담당한다.
즉, 클래스 로더는 클래스가 요청될 때 파일로부터 읽어 메모리로 로딩하는 역할을 하며
자바 가상 머신의 중요한 요소 중 하나다.
※ 클래스 로더가 classpath라는 환경 변수에 등록된 디렉토리에 있는 모든 클래스들을 먼저 JVM에 로딩한다.
JVM에 로딩된 클래스만이 JVM에서 객체로 사용할 수 있다.
클래스 로딩은 클래스를 로딩하는 시점 또는 실행 중간에도 할 수 있다.
자바의 클래스 로딩은 세부적으로 로딩, 링크, 초기화라는 세 단계 과정을 거친다.
- 로딩 : 클래스 파일을 바이트 코드로 읽어 메모리로 가져오는 과정
- 링크 : 가장 복잡한 과정으로, 읽어본 바이트 코드가 자바 규칙을 따르는지 검증하고,
클래스에 정의된 필드, 메소드, 인터페이스들을 나타내는 데이터 구조를 준비하며, 그 클래스가 참조하는
다른 클래스를 로딩한다.
- 초기화 : 슈퍼 클래스 및 정적 필드를 초기화한다.
단 점
- 속도가 느리다.
- 예외처리가 불편하다.
java의 final 키워드
final 키워드
개념: 변수나 메서드 또는 클래스가 ‘변경 불가능’하도록 만든다.
- 원시(Primitive) 변수에 적용 시
해당 변수의 값은 변경이 불가능하다.
- 참조(Reference) 변수에 적용 시
참조 변수가 힙(heap) 내의 다른 객체를 가리키도록 변경할 수 없다.
- 메서드에 적용 시
해당 메서드를 오버라이드할 수 없다.
- 클래스에 적용 시
해당 클래스의 하위 클래스를 정의할 수 없다.
java의 제네릭(Generic)
모든 종류의 타입을 다룰 수 있도록 일반화된 타입 매개 변수(generic type)로 클래스나 메서드를 선언하는 기법
- 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법 / 컴파일 단계에서 타입체크
클래스, 객체, 인스턴스의 차이
클래스(class)
- 객체를 만들어내기 위한 설계도 혹은 틀
- 연관되어 있는 변수와 메서드의 집합
객체(Object)
- 구현할 대상
- 클래스의 인스턴스
인스턴스(Instance)
- 구현된 구체적인 실체
인터페이스와 추상 클래스의 차이
추상 메서드 - abstract 키워드와 함께 선언만되고, 코드가 작성되지 않은 메서드
추상 클래스 - abstract 키워드로 선언된 클래스
- 추상 메서드를 한 개 이상 포함하고 있는 경우 abstract 클래스로 선언한다.
- 추상 메서드를 갖고 있지 않아도 추상 클래스로 선언 할 수 있다.
추상클래스의 목적
- 상속을 위한 부모 클래스로 활용하기 위한 것
- 여러 클래스의 공통된 부분을 추상화(추상 메서드)하여 상속받는 클래스에게 구현을 강제화
- 자식 클래스가 구체화하여 그 기능을 확장하는데 목적
인터페이스 - 추상메서드와 함수만을 포함하여, interface 키워드를 사용하여 선언한다.
인터페이스 구현
- implements 키워드를 사용하여 구현한다.
인터페이스의 목적
- 상속받을 서브 클래스에게 구현할 메서드의 원형을 모두 알려주어, 클래스가 자신의 목적에 맞게
메서드를 구현하도록 하는 것
- 구현 객체의 같은 동작을 보장하기 위해
추상클래스와 인터페이스의 공통점
- 인스턴스(객체)는 생성할 수 없다.
- 선언만 있고 구현 내용이 없다.
- 자식 클래스가 메서드의 구체적인 동작을 구현하도록 책임을 위임한다.
추상클래스와 인터페이스의 차이점
- 서로 다른 목적을 가지고 있다.
추상클래스 - 추상메서드를 자식 클래스가 구체화하여 그 기능을 확장
인터페이스 - 서로 관련없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 때
- 추상클래스는 클래스지만 인터페이스는 클래스가 아니다.
- 추상클래스는 단일상속이지만 인터페이스는 다중상속이다.
Java Collections Framework
Collection
- List
순서가 있는 데이터
데이터를 중복하여 포함할 수 있다.
- ArrayList
단방향 포인터로 각 데이터에 대한 인덱스를 가지고 있으며, 데이터 검색에 적합하다.
삽입, 삭제가 빈번한 데이터에 부적합
- LinkedList
양방향 포인터로 삽입 삭제가 빈번한 데이터에 적합
데이터 검색 시 처음부터 노드를 순회하므로 검색에는 부적합
스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰인다.
- Set
집합적인 개념의 데이터
순서의 의미가 없다.
데이터를 중복하여 포함할 수 없다.
- HashSet
저장순서를 유지하지않는 데이터
검색속도가 매우 빠르다
- LinkedHashSet
저장순서를 유지하는 HashSet
- Map
key와 value로 저장된 데이터 / null값 허용
String, StringBuilder, StringBuffer
String : 문자열 연산이 적고 멀티쓰레드 환경일 경우
StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경일 경우(동기 처리)
StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우(비동기 처리)
Java Reflection(리플렉션) - 이해도 부족
리플렉션이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법을 말한다
== 과 equals의 공통점과 차이점
기본적으로 이 둘은 모두 양 쪽에 내용을 비교하는 값을 boolean type으로 반환한다.
차이점
- 형태의 차이
equls()는 메서드이다. 객체끼리 비교 가능
==는 연산자이다.
- 주소값 비교와 내용 비교
equals는 비교하고자 하는 대상의 내용 자체를 비교 Call by Value
== 는 비교하고자 하는 대상의 주소값을 비교한다. Call by Reference
Servlet, JSP
Servlet - Container가 이해할 수 있게 구성된 순수 자바 코드로만 이루어진 것(Html in JAVA)
JSP(Java Server Page) - html기반에 JAVA코드를 블록화하여 삽입한 것(JAVA in Html)
Get, Post
Get 방식
- 클라이언트에서 서버로 데이터를 전달할 때, 주소 뒤에 "이름"과 "값"이 결합된 스트링 형태로 전달
- 주소창에 쿼리 스트링이 그대로 보여지기 때문에 보안성이 떨어진다.
- 길이에 제한이 있다.(=전송 데이터의 한계가 있다.)
- Post방식보다 상대적으로 전송 속도가 빠르다.
Post 방식
- 일정 크기 이상의 데이터를 보내야 할 때 사용한다.
- 서버로 보내기 전에 인코딩하고, 전송 후 서버에서는 다시 디코딩 작업을 한다.
- 주소창에 전송하는 데이터의 정보가 노출되지 않아 Get방식에 비해 보안성이 높다.
- 속도가 Get방식보다 느리다.
- 쿼리스트링(문자열) 데이터 뿐만 아니라, 라디오 버튼, 텍스트 박스 같은 객체들의 값도 전송가능.
Get과 Post 차이점
- Get은 주로 웹 브라우저가 웹 서버에 데이터를 요청할 때 사용
- Post는 웹 브라우저가 웹 서버에 데이터를 전달하기 위해 사용.
- Get을 사용하면 웹 브라우저에서 웹 서버로 전달되는 데이터가 인코딩되어 URL에 붙는다.
- Post방식은 전달되는 데이터가 보이지 않는다.
- Get방식은 전달되는 데이터가 255개의 문자를 초과하면 문제가 발생할 수 있다.
- 웹서버에 많은 데이터를 전달하기 위해서는 Post 방식을 사용하는 것이 바람직하다.
Session과 Cookie
Session과 Cookie 사용 이유
- 현재 우리가 인터넷에서 사용하고 있는 HTTP프로토콜은 연결 지향적인 성격을 버렸기 때문에 새로운 페이지를 요청할 때마다
새로운 접속이 이루어지며 이전 페이지와 현재 페이지 간의 관계가 지속되지 않는다. 이에 따라 HTTP프로토콜을 이용하게 되는
웹사이트에서는 웹페이지에 특정 방문자가 머무르고 있는 동안에 그 방문자의 상태를 지속시키기 위해 쿠키와 세션을 이용한다.
Session
- 특정 웹사이트에서 사용자가 머무르는 기간 또는 한 명의 사용자의 한번의 방문을 의미한다.
- Session에 관련된 데이터는 Server에 저장된다.
- 웹 브라우저의 캐시에 저장되어 브라우저가 닫히거나 서버에서 삭제시 사라진다.
- Cookie에 비해 보안성이 좋다.
Cookie
- 사용자 정보를 유지할 수 없다는 HTTP의 한계를 극복할 수 있는 방법
- 인터넷 웹 사이트의 방문 기록을 남겨 사용자와 웹 사이트 사이를 매개해 주는 정보이다.
- Cookie는 인터넷 사용자가 특정 웹서버에 접속할 때, 생성되는 개인 아이디와 비밀번호, 방문한 사이트의 정보를 담은 임시 파일로써,
Server가 아닌 Client에 텍스트 파일로 저장되어 다음에 해당 웹서버를 찾을 경우 웹서버에서는 그가 누구인지 어떤 정보를 주로 찾았는지 등을 파악할 때 사용된다.
- Cookie는 Client PC에 저장되는 정보기 때문에, 다른 사용자에 의해서 임의로 변경이 가능하다.(정보 유출 가능, Session보다 보안성이 낮은 이유)
Q. 보안성이 낮은 Cookie 대신 Session을 사용하면 되는데 안하는 이유?
A. 모든 정보를 Session에 저장하면 Server의 메모리를 과도하게 사용하게 되어 Server에 무리가 감
MVC 패턴
MVC란?
- 객체지향프로그래밍에서, MVC란 사용자 인터페이스를 성공적이며 효과적으로 데이터 모형에 관련 시키기 위한 방법론 또는 설계 방식중 하나이다. MVC방식은 자바, Smalltalk,
- MVC 패턴은 목적 코드의 재사용에 유용한 것은 물론, 사용자 인터페이스와 응용프로그램 개발에 소요되는 시간을 현저하게 줄여주는 형식이라고 많은 개발자들이 평가하고 있다.
MVC 구성요소
Model - 소프트웨어 응용과 그와 관련된 고급 클래스 내의 논리적 데이터 기반 구조를 표현. 이 목적 모형은 사용자 인터페이스에 관한 어떠한 정보도 가지고 있지 않다.
View - 사용자 인터페이스 내의 구성요소들을 표현(사용자에게 보여지는 화면)
Controller - Model과 View를 연결하고 있는 클래스를 대표, Model과 View 내의 클래스들 간 정보 교환하는데 사용.
Static의 의미
- 클래스가 로딩될 때, 메모리 공간을 할당하는데 처음 설정된 메모리 공간이 변하지 않음을 의미
- 객체를 아무리 많이 만들어도 해당 변수는 하나만 존재(객체와 무관한 키워드)
Wrapper Class
Primitive type으로 표현할 수 있는 간단한 데이터를 객체로 만들어야 할 경우가 있는데 그러한 기능을 지원하는 클래스
Spring Framework(스프링 프레임워크)
자바(JAVA) 플랫폼을 위한 오픈소스(Open Source) 애플리케이션 프레임워크(Framework)
자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크
자바 개발을 위한 프레임워크로 종속 객체를 생성해주고, 조립해주는 도구
자바로 된 프레임워크로 자바SE로 된 자바 객체(POJO)를 자바EE에 의존적이지 않게 연결해주는 역할
스프링 특징 간단히
- 크기와 부하의 측면에서 경량.
- 제어 역행(IoC)이라는 기술을 통해 애플리케이션의 느슨한 결합을 도모
- 관점지향 프로그래밍(AOP)을 위한 풍부한 지원
- 애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 컨테이너(Container)라고 할 수 있음
- 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 수 있음
스프링 특징 자세히
a. 경량 컨테이너로서 자바 객체를 직접 관리.
각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
b. 스프링은 POJO(Plain Old Java Object) 방식의 프레임워크.
일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에
존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.
c. 스프링은 제어의 역행(IoC : Inversion of Control)을 지원.
컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
d. 스프링은 의존성 주입(DI : Dependency Injection)을 지원
각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
e. 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원
따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
f. 스프링은 영속성과 관련된 다양한 서비스를 지원
iBatis나 Hibernate 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
g. 스프링은 확장성이 높음.
스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가
이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.
Stack, Queue
STACK
- LIFO(Last In First Out)의 후입선출 구조
- push();를 이용한 데이터 입력, pop();을 이용한 데이터 출력
- 예) 시스템 스택 : 함수의 호출과 복귀 순서는 스택의 구조를 응용하여 관리
- 역순 문자열 만들기, 수식의 괄호 검사, 수식의 후위 표기법 변환
QUEUE
- FIFO(First In First Out)의 선입선출 구조
- enQueue();를 이용한 데이터 입력, deQueue();를 이용한 데이터 출력
- 예) 우선순위가 같은 작업 예약(인쇄 대기열), 선입선출이 필요한 대기열(티켓 카운터)
* Linear Queue(선형큐)는 메모리 재사용이 불가능 이러한 문제점을 보완하여 Circular Queue(원형 큐)가 나옴