SlideShare a Scribd company logo
1 of 41
JAVA
신입면접 준비
객체지향과 절차지향
절차지향 프로그래밍이란 위에서 아래로 순차적인 처리가 실행되며
데이터를 처리하는 방법을 중요시하여 함수 단위로 프로그래밍 기법
으로 대표적인 절차지향언어로 C언어가 있다.
객체지향 프로그래밍이란 컴퓨터 프로그램을 명령어의 목록(함수)으
로 보는 시각에서 벗어나 독립된 단위인 객체들의 모임으로 파악하고
자 하는 것이다. 대표적인 객체지향언어로 JAVA가 있다.
절차지향 프로그래밍은 순서대로 진행하다가 함수(모듈, 프로시저)를 만나면 그 것을 타고 들
어가서 진행되는 식이다. 절차적 프로그래밍의 단점은 개발이 오래 걸리고 한번 사용한 코드를
다시 재사용하기 어렵다. 이를 해결하기 위한 하나의 방법이 객체지향 프로그래밍이다.
객체지향의 4대 특징 : 캡슐화, 상속, 추상화, 다형성
객체지향의 5대 원칙 : SOLID
SoC (Separation Of Concerns) : 관심사의 분리
관심사가 같은 것은 하나의 객체로, 관심사가 다른 것은 서로 영향을 주지 않도록 분리
하나의 속성, 하나의 클래스, 하나의 패키지 안에는 하나의 관심사만 들어있어야 한다는 것
객체(object)란 무엇인가?
객체지향이란 실 세계를 직접적이고 직관적으로 모델링 할 수 있는 패러다임이다.
객체지향 프로그래밍이란 현실 속에 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부
로 옮겨오는 작업이기 때문에 그 결과물인 객체지향 소프트웨어는 실 세계의 투영이며, 객체란
현실 세계에 존재하는 사물에 대한 추상화이다.
객체(object)는 객체지향기술(oriented-object)을 이해하기 위한
핵심개념으로 세상에 존재하는 모든 사물이다.
각각의 사물은 고유하고 상태(state)과 행위(Behavior)를 가지고
있다.
객체와 클래스, 인스턴스
객체와 클래스의 개념 => 클래스 : 객체 = 펭귄 : 뽀로로 , 사람 : 김연아, 쥐 : 미키마우스
객체는 유일무이(unique)한 사물이고,
클래스는 같은 속성과 기능을 지닌 여러 객체들을 총칭하는 집합의
개념이다. 이를 설명하는 메타포로 클래스를 객체의 설계도라고 한다.
인스턴스(instance)는 어떤 집합에 대해서 그 집합의 개별적인 요소
로 객체(object)는 클래스의 인스턴스 이다.
객체지향의 5대원칙
• 단일 책임 원칙, SRP ( Single Responsibility Principle)
어떤 클래스를 변경해야 하는 이유는 오직 하나 뿐 이여야 한다. (관심사의 분리)
• 개방 폐쇄 원칙, OCP (Open Close Principle)
자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀있어야 한다. Ex)JDBC
• 리스코프 치환 원칙, LSP (Liskov Substitution Principle)
서브타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다. (부모와 자식간 행위 일
관)
• 인터페이스 분리 원칙, ISP (Interface Segregation Principle)
클라이언트는 자신이 사용하지 않는 메소드에 의존관계를 맺으면 안 된다.
• 의존 역전 원칙, DIP (Dependency Inversion Principle)
자신보다 변하기 쉬운 것에 의존하지 마라
ISP와 SRP는 같은 문제에 대한 두 가지 다른 해결책
SRP는 은행에서의 고객과 병원에서의 고객을 각각 고객이라는 상위 객체를 두고 나눈다면
ISP는 병원에서의 고객과 은행에서의 고객을 interface 로 분할하여 나누고 자식으로 고객
객체에서 각각의 interface 확장하여 사용
SOLID : 논리를 더욱 잘 분할하고, 잘 표한하기에 이해하기 쉽고, 개발하기 쉽고, 유지보수하기 쉬워진다.
객체지향의 4대 특성
• 캡슐화 : 정보은닉
객체의 속성과 행위를 하나로 묶어 실제 구현 내용은 감추어 은닉한다. (접근제어자 사용)
• 상속 : 재사용 + 확장
객체지향에서 상속은 상위 클래스의 특성을 하위클래스에서 상속하고 거기에 필요한 특성을
추가하여 확장해서 사용할 수 있다는 의미이다. (하위 클래스 is a kind of 상위 클래스)
• 추상화 : 모델링
추상화란 구체적인 것을 분해해서 관심영역에 있는 특성만을 개지고 재조합 하는 것 (= 모델
링)
• 다형성 : 사용 편이성
상속관계일 때 한가지 타입의 참조변수로 여러가지 타입의 객체를 참조 할 수 있다. 또한,
다형성의 대표적인 예로는 오버라이딩과 오버로딩이 있다.
캡슐화, 상속, 추상화, 다형성
캡슐화와 은닉화의 차이점
캡슐화는 캡슐 알약을 생각하자.
약을 복용 시 약의 내용물은 확인하지 않고 껍데기만 확인하듯이 마찬가지로 클래스가 제공하
는 메소드의 기능만을 사용할 뿐 실제 그 메소드가 어떻게 움직이는지는 알 필요 없다.
은닉화는 속성에 직접 접근하는 것은 데이터 무결성에 치명적일 수 있어서 속성들을 접근제어
자인 private로 감춰두고 getter, setter 메서드를 통해서만 접근 가능하게 하는 것이다.
캡슐화는 클래스가 제공하는 메소드의 기능만을 사용할 뿐 실제 그
메소드가 어떻게 동작하는지는 보여주지 않고 감추는 것이고
은닉화는 클래스의 속성들을 private로 만들어 클래스 밖에서 접근
할 수 없도록 하는 것을 의미한다.
오버라이딩과 오버로딩
간단하게 두 정수를 더해서 반환하는 함수가 add(int, int) 형식일 때 오버로딩이 지원되지
않는 언어에서는 이미 add라는 함수 명을 사용했기에 이름이 다른 addDouble(double, double)
형식으로 함수 명을 만들어야 한다.
자바에서 정수 자료 형으로는 byte, short, int ,long, char 이 있고, 부동 소수점 자료 형으
로는 float, double 이 있다. 인자가 중복되는 함수를 제외해도 여러 개의 함수 명을 작성해
야만 두 수를 모두 더하는 경우를 만족시킬 수 있다.
오버라이딩은 같은 메서드 이름, 같은 인자목록으로 상위 클래스의
메서드를 재정의
오버로딩은 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를
중복 정의
자바의 데이터 타입 (기본, 참조)
기본 데이터 형의 종류 : boolean, char, byte, short, int, long, float, double (8개)
레퍼런스 타입(reference type) : 프리미티브 타입(primitive type) = 참조 자료형 : 기본자료형
기본 데이터 형은 나타내고자 하는 기본 데이터 형의 값을 가지고 있고
참조 데이터 형은 배열, 클래스, 인터페이스 등 으로 값이 아닌 그에
대한 참조주소를 가지고 있다.
접근제어자
a.Jar 파일 안에 one 패키지가 있고, b.jar 파일 안에 같은 이름을 가진 one패키지가 있다면
b.jar 파일 내부의 one패키지 내 클래스나 객체에서 a.jar 파일 내부의 one 패키지 내의
public 멤버뿐 아니라 default 멤버와 protected 멤버를 자유자재로 접근할 수 있다.
상속을 받지 않았다면 객체 멤버는 객체를 생성한 후 객체 참조 변소를 이용해 접근해야 한다.
정적 멤버는 클래스명, 정적멤버 형식으로 접근하는 것을 권장한다.
Public : 모두가 접근 가능
Protected : 상속/ 같은 패키지 내의 클래스에서 접근 가능
[default] : 같은 패키지 내의 클래스에서 접근 가능
Private : 본인만 접근 가능
Call by Value, Call by Reference
기본 자료형 변수는 저장하고 있는 값을 그 값 자체로 해석하는 반면, 객체 참조 변수는 저장
하고 있는 값을 주소로 해석한다는 차이가 있다.
기본 자료형 변수를 복사할 때, 참조 자료형 변수를 복사할 때 일어나는 일은 동일하다. 가지
고 있는 값을 그대로 복사해서 넘겨준다.
Call by Value (값에 의한 호출) – 기본 자료형
Call by Reference (참조 값에 의한 호출) – 객체 참조
정적 바인딩, 동적 바인딩
# 바인딩(Binding)
변수에 변수와 관련된 속성을 연관시키는 것
각종 값들이 확정되어 구속(bind) 상태가 되는 것
함수를 호출하는 부분에서 함수가 위치한 메모리 번지를 연결시켜 주는 것
ex) 변수의 데이터 타입이 무엇인지 결정
정적 바인딩(Compile-time Binding, Early Binding)은 컴파일러 시간에 변수의 크기를 정할 수
있는 것을 의미한다.
Char, short, int, float, double과 같은 기본 자료형
동적 바인딩(Run-time Binding, Late Binding)이란 프로그램이 실행되어야 메모리에 크기가 얼
마만큼 할당되는지 알 수 있는 것을 의미 (heap 영역에 저장되는 대부분의 것들)
정적 바인딩 : 타입을 컴파일 하는 시간에 결정
동적 바인딩 : 타입을 런타임 하는 시간에 결정
Abstract class 와 Interface
추상 클래스는 인스턴스, 즉 객체를 만들 수 없다.
추상 메서드는 하위클래스에게 메서드의 구현을 강제한다. (오버라이딩 강제)
추상 메서드를 포함(extends)하는 클래스는 반드시 추상 클래스여야 한다.
인터페이스는 추상 메서드와 정적 상수만을 가질 수 있기에 따로 public, static, final 을 자동
으로 자바가 붙여준다.
Interface 와 abstract class의 가장 큰 차이점은 클래스인지 아닌 지다.
다중상속을 지원하지 않는 자바는 하위클래스에서 추상 클래스는 하나만 포함(extends)할 수 있지
만 interface는 여러 구현(implements)할 수 있다.
인터페이스는 be able to (무엇을 할 수 있는), 추상클래스는 is a kind of (한 분류)
Abstract class (추상 클래스)
한 개 이상의 추상 메소드를 가지고 있는 클래스.
Interface
추상 메소드와 정적 상수로 이루어져있고 이를 구현하는 자식 클래스
로 하여금 모든 메소드의 구현을 강제한다.
Abstract class 와 Interface
Interface는 호환성을 위한 규약만을 정해놓은 것이고 구현은 클래스를 만드는 사람이 알아서 하는 것
Abstract class는 호환성을 위한 규약도 정해놓고 미리 구현해서 상속될 메소드도 구현해 놓은 것
자동차 만드는 것을 예로 들자면,
자동차 interface라는 것은 그냥 규약일 뿐이라서 자동차 엔진 메소드, 브레이크 메소드, 핸들 메소드의 규약만 선언해 놓은 것
이렇게 규약 interface를 사용하는 이유는 그 규약대로 만들어진 자동차들이 서로 호환이 된다는 장점이 가장 크다
상속이라는 것은 아주 기본적인 자동차만 미리 만들어 놓고 (부모 클래스)
그것을 가져다가 (상속) 자기 입맛대로 페인트도 칠하고 오디오도 달고 하는 것(override)
부모클래스 자동차는 오디오도 없고 페인트도 칠해져 있지 않지만 자동차(instance 객체생성 가능)
Abstract 자동차는 필수 부품 메소드를 만들지 않고 비워둔 것
사용자마다 엔진 취향이 너무 달라서 무조건 엔진을 새로 장착한다면, 기본 자동차에 엔진 메소드를 미리 구현할 필요는 없게 된
다. 하지만 엔진을 장착 할 수 있는 공간(규격)은 정해 놓아야 하고, 그 공간은 비워놓기만 한다.(abstract method)
이 경우 abstract 자동차를 상속한 경우에는 필수 부품 메소드(abstract method)는 반드시 구현해야한다.
공통으로 사용될 부분을 비워둔 상태로 규약을 정해놓은 것이 인터페이스라면, 각 구현체에서 다르게 사용될 공통부분은 비워둔
상태로 규약만 정해놓고, 동일하게 구현해야 할 부분은 구현하여 부모 클래스로 사용하는 게 추상클래스
Static
Static은 프로그램 안에서 단 하나만 존재하며 사용하지 않더라도 생성이 되는 정적인 존재이다.
프로그램 실행시 정적으로 생성되므로 자주 사용하지 않는 경우에는 메모리를 잡아먹을 수 있다.
# Static 변수
각 인스턴스 들이 공통으로 값을 유지해야 하는 경우 static을 붙인다.
변수는 클래스가 메모리에 올라갈 때 자동으로 생성되고 메모리에 올라간 후 JVM이 종료될떄까
지 고정된(static)상태로 그 자리를 지킨다.
# Static 블록
클래스가 처음 로딩될 때 한번만 수행된다.
멤버변수 (메소드 밖에 선언된 변수)
클래스변수, 전역변수, static 멤버  지역변수, 인스턴스 변수, 객체 멤버
대부분의 경우 변수와 메소드에 사용되는 키워드로 사용. (공용자원)
클래스의 변수나 메소드는 해당 클래스가 인스턴스 화 되기 전에는 사
용할 수 없는데, static으로 선언된 변수나 메소드는 해당 클래스의
인스턴스 여부와 상관없이 바로 접근 가능하고, 사용이 가능하다.
final
# final + 변수
Final이 붙은 변수는 단 한번 초기화를 할 수 있으며 할당된 주소 값이 고정되기 때문에 이후에
값 변경이 불가능하다. (ex math클래스의 PI)
# final + 메소드
상속받은 하위 클래스에서 해당 메소드를 오버라이딩 할 수 없다.
# final + 클래스
해당 클래스의 상속을 허락하지 않는다.
마지막, 최종이라는 의미를 가진 키워드로 클래스, 변수, 메소드와
함께 사용되며 재정의를 막기 위해 사용된다.
this
지역변수와 속성(객체변수, 정적변수)의 이름이 같은 경우 지역변수가 우선한다.
객체변수와 이름이 같은 지역변수가 있는 경우 객체 변수를 사용하려면 this를 접두사로 사용한
다.
정적 변수와 이름이 같은 지역변수가 있는 경우 정적 변수를 사용하면 클래스 명을 접두사로 사
용한다.
This는 객체가 자기자신을 지칭할 때 쓰는 키워드로 객체의 멤버 메
서드 내부에서 객체 자신을 지칭.
Super
Super 키워드로 바로 위의 상위 클래스 인스턴스는 접근 할 수 있지만, super.super 형태로 상
위의 상의의 클래스의 인스턴스에는 접근이 불가능 하다.
This가 객체 멤버 메서드 내부에서 객체 자신을 지칭하는 키워드라
면 super는 바로 위 상위 클래스의 인스턴스를 지칭하는 키워드이다.
String, StringBuilder, StringBuffer
String 은 한 번 생성이 되면 할당된 메모리 공간이 변하지 않는다.
Concat메서드 등을 통해 문자열을 붙이는 방법은 새로운 문자열이 붙는 것이 아니라 새로운
String객체로 만든 후 그 객체를 참조하도록 한다.
StringBuilder와 StringBuffer는 문자열 연산 등으로 기존 객체에 공간이 부족하게 되는 경
우, 기존의 버퍼 크기를 늘리며 유연하게 동작한다.
연산이 많은 경우 속도
StringBuilder > StringBuffer >> String
모두 문자열을 저장하고 관리하는 클래스이다.
String은 불변객체이며 StringBuilder, StringBuffer은 가변객체
로 차이점은 동기화 지원여부이다.
StringBuilder는 동기화를 지원하지 않고 StringBuffer는 동기화
를 지원(Thread-safe)한다.
Thread와 Process
프로세스는 자신만의 고유공간과 자원을 할당 받아 사용하는데 비해 스레드는 다른 스레드와
공간과 자원을 공유하여 사용한다.
기본적으로 하나의 프로세스가 생성되면 하나의 스레드가 같이 생성된다. 이를 메인 스레드라
고 부르며, 스레드를 추가로 생성하지 않는 한 모든 프로그램 코드는 메인 스레드에서 실행된
다. 또한 프로세스는 여러 개의 스레드를 가질 수 있으며 이를 멀티 스레드라고 한다.
# 스레드의 장점
시스템의 자원소모가 줄어든다.
프로그램의 응답시간이 단축된다.
프로세스 간 통신방법에 비해 스레드간의 통신방법이 훨씬 간단하다.
시스템의 스루풋(throughput) 이 향상된다. (스루풋 : 주어진 시간 동안 컴퓨터가 할 수 있는 일의 양)
# 스레드의 단점
프로그램 디버깅이 어렵다.
여러 개의 스레드를 이용하는 프로그램을 작성하는 경우에는 미묘한 시간차나 잘못된 변수를 공유함으로써 오류가 발생할 수 있다.
프로세스는 프로그램에 대한 각각의 인스턴스를 의미한다.프로세스는
운영체제로부터 주소공간, 파일, 메모리 등을 할당 받는다.
스레드란 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로
세스 내의 주소 공간이나 자원들을 대부분 공유하면서 실행된다.
객체 직렬화(Serialization)와 역직렬화(Deserialisation)
직렬화란 객체를 직렬화하여 전송 가능한 형태로 만드는 것을 의미한다.
주로 객체들을 통째로 파일로 저장하거나 전송하고 싶을 때 사용된다.
역 직렬화는 직렬화된 파일 등을 역으로 직렬화하여 다시 객체의 형태를
만드는 것을 의미한다.
자바 프로그램에서 입출력 데이터는 데이터 스트림 형태로 주고받는다.
파일에 저장하거나 네트워크를 통해 데이터를 전송할 때도 스트림 형태로 전송한다. 그렇기 때문에 객체를
파일에 저장하거나 네트워크로 전송하기 위해서는 객체를 스트림으로 만드는 작업이 필요한데 이것이 직렬
화이다.
프로그램에 입력된 스트림으로부터 다시 객체를 만들어 내는 작업을 역직렬화(deserialization)라고 한다.
직렬화시킬 클래스는 반드시 Serializable 인터페이스를 implements(구현) 해야한다.
하지만, 객체의 데이터 중 일부의 데이터는(패스워드와 같은 보안) 여러가지 이유로 전송을 하고 싶지 않
을 수 있다.
이러한 변수는 직렬화에서 제외해야 되며, 이를 위해서 변수에 transient를 선언한다.
enum
Enum은 열거 자료형으로 서로 관련이 있는 상수들의 집합이다.
Enum타입은 고정된 상수들의 집합으로써, 런타임이 아닌 컴파일 타임에 모든 값을 알고 있어야 한다.
즉, 다른 패키지나 클래스에서 enum 타입에 접근해서 동작으로 어떤 값을 정해 줄 수 없다. 따라서 컴파일
시에 타입안정성이 보장. (해당 enum 클래스 내에서 까지 new 키워드로 인스턴스 생성이 불가능.
newInstance(), clone() 사용불가)
이 때문에 생성자의 접근 제어자를 private로 설정 해야 함. 이렇게 되면 외부에서 접근 가능한 생성자가
없으므로 enum타입은 실제적으로 final과 다름이 없음.
클라이언트에서 enum의 인스턴스를 생성할 수 없고 상속을 받을 수도 없으므로, 결국 enum 타입은 인스턴
스 생성을 제어하며, 싱글톤을 일반화한다.
이런 특성으로 enum타입은 싱글톤을 구현하는 하나의 방법으로 사용되기도 한다.
LIST, SET, MAP
데이터를 저장하는 기본적인 자료구조이다.
LIST는 순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.
SET은 순서를 유지하지 않는 데이터의 집합으로 중복을 허용하지 않는다.
MAP은 Key와 Value의 쌍으로 이루어진 데이터의 집합이다. 순서는
유지되지 않고, 키는 중복을 허용하지 않으며 값의 중복은 허용한다.
# HashMap
요소들간의 순서 없음. 삽입된 순서도 유지하지 않음.
Key와 value에 null허용
# Hashtable
요소들간에 순서 없음. 삽입된 순서도 유지하지 않음.
Key와 value모두 null 허용 안 함. Null 삽입 시 예외발생(key, value 둘 다)
# TreeMap
요소들 간에 key값에 의해 자동 정렬되는 오름차순 순열을 가짐.
Key에 null 허용 안 함. Value에 null허용
# List, Set : Null 허용
LIST, SET, MAP
Collection
Hashtable
순서나 집합적인 저장공간
키와 값으로 데이터 핸들링
순서가 있는 저장 공간
Map
List
Set
집합적인 저장 공간
동기화가 보장되는 Map 계열의 클래스
HashMap
동기화가 보장되지 않는 Map 계열의 클래스
정렬을 위한 Map계열의 클래스
LinkedList
Stack
Vector
ArrayList
SortedMap
HashSet
SortedSet 정렬을 위한 Set계열의 인터페이스
TreeMap
TreeSet
Set의 대표 클래스
동기화 보장
동기화를 보장하지 않음
숫자든 문자든 오름차순으로 정렬하는
클래스
키의 값이 숫자든 문자든 오름차순으
로 정렬하는 클래스
LinkedHashMap HashMap과 다르게 순서를 보장 (입력시 순서)
ArrayList, LinkedList, Vector
순서가 있는 데이터의 집합으로 데이터의 중복을 허용하는 클래스이다.
ArrayList는 각 데이터에 대한 인덱스를 가지고 있기 때문에 검색이 빠르며 많은 데
이터의 추가 삭제 시에 성능이 떨어진다.
LinkedList는 다음 자료의 위치정보를 가지며 내부적인 인덱스는 가지고 있지 않다.
데이터의 추가 삭제 시 유용하지만 데이터가 많은 경우 자료를 순차적으로 찾으므로
느려지는 단점이 있다.
Vector는 동기화 처리가 내부적으로 일어나 다른 객체보다 무거움
Vector의 기본 동작은 ArrayList 와 동일하다. 하지만 다른 점은 동기화(Synvhronize)처리에 있다.
ArrayList에서 삽입 LinkedList에서 삽입
동기화와 비동기화
동기화 : 요청과 동시에 호출한 자리에서 대기하고 처리하고 처리가 완
료될 때까지 다른 함수를 호출 할 수 없다.
비 동기화 : 요청만 보내고 읽은 데이터가 준비됐다는 신호를 받아서 하
는 것이 비 동기화이다. 요청을 하면 호출 이후 처리완료 될 때까지 대
기하지 않고 바로 처리해주는 형식
# AJAX (Asynchronous Javascript And Xml)
클라이언트와 서버 측의 데이터 전송 및 처리를 비동기적으로 처리한다.
서버 측에 데이터를 요청한 후, 그 데이터의 수신이 완료될 때까지 기다리지 않고 다른 작업을 바로 진행
할 수 있다. 그런 이유로 좀 더 웹 페이지를 자유롭게 구성할 수 있고 불필요한 잦은 페이지 로딩을 줄일
수 있다.
AJAX (Asynchronous Javascript And Xml)
비 동기 javascipt와 xml을 말한다.
서버와의 데이터 통신하기 위해 xml기반의 XMLHttpRequest객체를 사용
하고 데이터를 화면에 표시하기 위해 자바 스크립트와 DOM을 사용.
Ajax는 서버 측으로 부터 정보를 통신하기 위해 다양한 형식(json, xml, html 및 일반 텍스트 형식 등)의
정보를 주고 받을 수 있습니다.
AJAX의 가장 강력한 특징은 페이지 전체를 리프레쉬 하지 않고도 수행되는 비동기성이다. 이러한 비동기성
을 통해 사용자의 Event가 있으면 전체 페이지가 아닌 일부분만을 업데이트 할 수 있게 해준다.
단점으로는 페이지 이동 없는 통신으로 보안상의 문제와 디버깅이 어려움
제네릭(Generic)
제네릭은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기
법을 의미한다.
Class Person <T>{
public T info;
}
Person<String> p1 = new Person<String>();
Person<Integer> p2 = new Person<String>();
이런 부류
다른 예로는 List를 들 수 있다.
List<String> list = new ArrayList<String>();
List<Person> pList = new ArrayList<Person>();
가비지 컬렉션 (Java Garbage Collection)
Java에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않
기 때문에 가비지 컬렉터가 더 이상 필요 없는 (쓰레기) 객체를 찾아
지우는 작업을 한다.
# stop-the-world
GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. Stop-the-world가 발생하면 GC는 실행하
는 쓰레드를 제외한 나머지 쓰레드의 모든 작업을 멈춘 후 GC작업을 완료한 이후에야 중단했던 작업을 다
시 시작한다.
#GC 전제조건 (GC가 만들어진 가설)
- 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
- 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
이 가설의 장점을 최대한 살리기 위해서 HotSpot VM에서는 크게 2개로 물리적 공간을 나누었다.
(Young 영역,Old 영역)
Young 영역(Yong Generation 영역): 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가
금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에
서 객체가 사라질 때 Minor GC가 발생한다고 말한다.
Old 영역(Old Generation 영역): 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로
복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다.
이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말한다.
JSP
신입면접 준비
JSP 모델1 과 모델2
모델1 구조 : 클라이언트에서 request(요청)을 받아들이고 클라이언트
에 response(응답)해주는 처리를 jsp 단독으로 처리하는 구조
모델2 구조 : 요청처리, 데이터베이스 접근, 비즈니스 로직을 포함하고
있는 컨트롤 컴포넌트와 뷰 컴포넌트가 엄격하게 분리되어 뷰에서는 어
떠한 로직도 포함하고 있지 않다.
개발하려는 웹 어플리케이션의 복잡도가 적고 유지보수가 빈번하지 않다면 모델1구조로 개발하는 것이 적합하며 반대
로 웹 어플리케이션의 복잡도가 크고 유지보수가 빈번하게 발생한다면 모델2 구조를 사용하는 것이 적합하다.
모델 2 장점
-비즈니스 로직과 뷰의 분리로 인해 어플리케이션이 명료
해지며 유지보수와 확장이 용이하다.
-개발자와 디자이너의 작업이 분리되어 역할과 책임구분이
명확해진다
모델 2 단점
- 개발초기에 구조 설계를 위한 시간이 많이 소요된다.
모델 1 장점
-단순한 페이지의 흐름으로 개발기간이 단축
-페이지가 많지 않은 중소형 프로젝트에 적합하다.
모델 1 단점
- 복잡해질수록 유지보수가 힘들다
- 디자이너와 개발자간의 원활한 의사소통이 힘들다.
MVC 패턴
MVC구조는 사용자의 입력을 받아 이벤트를 처리하고 그 결과를 다시 사
용자에게 표시하기 위한 최적화된 설계를 가지고 있다.
뷰는 화면에 내용을 표출하는 역할을 담당. 데이터가 어떻게 생성되고 어디서 왔는지에 전혀 관여하지 않
는다. 단지 정보를 보여주는 역할만을 담당한다. JSP 기반의 어플리케이션에서는 JSP페이지가 뷰에 해당한
다.
모델은 로직을 가지는 부분으로 DB와의 연동을 통해서 데이터를 가져와 어떤 작업을 처리하거나 처리한 작
업의 결과를 데이터로서 DB에 저장하는 일을 처리한다. 모델은 어플리케이션의 수행에 필요한 데이터를 모
델링하고 비즈니스 로직을 처리한다. JSP기반의 어플리케이션에서는 JavaBean이 모델에 해당한다.
컨트롤러는 어플리케이션의 흐름을 제어하는 것으로 뷰와 모델사이에서 이들의 흐름을 제어한다. 컨트롤러
는 사용자의 요청을 받아 모델에 넘겨주고 모델이 처리한 결과를 뷰에 보내주는 역할을 한다. Jsp기반의
웹 어플리케이션에서는 보통 서블릿을 컨트롤러로 사용한다.
JSP 와 Servlet
Servlet은 Java언어를 기반으로 동적인 웹 페이지를 작성할 수 있도록
지원한다. 쓰레드 기반으로 사용자의 요청을 받아 들이므로 다수의 사용
자를 받아들이더라도 서버의 응답속도가 많이 떨어지지 않는 장점이 있
다.
JSP는 Servlet과 마찬가지로 Java언어를 기반으로 하지만 서버에서 실
행되는 스크립트 언어 방식으로 동적인 웹 페이지를 작성해서 Servlet
의 장점은 그대로 갖추고 작성하기가 쉽다는 장점이 있다.
jsp 와 servlet은 우리가 HTTP프로토콜 통신 규약을 자세하게 알지 못해도 java를 사용하여 웹 프로그래
밍을 할 수 있게 도와주는 일종의 공통 규약이다.
스크립트 기술이란 미리 약속된 규정에 따라 간단한 키워드 조합을 입력하면 실행시점에서 그 각각의 키워
드에 맵핑 되어있는 어떤 코드로 변환 후 실행되는 경우
WS와 WAS
웹 서버(WS) : 웹 브라우저의 요청을 받아들이는 곳으로 작업의 결과를 웹 브라우저에게
응답하는 곳이다. 요청된 페이지의 로직 및 데이터 베이스와의 연동을 위해 어플리케이션
서버에 이들의 처리를 요청하는 작업을 수행
웹 어플리케이션 서버(WAS) : 요청된 페이지의 로직 및 데이터베이스와의 연동을 처리
웹 어플리케이션의 처리순서는
1. 웹 브라우저가 웹 서버에 어떠한 페이지를 요청하면
2. 웹 서버는 웹 브라우저의 요청을 받아서 요청된 페이지의 로직 및 데이터베이스와 연동을 위해 어플리케이션 서버에
이들의 처리를 요청한다.
3. 웹 어플리케이션 서버는 데이터베이스와의 연동이 필요하면 데이터베이스와 데이터의 처리를 수행한다.
4. 로직 및 데이터베이스 작업의 처리 결과를 웹 서버에 돌려보낸다.
5. 그러면 웹 서버는 결과를 다시 브라우저에 응답한다.
JSP include 정적인 방식, 동적인 방식
정적인 방식은 JSP 페이지 번역 및 컴파일 단계에서 필요한 JSP를 읽어
서 메인 JSP의 자바 소스 및 클래스에 포함시키는 방식
동적인 방식은 페이지가 호출될 때 마다 저장된 페이지를 불러들여서 수
행한다.
정적인 방식 : <%@include file=“관련 URL”%>
동적인 방식 : <jsp:include page=“relativeURL”/>
정적인 방식이 동적인 방식의 응답속도를 비교해 보면 동적인 방식이 약 30배 더 느리다. 성능을 빠르게
하려면 정적인 방식을 사용해야 하지만 정적인 방식은 메인 JSP에 추가되는 JSP에 동일한 이름의 변수가
있으면 오류가 발생한다.
URI 와 URL의 차이
URL(Uniform Resource Locator)는 서비스를 제공하는 각 서버들에
있는 파일들의 위치를 표시하기 위한 것으로 서비스의 종류, 도메인, 파
일의 위치 등을 포함한다.
URI(Uniform Resource Identifier)는 존재하는 자원을 식별하기 위
한 일반적인 식별자를 규정하기 위한 것이다. (URI = URL + URN)
URL은 웹에 있는 문서나 페이지 등에 이름을 붙이는 방법, 웹 페이지 이외에 FTP서버에 있는 파일이나 메
일 주소 등도 URL로 표현가능
URL의 포멧은
프로토콜://웹서버 도메인명/파일의경로
형식이다.
JSP 내장객체 Scope
Page
한 번의 웹 브라우저(클라이언트)의 요청에 대해 하나의 JSP 페이지가 호출되며 웹브라우저의 요청이 들어오면
이때 단 한 개의 페이지만 대응 된다. JSP 페이지 그 자체를 나타내는 객체로 생성된 객체는 PageContext 에
저장된다. 쉽게 말해 service()를 벗어나면 소멸한다.
Request
한 번의 웹 브라우저(클라이언트)의 요청에 대해 같은 요청을 공유하는 페이지가 대응되며 웹 브라우저가 한
번의 요청에 단지 한 개의 페이지만 요청될 수 있고, 같은 request 영역이면 두 개의 페이지가 같은 요청을
공유 한다. include 액션 태그, forward 액션 태그를 사용 시 공유 가능. 생성된 객체는
HttpServletRequest 에 저장
Session
하나의 웹 브라우저 당 1개의 session 객체가 생성된다. 같은 웹 브라우저 내에서는 요청되는 페이지 들은 같
은 객체를 공유한다. 생성된 객체는 HttpSession 에 저장된다. 동일한 클라이언트만 사용가능
Application
하나의 웹 어플리케이션 당 1개의 application 객체가 생성된다. 웹 어플리케이션이 실행되는 동안 서버의 설
정 정보 및 자원에 대한 정보나 이벤트 로그 정보와 관련된 기능을 제공한다. 생성된 객체는 실질적으로는
ServletContext 에 저장된다.
JSP 기본객체
request: 클라이언트의 요청 정보를 담고 있는 객체 (스코프: request)
실제 타입: javax.servlet.http.HttpServletRequest 또는 javax.servlet.ServletRequest
response: 요청에 대한 응답 정보를 담고 있는 객체 (스코프: page)
실제 타입: javax.servlet.http.HttpServletResponse 또는 javax.servlet.ServletResponse
out: 페이지 내용을 담고 있는 출력 스트림 객체 (스코프: page)
실제 타입: javax.servlet.jsp.JspWriter
pageContext: JSP 페이지 실행에 필요한 Context 정보를 담고 있는 객체 (스코프: page)
실제 타입: javax.servlet.jsp.PageContext
session: 세션 정보를 담고 있는 객체 (스코프: session)
실제 타입: javax.servlet.http.HttpSection
application: Context의 모든 페이지가 공유할 데이터를 담고 있는 객체 (스코프: application)
실제 타입: javax.servlet.ServletContext
config: JSP 페이지의 서블릿 설정 데이터 초기화 정보 객체 (스코프: page)
실제 타입: javax.servlet.ServletConfig
page: JSP 페이지를 구현한 자바 클래스 객체 (스코프: page)
실제 타입: java.lang.Object
exception: JSP 페이지의 서블릿 실행 시 처리하지 못한 예외 객체 (스코프: page)
실제 타입: java.lang.Throwable
JSP Beans (자바 빈즈)
자바빈즈(java Beans)는 UI에서 서버 측 데이터를 담아서 처리하기 위
한 컴포넌트이다.
<jsp:useBean id=“list” scope=“request” class=“java.util.ArrayList” type=“java.util.List”/>
<jsp:useBean id=“count” scope=“request” class=“java.lang.String”/>
자바 빈즈는 JSP페이지의 로직 부분을 분리해서 코드를 재사용함으로 프로그램의 효율을 높이기 위해 사용한다.
프로그램의 모듈화는 코드를 재사용하므로 프로그램의 작성기간이 단축되고, 이미 사용되던 코드이므로 안정성이
보장되며 유지/보수가 쉽다. MVC패턴에서 자바 빈은 프로그램 로직을 소유할 수 있고 DB와 연동해서 작업을 처
리한다.
자바 빈즈를 통하여 useBean을 하면 성능에 많은 영향을 미치지는 않지만 너무 많이 사용하면 jsp에서 소요되
는 시간이 증가 할 수 있게 된다. 한 두개의 자바 빈즈를 사용하는 것은 상관없지만 10- 20개의 자바빈즈를 사
용하면 성능에 영향을 주게 되므로 TO(Transfer object)패턴을 사용해야 한다.
태그 라이브러리 (Tag library)
태그라이브러리는 jsp에서 공통적으로 반복되는 코드를 클래스로 만들고
그 클래스를 HTML태그와 같이 정의된 태그로 사용할 수 있도록 하는 라
이브러리다.
<%taglib uri=“/tagLibrary” prefix=“myPreFix” />
태그 라이브러리는 xml 기반의 tld파일과 태그 클래스로 구성되어있다.
태그라이브러리를 사용하기 위해서는 web.xml파일에서 tld와 URI와 파일위치를 정의해야 한다.
태그라이브러리는 태그 사이에 있는 데이터를 넘겨주는데, 이때 넘겨주는 데이터 형태는 대부분 문자열 타
입이다. 따라서 데이터가 많으면 많을수록 처리해야 하는 내용이 많아지고 태그 라이브러리에서 클래스를
처리하는 시간이 많아진다. 따라서 목록을 처리하면서 대용량의 데이터를 처리할 경우에는 태그 라이브러리
의 사용을 자제해야 한다.
THANK
YOU

More Related Content

What's hot

Yocto - Embedded Linux Distribution Maker
Yocto - Embedded Linux Distribution MakerYocto - Embedded Linux Distribution Maker
Yocto - Embedded Linux Distribution MakerSherif Mousa
 
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git민태 김
 
Linux : The Common Mailbox Framework
Linux : The Common Mailbox FrameworkLinux : The Common Mailbox Framework
Linux : The Common Mailbox FrameworkMr. Vengineer
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드Insub Lee
 
Let's trace Linux Lernel with KGDB @ COSCUP 2021
Let's trace Linux Lernel with KGDB @ COSCUP 2021Let's trace Linux Lernel with KGDB @ COSCUP 2021
Let's trace Linux Lernel with KGDB @ COSCUP 2021Jian-Hong Pan
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golangBo-Yi Wu
 
Gitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueVincent Composieux
 
Towards Object-centric Time-traveling Debuggers
 Towards Object-centric Time-traveling Debuggers Towards Object-centric Time-traveling Debuggers
Towards Object-centric Time-traveling DebuggersESUG
 
Shell_Scripting.ppt
Shell_Scripting.pptShell_Scripting.ppt
Shell_Scripting.pptKiranMantri
 
Go micro framework to build microservices
Go micro framework to build microservicesGo micro framework to build microservices
Go micro framework to build microservicesTechMaster Vietnam
 
Valgrind tutorial
Valgrind tutorialValgrind tutorial
Valgrind tutorialSatabdi Das
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The AnswerIan Barber
 
100 PHP question and answer
100 PHP  question and answer100 PHP  question and answer
100 PHP question and answerSandip Murari
 
Git 입문자를 위한 가이드
Git 입문자를 위한 가이드Git 입문자를 위한 가이드
Git 입문자를 위한 가이드chandler0201
 
Introduction to git hub
Introduction to git hubIntroduction to git hub
Introduction to git hubNaveen Pandey
 
Using GitLab CI
Using GitLab CIUsing GitLab CI
Using GitLab CIColCh
 
Python to go
Python to goPython to go
Python to goWeng Wei
 

What's hot (20)

Yocto - Embedded Linux Distribution Maker
Yocto - Embedded Linux Distribution MakerYocto - Embedded Linux Distribution Maker
Yocto - Embedded Linux Distribution Maker
 
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
 
Linux : The Common Mailbox Framework
Linux : The Common Mailbox FrameworkLinux : The Common Mailbox Framework
Linux : The Common Mailbox Framework
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드
 
Let's trace Linux Lernel with KGDB @ COSCUP 2021
Let's trace Linux Lernel with KGDB @ COSCUP 2021Let's trace Linux Lernel with KGDB @ COSCUP 2021
Let's trace Linux Lernel with KGDB @ COSCUP 2021
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golang
 
Gitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement Continue
 
Towards Object-centric Time-traveling Debuggers
 Towards Object-centric Time-traveling Debuggers Towards Object-centric Time-traveling Debuggers
Towards Object-centric Time-traveling Debuggers
 
Vi editor
Vi   editorVi   editor
Vi editor
 
Basic Git Intro
Basic Git IntroBasic Git Intro
Basic Git Intro
 
Shell_Scripting.ppt
Shell_Scripting.pptShell_Scripting.ppt
Shell_Scripting.ppt
 
Go micro framework to build microservices
Go micro framework to build microservicesGo micro framework to build microservices
Go micro framework to build microservices
 
Valgrind tutorial
Valgrind tutorialValgrind tutorial
Valgrind tutorial
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The Answer
 
ZeroMQ
ZeroMQZeroMQ
ZeroMQ
 
100 PHP question and answer
100 PHP  question and answer100 PHP  question and answer
100 PHP question and answer
 
Git 입문자를 위한 가이드
Git 입문자를 위한 가이드Git 입문자를 위한 가이드
Git 입문자를 위한 가이드
 
Introduction to git hub
Introduction to git hubIntroduction to git hub
Introduction to git hub
 
Using GitLab CI
Using GitLab CIUsing GitLab CI
Using GitLab CI
 
Python to go
Python to goPython to go
Python to go
 

Similar to [HaU] 신입 기술 면접 준비 java

객체지향 단어가 의미하는 것
객체지향 단어가 의미하는 것객체지향 단어가 의미하는 것
객체지향 단어가 의미하는 것jaypi Ko
 
C Language II
C Language IIC Language II
C Language IISuho Kwon
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿AnselmKim
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework경주 전
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
보다 나은 웹 어플리케이션 설계
보다 나은 웹 어플리케이션 설계보다 나은 웹 어플리케이션 설계
보다 나은 웹 어플리케이션 설계Eb Styles
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7Chris Ohk
 
프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)Devgear
 
이펙티브 C++ 789 공부
이펙티브 C++ 789 공부이펙티브 C++ 789 공부
이펙티브 C++ 789 공부quxn6
 
NoSQL 간단한 소개
NoSQL 간단한 소개NoSQL 간단한 소개
NoSQL 간단한 소개Wonchang Song
 
OOP - Object Oriendted Programing
OOP - Object Oriendted ProgramingOOP - Object Oriendted Programing
OOP - Object Oriendted ProgramingChangHyeon Bae
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
10 swift 열거형구조체클래스
10 swift 열거형구조체클래스10 swift 열거형구조체클래스
10 swift 열거형구조체클래스Changwon National University
 
객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본용호 최
 

Similar to [HaU] 신입 기술 면접 준비 java (20)

객체지향 단어가 의미하는 것
객체지향 단어가 의미하는 것객체지향 단어가 의미하는 것
객체지향 단어가 의미하는 것
 
C Language II
C Language IIC Language II
C Language II
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
 
7 8 1
7 8 17 8 1
7 8 1
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
보다 나은 웹 어플리케이션 설계
보다 나은 웹 어플리케이션 설계보다 나은 웹 어플리케이션 설계
보다 나은 웹 어플리케이션 설계
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7
 
프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)
 
이펙티브 C++ 789 공부
이펙티브 C++ 789 공부이펙티브 C++ 789 공부
이펙티브 C++ 789 공부
 
Uml 세미나
Uml 세미나Uml 세미나
Uml 세미나
 
NoSQL 간단한 소개
NoSQL 간단한 소개NoSQL 간단한 소개
NoSQL 간단한 소개
 
OOP - Object Oriendted Programing
OOP - Object Oriendted ProgramingOOP - Object Oriendted Programing
OOP - Object Oriendted Programing
 
Java script
Java scriptJava script
Java script
 
Design patterns
Design patternsDesign patterns
Design patterns
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
10 swift 열거형구조체클래스
10 swift 열거형구조체클래스10 swift 열거형구조체클래스
10 swift 열거형구조체클래스
 
객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본
 

[HaU] 신입 기술 면접 준비 java

  • 2. 객체지향과 절차지향 절차지향 프로그래밍이란 위에서 아래로 순차적인 처리가 실행되며 데이터를 처리하는 방법을 중요시하여 함수 단위로 프로그래밍 기법 으로 대표적인 절차지향언어로 C언어가 있다. 객체지향 프로그래밍이란 컴퓨터 프로그램을 명령어의 목록(함수)으 로 보는 시각에서 벗어나 독립된 단위인 객체들의 모임으로 파악하고 자 하는 것이다. 대표적인 객체지향언어로 JAVA가 있다. 절차지향 프로그래밍은 순서대로 진행하다가 함수(모듈, 프로시저)를 만나면 그 것을 타고 들 어가서 진행되는 식이다. 절차적 프로그래밍의 단점은 개발이 오래 걸리고 한번 사용한 코드를 다시 재사용하기 어렵다. 이를 해결하기 위한 하나의 방법이 객체지향 프로그래밍이다. 객체지향의 4대 특징 : 캡슐화, 상속, 추상화, 다형성 객체지향의 5대 원칙 : SOLID SoC (Separation Of Concerns) : 관심사의 분리 관심사가 같은 것은 하나의 객체로, 관심사가 다른 것은 서로 영향을 주지 않도록 분리 하나의 속성, 하나의 클래스, 하나의 패키지 안에는 하나의 관심사만 들어있어야 한다는 것
  • 3. 객체(object)란 무엇인가? 객체지향이란 실 세계를 직접적이고 직관적으로 모델링 할 수 있는 패러다임이다. 객체지향 프로그래밍이란 현실 속에 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부 로 옮겨오는 작업이기 때문에 그 결과물인 객체지향 소프트웨어는 실 세계의 투영이며, 객체란 현실 세계에 존재하는 사물에 대한 추상화이다. 객체(object)는 객체지향기술(oriented-object)을 이해하기 위한 핵심개념으로 세상에 존재하는 모든 사물이다. 각각의 사물은 고유하고 상태(state)과 행위(Behavior)를 가지고 있다.
  • 4. 객체와 클래스, 인스턴스 객체와 클래스의 개념 => 클래스 : 객체 = 펭귄 : 뽀로로 , 사람 : 김연아, 쥐 : 미키마우스 객체는 유일무이(unique)한 사물이고, 클래스는 같은 속성과 기능을 지닌 여러 객체들을 총칭하는 집합의 개념이다. 이를 설명하는 메타포로 클래스를 객체의 설계도라고 한다. 인스턴스(instance)는 어떤 집합에 대해서 그 집합의 개별적인 요소 로 객체(object)는 클래스의 인스턴스 이다.
  • 5. 객체지향의 5대원칙 • 단일 책임 원칙, SRP ( Single Responsibility Principle) 어떤 클래스를 변경해야 하는 이유는 오직 하나 뿐 이여야 한다. (관심사의 분리) • 개방 폐쇄 원칙, OCP (Open Close Principle) 자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀있어야 한다. Ex)JDBC • 리스코프 치환 원칙, LSP (Liskov Substitution Principle) 서브타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다. (부모와 자식간 행위 일 관) • 인터페이스 분리 원칙, ISP (Interface Segregation Principle) 클라이언트는 자신이 사용하지 않는 메소드에 의존관계를 맺으면 안 된다. • 의존 역전 원칙, DIP (Dependency Inversion Principle) 자신보다 변하기 쉬운 것에 의존하지 마라 ISP와 SRP는 같은 문제에 대한 두 가지 다른 해결책 SRP는 은행에서의 고객과 병원에서의 고객을 각각 고객이라는 상위 객체를 두고 나눈다면 ISP는 병원에서의 고객과 은행에서의 고객을 interface 로 분할하여 나누고 자식으로 고객 객체에서 각각의 interface 확장하여 사용 SOLID : 논리를 더욱 잘 분할하고, 잘 표한하기에 이해하기 쉽고, 개발하기 쉽고, 유지보수하기 쉬워진다.
  • 6. 객체지향의 4대 특성 • 캡슐화 : 정보은닉 객체의 속성과 행위를 하나로 묶어 실제 구현 내용은 감추어 은닉한다. (접근제어자 사용) • 상속 : 재사용 + 확장 객체지향에서 상속은 상위 클래스의 특성을 하위클래스에서 상속하고 거기에 필요한 특성을 추가하여 확장해서 사용할 수 있다는 의미이다. (하위 클래스 is a kind of 상위 클래스) • 추상화 : 모델링 추상화란 구체적인 것을 분해해서 관심영역에 있는 특성만을 개지고 재조합 하는 것 (= 모델 링) • 다형성 : 사용 편이성 상속관계일 때 한가지 타입의 참조변수로 여러가지 타입의 객체를 참조 할 수 있다. 또한, 다형성의 대표적인 예로는 오버라이딩과 오버로딩이 있다. 캡슐화, 상속, 추상화, 다형성
  • 7. 캡슐화와 은닉화의 차이점 캡슐화는 캡슐 알약을 생각하자. 약을 복용 시 약의 내용물은 확인하지 않고 껍데기만 확인하듯이 마찬가지로 클래스가 제공하 는 메소드의 기능만을 사용할 뿐 실제 그 메소드가 어떻게 움직이는지는 알 필요 없다. 은닉화는 속성에 직접 접근하는 것은 데이터 무결성에 치명적일 수 있어서 속성들을 접근제어 자인 private로 감춰두고 getter, setter 메서드를 통해서만 접근 가능하게 하는 것이다. 캡슐화는 클래스가 제공하는 메소드의 기능만을 사용할 뿐 실제 그 메소드가 어떻게 동작하는지는 보여주지 않고 감추는 것이고 은닉화는 클래스의 속성들을 private로 만들어 클래스 밖에서 접근 할 수 없도록 하는 것을 의미한다.
  • 8. 오버라이딩과 오버로딩 간단하게 두 정수를 더해서 반환하는 함수가 add(int, int) 형식일 때 오버로딩이 지원되지 않는 언어에서는 이미 add라는 함수 명을 사용했기에 이름이 다른 addDouble(double, double) 형식으로 함수 명을 만들어야 한다. 자바에서 정수 자료 형으로는 byte, short, int ,long, char 이 있고, 부동 소수점 자료 형으 로는 float, double 이 있다. 인자가 중복되는 함수를 제외해도 여러 개의 함수 명을 작성해 야만 두 수를 모두 더하는 경우를 만족시킬 수 있다. 오버라이딩은 같은 메서드 이름, 같은 인자목록으로 상위 클래스의 메서드를 재정의 오버로딩은 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의
  • 9. 자바의 데이터 타입 (기본, 참조) 기본 데이터 형의 종류 : boolean, char, byte, short, int, long, float, double (8개) 레퍼런스 타입(reference type) : 프리미티브 타입(primitive type) = 참조 자료형 : 기본자료형 기본 데이터 형은 나타내고자 하는 기본 데이터 형의 값을 가지고 있고 참조 데이터 형은 배열, 클래스, 인터페이스 등 으로 값이 아닌 그에 대한 참조주소를 가지고 있다.
  • 10. 접근제어자 a.Jar 파일 안에 one 패키지가 있고, b.jar 파일 안에 같은 이름을 가진 one패키지가 있다면 b.jar 파일 내부의 one패키지 내 클래스나 객체에서 a.jar 파일 내부의 one 패키지 내의 public 멤버뿐 아니라 default 멤버와 protected 멤버를 자유자재로 접근할 수 있다. 상속을 받지 않았다면 객체 멤버는 객체를 생성한 후 객체 참조 변소를 이용해 접근해야 한다. 정적 멤버는 클래스명, 정적멤버 형식으로 접근하는 것을 권장한다. Public : 모두가 접근 가능 Protected : 상속/ 같은 패키지 내의 클래스에서 접근 가능 [default] : 같은 패키지 내의 클래스에서 접근 가능 Private : 본인만 접근 가능
  • 11. Call by Value, Call by Reference 기본 자료형 변수는 저장하고 있는 값을 그 값 자체로 해석하는 반면, 객체 참조 변수는 저장 하고 있는 값을 주소로 해석한다는 차이가 있다. 기본 자료형 변수를 복사할 때, 참조 자료형 변수를 복사할 때 일어나는 일은 동일하다. 가지 고 있는 값을 그대로 복사해서 넘겨준다. Call by Value (값에 의한 호출) – 기본 자료형 Call by Reference (참조 값에 의한 호출) – 객체 참조
  • 12. 정적 바인딩, 동적 바인딩 # 바인딩(Binding) 변수에 변수와 관련된 속성을 연관시키는 것 각종 값들이 확정되어 구속(bind) 상태가 되는 것 함수를 호출하는 부분에서 함수가 위치한 메모리 번지를 연결시켜 주는 것 ex) 변수의 데이터 타입이 무엇인지 결정 정적 바인딩(Compile-time Binding, Early Binding)은 컴파일러 시간에 변수의 크기를 정할 수 있는 것을 의미한다. Char, short, int, float, double과 같은 기본 자료형 동적 바인딩(Run-time Binding, Late Binding)이란 프로그램이 실행되어야 메모리에 크기가 얼 마만큼 할당되는지 알 수 있는 것을 의미 (heap 영역에 저장되는 대부분의 것들) 정적 바인딩 : 타입을 컴파일 하는 시간에 결정 동적 바인딩 : 타입을 런타임 하는 시간에 결정
  • 13. Abstract class 와 Interface 추상 클래스는 인스턴스, 즉 객체를 만들 수 없다. 추상 메서드는 하위클래스에게 메서드의 구현을 강제한다. (오버라이딩 강제) 추상 메서드를 포함(extends)하는 클래스는 반드시 추상 클래스여야 한다. 인터페이스는 추상 메서드와 정적 상수만을 가질 수 있기에 따로 public, static, final 을 자동 으로 자바가 붙여준다. Interface 와 abstract class의 가장 큰 차이점은 클래스인지 아닌 지다. 다중상속을 지원하지 않는 자바는 하위클래스에서 추상 클래스는 하나만 포함(extends)할 수 있지 만 interface는 여러 구현(implements)할 수 있다. 인터페이스는 be able to (무엇을 할 수 있는), 추상클래스는 is a kind of (한 분류) Abstract class (추상 클래스) 한 개 이상의 추상 메소드를 가지고 있는 클래스. Interface 추상 메소드와 정적 상수로 이루어져있고 이를 구현하는 자식 클래스 로 하여금 모든 메소드의 구현을 강제한다.
  • 14. Abstract class 와 Interface Interface는 호환성을 위한 규약만을 정해놓은 것이고 구현은 클래스를 만드는 사람이 알아서 하는 것 Abstract class는 호환성을 위한 규약도 정해놓고 미리 구현해서 상속될 메소드도 구현해 놓은 것 자동차 만드는 것을 예로 들자면, 자동차 interface라는 것은 그냥 규약일 뿐이라서 자동차 엔진 메소드, 브레이크 메소드, 핸들 메소드의 규약만 선언해 놓은 것 이렇게 규약 interface를 사용하는 이유는 그 규약대로 만들어진 자동차들이 서로 호환이 된다는 장점이 가장 크다 상속이라는 것은 아주 기본적인 자동차만 미리 만들어 놓고 (부모 클래스) 그것을 가져다가 (상속) 자기 입맛대로 페인트도 칠하고 오디오도 달고 하는 것(override) 부모클래스 자동차는 오디오도 없고 페인트도 칠해져 있지 않지만 자동차(instance 객체생성 가능) Abstract 자동차는 필수 부품 메소드를 만들지 않고 비워둔 것 사용자마다 엔진 취향이 너무 달라서 무조건 엔진을 새로 장착한다면, 기본 자동차에 엔진 메소드를 미리 구현할 필요는 없게 된 다. 하지만 엔진을 장착 할 수 있는 공간(규격)은 정해 놓아야 하고, 그 공간은 비워놓기만 한다.(abstract method) 이 경우 abstract 자동차를 상속한 경우에는 필수 부품 메소드(abstract method)는 반드시 구현해야한다. 공통으로 사용될 부분을 비워둔 상태로 규약을 정해놓은 것이 인터페이스라면, 각 구현체에서 다르게 사용될 공통부분은 비워둔 상태로 규약만 정해놓고, 동일하게 구현해야 할 부분은 구현하여 부모 클래스로 사용하는 게 추상클래스
  • 15. Static Static은 프로그램 안에서 단 하나만 존재하며 사용하지 않더라도 생성이 되는 정적인 존재이다. 프로그램 실행시 정적으로 생성되므로 자주 사용하지 않는 경우에는 메모리를 잡아먹을 수 있다. # Static 변수 각 인스턴스 들이 공통으로 값을 유지해야 하는 경우 static을 붙인다. 변수는 클래스가 메모리에 올라갈 때 자동으로 생성되고 메모리에 올라간 후 JVM이 종료될떄까 지 고정된(static)상태로 그 자리를 지킨다. # Static 블록 클래스가 처음 로딩될 때 한번만 수행된다. 멤버변수 (메소드 밖에 선언된 변수) 클래스변수, 전역변수, static 멤버  지역변수, 인스턴스 변수, 객체 멤버 대부분의 경우 변수와 메소드에 사용되는 키워드로 사용. (공용자원) 클래스의 변수나 메소드는 해당 클래스가 인스턴스 화 되기 전에는 사 용할 수 없는데, static으로 선언된 변수나 메소드는 해당 클래스의 인스턴스 여부와 상관없이 바로 접근 가능하고, 사용이 가능하다.
  • 16. final # final + 변수 Final이 붙은 변수는 단 한번 초기화를 할 수 있으며 할당된 주소 값이 고정되기 때문에 이후에 값 변경이 불가능하다. (ex math클래스의 PI) # final + 메소드 상속받은 하위 클래스에서 해당 메소드를 오버라이딩 할 수 없다. # final + 클래스 해당 클래스의 상속을 허락하지 않는다. 마지막, 최종이라는 의미를 가진 키워드로 클래스, 변수, 메소드와 함께 사용되며 재정의를 막기 위해 사용된다.
  • 17. this 지역변수와 속성(객체변수, 정적변수)의 이름이 같은 경우 지역변수가 우선한다. 객체변수와 이름이 같은 지역변수가 있는 경우 객체 변수를 사용하려면 this를 접두사로 사용한 다. 정적 변수와 이름이 같은 지역변수가 있는 경우 정적 변수를 사용하면 클래스 명을 접두사로 사 용한다. This는 객체가 자기자신을 지칭할 때 쓰는 키워드로 객체의 멤버 메 서드 내부에서 객체 자신을 지칭.
  • 18. Super Super 키워드로 바로 위의 상위 클래스 인스턴스는 접근 할 수 있지만, super.super 형태로 상 위의 상의의 클래스의 인스턴스에는 접근이 불가능 하다. This가 객체 멤버 메서드 내부에서 객체 자신을 지칭하는 키워드라 면 super는 바로 위 상위 클래스의 인스턴스를 지칭하는 키워드이다.
  • 19. String, StringBuilder, StringBuffer String 은 한 번 생성이 되면 할당된 메모리 공간이 변하지 않는다. Concat메서드 등을 통해 문자열을 붙이는 방법은 새로운 문자열이 붙는 것이 아니라 새로운 String객체로 만든 후 그 객체를 참조하도록 한다. StringBuilder와 StringBuffer는 문자열 연산 등으로 기존 객체에 공간이 부족하게 되는 경 우, 기존의 버퍼 크기를 늘리며 유연하게 동작한다. 연산이 많은 경우 속도 StringBuilder > StringBuffer >> String 모두 문자열을 저장하고 관리하는 클래스이다. String은 불변객체이며 StringBuilder, StringBuffer은 가변객체 로 차이점은 동기화 지원여부이다. StringBuilder는 동기화를 지원하지 않고 StringBuffer는 동기화 를 지원(Thread-safe)한다.
  • 20. Thread와 Process 프로세스는 자신만의 고유공간과 자원을 할당 받아 사용하는데 비해 스레드는 다른 스레드와 공간과 자원을 공유하여 사용한다. 기본적으로 하나의 프로세스가 생성되면 하나의 스레드가 같이 생성된다. 이를 메인 스레드라 고 부르며, 스레드를 추가로 생성하지 않는 한 모든 프로그램 코드는 메인 스레드에서 실행된 다. 또한 프로세스는 여러 개의 스레드를 가질 수 있으며 이를 멀티 스레드라고 한다. # 스레드의 장점 시스템의 자원소모가 줄어든다. 프로그램의 응답시간이 단축된다. 프로세스 간 통신방법에 비해 스레드간의 통신방법이 훨씬 간단하다. 시스템의 스루풋(throughput) 이 향상된다. (스루풋 : 주어진 시간 동안 컴퓨터가 할 수 있는 일의 양) # 스레드의 단점 프로그램 디버깅이 어렵다. 여러 개의 스레드를 이용하는 프로그램을 작성하는 경우에는 미묘한 시간차나 잘못된 변수를 공유함으로써 오류가 발생할 수 있다. 프로세스는 프로그램에 대한 각각의 인스턴스를 의미한다.프로세스는 운영체제로부터 주소공간, 파일, 메모리 등을 할당 받는다. 스레드란 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로 세스 내의 주소 공간이나 자원들을 대부분 공유하면서 실행된다.
  • 21. 객체 직렬화(Serialization)와 역직렬화(Deserialisation) 직렬화란 객체를 직렬화하여 전송 가능한 형태로 만드는 것을 의미한다. 주로 객체들을 통째로 파일로 저장하거나 전송하고 싶을 때 사용된다. 역 직렬화는 직렬화된 파일 등을 역으로 직렬화하여 다시 객체의 형태를 만드는 것을 의미한다. 자바 프로그램에서 입출력 데이터는 데이터 스트림 형태로 주고받는다. 파일에 저장하거나 네트워크를 통해 데이터를 전송할 때도 스트림 형태로 전송한다. 그렇기 때문에 객체를 파일에 저장하거나 네트워크로 전송하기 위해서는 객체를 스트림으로 만드는 작업이 필요한데 이것이 직렬 화이다. 프로그램에 입력된 스트림으로부터 다시 객체를 만들어 내는 작업을 역직렬화(deserialization)라고 한다. 직렬화시킬 클래스는 반드시 Serializable 인터페이스를 implements(구현) 해야한다. 하지만, 객체의 데이터 중 일부의 데이터는(패스워드와 같은 보안) 여러가지 이유로 전송을 하고 싶지 않 을 수 있다. 이러한 변수는 직렬화에서 제외해야 되며, 이를 위해서 변수에 transient를 선언한다.
  • 22. enum Enum은 열거 자료형으로 서로 관련이 있는 상수들의 집합이다. Enum타입은 고정된 상수들의 집합으로써, 런타임이 아닌 컴파일 타임에 모든 값을 알고 있어야 한다. 즉, 다른 패키지나 클래스에서 enum 타입에 접근해서 동작으로 어떤 값을 정해 줄 수 없다. 따라서 컴파일 시에 타입안정성이 보장. (해당 enum 클래스 내에서 까지 new 키워드로 인스턴스 생성이 불가능. newInstance(), clone() 사용불가) 이 때문에 생성자의 접근 제어자를 private로 설정 해야 함. 이렇게 되면 외부에서 접근 가능한 생성자가 없으므로 enum타입은 실제적으로 final과 다름이 없음. 클라이언트에서 enum의 인스턴스를 생성할 수 없고 상속을 받을 수도 없으므로, 결국 enum 타입은 인스턴 스 생성을 제어하며, 싱글톤을 일반화한다. 이런 특성으로 enum타입은 싱글톤을 구현하는 하나의 방법으로 사용되기도 한다.
  • 23. LIST, SET, MAP 데이터를 저장하는 기본적인 자료구조이다. LIST는 순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다. SET은 순서를 유지하지 않는 데이터의 집합으로 중복을 허용하지 않는다. MAP은 Key와 Value의 쌍으로 이루어진 데이터의 집합이다. 순서는 유지되지 않고, 키는 중복을 허용하지 않으며 값의 중복은 허용한다. # HashMap 요소들간의 순서 없음. 삽입된 순서도 유지하지 않음. Key와 value에 null허용 # Hashtable 요소들간에 순서 없음. 삽입된 순서도 유지하지 않음. Key와 value모두 null 허용 안 함. Null 삽입 시 예외발생(key, value 둘 다) # TreeMap 요소들 간에 key값에 의해 자동 정렬되는 오름차순 순열을 가짐. Key에 null 허용 안 함. Value에 null허용 # List, Set : Null 허용
  • 24. LIST, SET, MAP Collection Hashtable 순서나 집합적인 저장공간 키와 값으로 데이터 핸들링 순서가 있는 저장 공간 Map List Set 집합적인 저장 공간 동기화가 보장되는 Map 계열의 클래스 HashMap 동기화가 보장되지 않는 Map 계열의 클래스 정렬을 위한 Map계열의 클래스 LinkedList Stack Vector ArrayList SortedMap HashSet SortedSet 정렬을 위한 Set계열의 인터페이스 TreeMap TreeSet Set의 대표 클래스 동기화 보장 동기화를 보장하지 않음 숫자든 문자든 오름차순으로 정렬하는 클래스 키의 값이 숫자든 문자든 오름차순으 로 정렬하는 클래스 LinkedHashMap HashMap과 다르게 순서를 보장 (입력시 순서)
  • 25. ArrayList, LinkedList, Vector 순서가 있는 데이터의 집합으로 데이터의 중복을 허용하는 클래스이다. ArrayList는 각 데이터에 대한 인덱스를 가지고 있기 때문에 검색이 빠르며 많은 데 이터의 추가 삭제 시에 성능이 떨어진다. LinkedList는 다음 자료의 위치정보를 가지며 내부적인 인덱스는 가지고 있지 않다. 데이터의 추가 삭제 시 유용하지만 데이터가 많은 경우 자료를 순차적으로 찾으므로 느려지는 단점이 있다. Vector는 동기화 처리가 내부적으로 일어나 다른 객체보다 무거움 Vector의 기본 동작은 ArrayList 와 동일하다. 하지만 다른 점은 동기화(Synvhronize)처리에 있다. ArrayList에서 삽입 LinkedList에서 삽입
  • 26. 동기화와 비동기화 동기화 : 요청과 동시에 호출한 자리에서 대기하고 처리하고 처리가 완 료될 때까지 다른 함수를 호출 할 수 없다. 비 동기화 : 요청만 보내고 읽은 데이터가 준비됐다는 신호를 받아서 하 는 것이 비 동기화이다. 요청을 하면 호출 이후 처리완료 될 때까지 대 기하지 않고 바로 처리해주는 형식 # AJAX (Asynchronous Javascript And Xml) 클라이언트와 서버 측의 데이터 전송 및 처리를 비동기적으로 처리한다. 서버 측에 데이터를 요청한 후, 그 데이터의 수신이 완료될 때까지 기다리지 않고 다른 작업을 바로 진행 할 수 있다. 그런 이유로 좀 더 웹 페이지를 자유롭게 구성할 수 있고 불필요한 잦은 페이지 로딩을 줄일 수 있다.
  • 27. AJAX (Asynchronous Javascript And Xml) 비 동기 javascipt와 xml을 말한다. 서버와의 데이터 통신하기 위해 xml기반의 XMLHttpRequest객체를 사용 하고 데이터를 화면에 표시하기 위해 자바 스크립트와 DOM을 사용. Ajax는 서버 측으로 부터 정보를 통신하기 위해 다양한 형식(json, xml, html 및 일반 텍스트 형식 등)의 정보를 주고 받을 수 있습니다. AJAX의 가장 강력한 특징은 페이지 전체를 리프레쉬 하지 않고도 수행되는 비동기성이다. 이러한 비동기성 을 통해 사용자의 Event가 있으면 전체 페이지가 아닌 일부분만을 업데이트 할 수 있게 해준다. 단점으로는 페이지 이동 없는 통신으로 보안상의 문제와 디버깅이 어려움
  • 28. 제네릭(Generic) 제네릭은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기 법을 의미한다. Class Person <T>{ public T info; } Person<String> p1 = new Person<String>(); Person<Integer> p2 = new Person<String>(); 이런 부류 다른 예로는 List를 들 수 있다. List<String> list = new ArrayList<String>(); List<Person> pList = new ArrayList<Person>();
  • 29. 가비지 컬렉션 (Java Garbage Collection) Java에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않 기 때문에 가비지 컬렉터가 더 이상 필요 없는 (쓰레기) 객체를 찾아 지우는 작업을 한다. # stop-the-world GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. Stop-the-world가 발생하면 GC는 실행하 는 쓰레드를 제외한 나머지 쓰레드의 모든 작업을 멈춘 후 GC작업을 완료한 이후에야 중단했던 작업을 다 시 시작한다. #GC 전제조건 (GC가 만들어진 가설) - 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다. - 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다. 이 가설의 장점을 최대한 살리기 위해서 HotSpot VM에서는 크게 2개로 물리적 공간을 나누었다. (Young 영역,Old 영역) Young 영역(Yong Generation 영역): 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에 서 객체가 사라질 때 Minor GC가 발생한다고 말한다. Old 영역(Old Generation 영역): 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말한다.
  • 31. JSP 모델1 과 모델2 모델1 구조 : 클라이언트에서 request(요청)을 받아들이고 클라이언트 에 response(응답)해주는 처리를 jsp 단독으로 처리하는 구조 모델2 구조 : 요청처리, 데이터베이스 접근, 비즈니스 로직을 포함하고 있는 컨트롤 컴포넌트와 뷰 컴포넌트가 엄격하게 분리되어 뷰에서는 어 떠한 로직도 포함하고 있지 않다. 개발하려는 웹 어플리케이션의 복잡도가 적고 유지보수가 빈번하지 않다면 모델1구조로 개발하는 것이 적합하며 반대 로 웹 어플리케이션의 복잡도가 크고 유지보수가 빈번하게 발생한다면 모델2 구조를 사용하는 것이 적합하다. 모델 2 장점 -비즈니스 로직과 뷰의 분리로 인해 어플리케이션이 명료 해지며 유지보수와 확장이 용이하다. -개발자와 디자이너의 작업이 분리되어 역할과 책임구분이 명확해진다 모델 2 단점 - 개발초기에 구조 설계를 위한 시간이 많이 소요된다. 모델 1 장점 -단순한 페이지의 흐름으로 개발기간이 단축 -페이지가 많지 않은 중소형 프로젝트에 적합하다. 모델 1 단점 - 복잡해질수록 유지보수가 힘들다 - 디자이너와 개발자간의 원활한 의사소통이 힘들다.
  • 32. MVC 패턴 MVC구조는 사용자의 입력을 받아 이벤트를 처리하고 그 결과를 다시 사 용자에게 표시하기 위한 최적화된 설계를 가지고 있다. 뷰는 화면에 내용을 표출하는 역할을 담당. 데이터가 어떻게 생성되고 어디서 왔는지에 전혀 관여하지 않 는다. 단지 정보를 보여주는 역할만을 담당한다. JSP 기반의 어플리케이션에서는 JSP페이지가 뷰에 해당한 다. 모델은 로직을 가지는 부분으로 DB와의 연동을 통해서 데이터를 가져와 어떤 작업을 처리하거나 처리한 작 업의 결과를 데이터로서 DB에 저장하는 일을 처리한다. 모델은 어플리케이션의 수행에 필요한 데이터를 모 델링하고 비즈니스 로직을 처리한다. JSP기반의 어플리케이션에서는 JavaBean이 모델에 해당한다. 컨트롤러는 어플리케이션의 흐름을 제어하는 것으로 뷰와 모델사이에서 이들의 흐름을 제어한다. 컨트롤러 는 사용자의 요청을 받아 모델에 넘겨주고 모델이 처리한 결과를 뷰에 보내주는 역할을 한다. Jsp기반의 웹 어플리케이션에서는 보통 서블릿을 컨트롤러로 사용한다.
  • 33. JSP 와 Servlet Servlet은 Java언어를 기반으로 동적인 웹 페이지를 작성할 수 있도록 지원한다. 쓰레드 기반으로 사용자의 요청을 받아 들이므로 다수의 사용 자를 받아들이더라도 서버의 응답속도가 많이 떨어지지 않는 장점이 있 다. JSP는 Servlet과 마찬가지로 Java언어를 기반으로 하지만 서버에서 실 행되는 스크립트 언어 방식으로 동적인 웹 페이지를 작성해서 Servlet 의 장점은 그대로 갖추고 작성하기가 쉽다는 장점이 있다. jsp 와 servlet은 우리가 HTTP프로토콜 통신 규약을 자세하게 알지 못해도 java를 사용하여 웹 프로그래 밍을 할 수 있게 도와주는 일종의 공통 규약이다. 스크립트 기술이란 미리 약속된 규정에 따라 간단한 키워드 조합을 입력하면 실행시점에서 그 각각의 키워 드에 맵핑 되어있는 어떤 코드로 변환 후 실행되는 경우
  • 34. WS와 WAS 웹 서버(WS) : 웹 브라우저의 요청을 받아들이는 곳으로 작업의 결과를 웹 브라우저에게 응답하는 곳이다. 요청된 페이지의 로직 및 데이터 베이스와의 연동을 위해 어플리케이션 서버에 이들의 처리를 요청하는 작업을 수행 웹 어플리케이션 서버(WAS) : 요청된 페이지의 로직 및 데이터베이스와의 연동을 처리 웹 어플리케이션의 처리순서는 1. 웹 브라우저가 웹 서버에 어떠한 페이지를 요청하면 2. 웹 서버는 웹 브라우저의 요청을 받아서 요청된 페이지의 로직 및 데이터베이스와 연동을 위해 어플리케이션 서버에 이들의 처리를 요청한다. 3. 웹 어플리케이션 서버는 데이터베이스와의 연동이 필요하면 데이터베이스와 데이터의 처리를 수행한다. 4. 로직 및 데이터베이스 작업의 처리 결과를 웹 서버에 돌려보낸다. 5. 그러면 웹 서버는 결과를 다시 브라우저에 응답한다.
  • 35. JSP include 정적인 방식, 동적인 방식 정적인 방식은 JSP 페이지 번역 및 컴파일 단계에서 필요한 JSP를 읽어 서 메인 JSP의 자바 소스 및 클래스에 포함시키는 방식 동적인 방식은 페이지가 호출될 때 마다 저장된 페이지를 불러들여서 수 행한다. 정적인 방식 : <%@include file=“관련 URL”%> 동적인 방식 : <jsp:include page=“relativeURL”/> 정적인 방식이 동적인 방식의 응답속도를 비교해 보면 동적인 방식이 약 30배 더 느리다. 성능을 빠르게 하려면 정적인 방식을 사용해야 하지만 정적인 방식은 메인 JSP에 추가되는 JSP에 동일한 이름의 변수가 있으면 오류가 발생한다.
  • 36. URI 와 URL의 차이 URL(Uniform Resource Locator)는 서비스를 제공하는 각 서버들에 있는 파일들의 위치를 표시하기 위한 것으로 서비스의 종류, 도메인, 파 일의 위치 등을 포함한다. URI(Uniform Resource Identifier)는 존재하는 자원을 식별하기 위 한 일반적인 식별자를 규정하기 위한 것이다. (URI = URL + URN) URL은 웹에 있는 문서나 페이지 등에 이름을 붙이는 방법, 웹 페이지 이외에 FTP서버에 있는 파일이나 메 일 주소 등도 URL로 표현가능 URL의 포멧은 프로토콜://웹서버 도메인명/파일의경로 형식이다.
  • 37. JSP 내장객체 Scope Page 한 번의 웹 브라우저(클라이언트)의 요청에 대해 하나의 JSP 페이지가 호출되며 웹브라우저의 요청이 들어오면 이때 단 한 개의 페이지만 대응 된다. JSP 페이지 그 자체를 나타내는 객체로 생성된 객체는 PageContext 에 저장된다. 쉽게 말해 service()를 벗어나면 소멸한다. Request 한 번의 웹 브라우저(클라이언트)의 요청에 대해 같은 요청을 공유하는 페이지가 대응되며 웹 브라우저가 한 번의 요청에 단지 한 개의 페이지만 요청될 수 있고, 같은 request 영역이면 두 개의 페이지가 같은 요청을 공유 한다. include 액션 태그, forward 액션 태그를 사용 시 공유 가능. 생성된 객체는 HttpServletRequest 에 저장 Session 하나의 웹 브라우저 당 1개의 session 객체가 생성된다. 같은 웹 브라우저 내에서는 요청되는 페이지 들은 같 은 객체를 공유한다. 생성된 객체는 HttpSession 에 저장된다. 동일한 클라이언트만 사용가능 Application 하나의 웹 어플리케이션 당 1개의 application 객체가 생성된다. 웹 어플리케이션이 실행되는 동안 서버의 설 정 정보 및 자원에 대한 정보나 이벤트 로그 정보와 관련된 기능을 제공한다. 생성된 객체는 실질적으로는 ServletContext 에 저장된다.
  • 38. JSP 기본객체 request: 클라이언트의 요청 정보를 담고 있는 객체 (스코프: request) 실제 타입: javax.servlet.http.HttpServletRequest 또는 javax.servlet.ServletRequest response: 요청에 대한 응답 정보를 담고 있는 객체 (스코프: page) 실제 타입: javax.servlet.http.HttpServletResponse 또는 javax.servlet.ServletResponse out: 페이지 내용을 담고 있는 출력 스트림 객체 (스코프: page) 실제 타입: javax.servlet.jsp.JspWriter pageContext: JSP 페이지 실행에 필요한 Context 정보를 담고 있는 객체 (스코프: page) 실제 타입: javax.servlet.jsp.PageContext session: 세션 정보를 담고 있는 객체 (스코프: session) 실제 타입: javax.servlet.http.HttpSection application: Context의 모든 페이지가 공유할 데이터를 담고 있는 객체 (스코프: application) 실제 타입: javax.servlet.ServletContext config: JSP 페이지의 서블릿 설정 데이터 초기화 정보 객체 (스코프: page) 실제 타입: javax.servlet.ServletConfig page: JSP 페이지를 구현한 자바 클래스 객체 (스코프: page) 실제 타입: java.lang.Object exception: JSP 페이지의 서블릿 실행 시 처리하지 못한 예외 객체 (스코프: page) 실제 타입: java.lang.Throwable
  • 39. JSP Beans (자바 빈즈) 자바빈즈(java Beans)는 UI에서 서버 측 데이터를 담아서 처리하기 위 한 컴포넌트이다. <jsp:useBean id=“list” scope=“request” class=“java.util.ArrayList” type=“java.util.List”/> <jsp:useBean id=“count” scope=“request” class=“java.lang.String”/> 자바 빈즈는 JSP페이지의 로직 부분을 분리해서 코드를 재사용함으로 프로그램의 효율을 높이기 위해 사용한다. 프로그램의 모듈화는 코드를 재사용하므로 프로그램의 작성기간이 단축되고, 이미 사용되던 코드이므로 안정성이 보장되며 유지/보수가 쉽다. MVC패턴에서 자바 빈은 프로그램 로직을 소유할 수 있고 DB와 연동해서 작업을 처 리한다. 자바 빈즈를 통하여 useBean을 하면 성능에 많은 영향을 미치지는 않지만 너무 많이 사용하면 jsp에서 소요되 는 시간이 증가 할 수 있게 된다. 한 두개의 자바 빈즈를 사용하는 것은 상관없지만 10- 20개의 자바빈즈를 사 용하면 성능에 영향을 주게 되므로 TO(Transfer object)패턴을 사용해야 한다.
  • 40. 태그 라이브러리 (Tag library) 태그라이브러리는 jsp에서 공통적으로 반복되는 코드를 클래스로 만들고 그 클래스를 HTML태그와 같이 정의된 태그로 사용할 수 있도록 하는 라 이브러리다. <%taglib uri=“/tagLibrary” prefix=“myPreFix” /> 태그 라이브러리는 xml 기반의 tld파일과 태그 클래스로 구성되어있다. 태그라이브러리를 사용하기 위해서는 web.xml파일에서 tld와 URI와 파일위치를 정의해야 한다. 태그라이브러리는 태그 사이에 있는 데이터를 넘겨주는데, 이때 넘겨주는 데이터 형태는 대부분 문자열 타 입이다. 따라서 데이터가 많으면 많을수록 처리해야 하는 내용이 많아지고 태그 라이브러리에서 클래스를 처리하는 시간이 많아진다. 따라서 목록을 처리하면서 대용량의 데이터를 처리할 경우에는 태그 라이브러리 의 사용을 자제해야 한다.

Editor's Notes

  1. http://www.nextree.co.kr/p11686/
  2. http://www.nextree.co.kr/p11686/
  3. http://d2.naver.com/helloworld/1329
  4. http://d2.naver.com/helloworld/1329
  5. http://d2.naver.com/helloworld/1329
  6. http://d2.naver.com/helloworld/1329
  7. http://d2.naver.com/helloworld/1329
  8. http://d2.naver.com/helloworld/1329
  9. http://d2.naver.com/helloworld/1329
  10. http://d2.naver.com/helloworld/1329
  11. http://d2.naver.com/helloworld/1329
  12. http://d2.naver.com/helloworld/1329
  13. http://d2.naver.com/helloworld/1329