구성 및 특징 - 출처: https://ko.wikipedia.org/wiki/안드로이드_(운영_체제)

구성 및 특징내용
핸드셋 레이아웃플랫폼은 VGA2D 그래픽스 라이브러리, OpenGL ES 1.0에 기반을 둔 3D 그래픽스 라이브러리를 확장하기에 적응적이다.
저장소데이터 저장 목적의 SQLite 데이터베이스 소프트웨어가 사용됨.
통신안드로이드는 GSM/EDGECDMAEV-DOUMTS블루투스와이파이를 포함하는 커넥션 기술을 지원한다.
메시징SMS와 MMS가 가능.
웹 브라우저오픈 소스인 웹키트 응용 프로그램 프레임워크 기반의 브라우저 지원.
자바 지원자바로 작성된 소프트웨어는 달빅 가상 머신에서 실행 가능한 코드로 컴파일된다. 달빅 가상 머신은 표준 자바 가상 머신은 아니지만 모바일 기기를 위해 설계된 레지스터 기반의 가상 머신이다.안드로이드 4.4 킷캣 부터는 달빅 가상 머신외의 개발자 옵션에서 ART런타임을 선택할 수 있게되었고, 안드로이드 5.0 롤리팝부터는 달빅 가상머신이 ART런타임으로 완전히 교체되었다.
미디어 지원안드로이드는 다음의 오디오/비디오/이미지 포맷을 지원한다: H.263H.264 (3GP 또는 MP4 컨테이너), MPEG-4 SPAMRAMR-WB (3GP 컨테이너), AACHE-AAC (MP4 또는 3GP 컨테이너), MP3미디OGG VorbisWAV,JPEGPNGGIFBMP.
추가 하드웨어 지원안드로이드는 카메라, 터치스크린GPS가속도계자력계트랙볼 2D 그래픽 가속, 3D 그래픽 가속을 활용할 수 있다.
개발 환경기기 에뮬레이터, 디버깅 도구, 메모리와 성능 프로파일링을 포함하는 이클립스 IDE 플러그인인 ADT, 플랫폼 개발 키트인 PDK
마켓

iOS의 앱 스토어와 유사한 구글 플레이는 PC 사용 없이 무선으로 대상 하드웨어로 다운로드와 설치가 가능한 응용 프로그램 목록을 제공. 2011년 2월 허니컴 발표와 함께 웹을 통한 마켓 이용이 가능해졌다. 웹마켓에서는 여러대의 안드로이드 기기를 등록하여 사용할 수 있도록 확장되어 있다.

원래 프리웨어만 지원 되었으나 2009년 2월 19일 부터 유료 애플리케이션도 제공되었다. 별도의 라이선싱, 애플리케이션 안에서 유료 구매를 위한 SDK가 함께 발표되었다.

멀티 터치

안드로이드는 멀티 터치를 기본으로 지원한다. 한때 미국에서 출시되는 모델에 한해서, 애플의 터치스크린 기술 특허 침해를 피하기 위해, 멀티터치 기능이 커널 수준에서 비활성화되었다. 이후에 구글은 넥서스 원드로이드를 위해 멀티터치를 네이티브에서 지원하는 업데이트를 발표하였다.

블루투스핸즈프리 통화(HFP), 음악 재생(A2DP,AVRCP) 기능이 있으며 블루투스를 통한 파일 전송이 버전 2.0에 추가되었다. 이외 ICS 이후로 Bluetooth 4.0 기술인 BluetoothHealth 기능도 추가되었다.

- ADB (Android Debug Bridge)
 : Android SDK로서 Android 장치를 제어하거나 인터페이스할 수 있도록 해주는 툴
 : ADB는 SDK에 포함


구조



안드로이드의 구조는 왼쪽 그림과 같은 구성 요소로 구성되며 이 구성 요소에는 응용 프로그램, 응용 프로그램 프레임워크

이브러리, 안드로이드 런타임리눅스 커널의 총 5개의 계층으로 분류되어 있다.

① Applications: 안드로이드 앱
② Applications Framewrok: 안드로이드 앱이 구동되기 위해 필요한 환경 및 기능을 제공.
③ Libraries: C/C++로 구성된 계층으로 하드웨어를 제공하는 기능 제공
④ Android Runtime: 자바 앱을 동작시키기 위한 런타임 달빅 머신.
⑤ 
리눅스 커널: 프로세스 관리, 메모리 관리, 파일시스템 관리, 디바이스 제어, 네트워크 관리 기능 제공.

안드로이드 앱의 컴파일 과정 - 출처: 이것이 안드로이드다



- java virtual machine 과 dlavik virtual machine 의 차이점(출처: http://i5on9i.blogspot.kr/2013/01/jvm-dvm.html)


JVM
DVM
stack/register
stack basedregister-based
.jar/.dex
jar(.class file 의 묶음)DEX(다른 구조와 opcode 를 가졌다.)
instruction 의 양
stack-based 는 data를 stack에 load 하고 그 data 를 사용할 때 register-based 보다 더 많은 instructions 를 사용해야만 한다.register-based 에서는 instruction 에서 source 와 destination register 만 지정해 주면 된다. 그래서 소스가 더욱 작아질 수 있다.
최종파일
java -> .classjava -> .class -> .dex
.class/.dex
java byte code로 된 .class 파일 실행시켜준다.own byte code로 된 .dex file 을 실행시켜준다.
DVM 은 device 가 여러개의 VM instances 를 효과적으로 실행할 수 있도록 디자인되었다.
low memory에서 동작하도록 디자인

안드로이드 버전



VersionCodenameAPI
2.2Froyo8
2.3.3 -
2.3.7
Gingerbread10
4.0.3 -
4.0.4
Ice Cream Sandwich15
4.1.xJelly Bean16
4.2.x17
4.318
4.4KitKat19
5.0Lollipop21
5.122
6.0Marshmallow

23

리소스 ID

genc 폴더에 R.java는 리소스 객체의 포인터가 아니다. 리소스를 참조할 수 있도록 메모리 주소 대용으로 사용하는 ID

'Programing > Android' 카테고리의 다른 글

안드로이드 - JNI  (0) 2015.12.23
안드로이드 - Init 프로세스  (0) 2015.12.21
안드로이드 - 커널  (0) 2015.12.21
안드로이드 - 뷰  (0) 2015.12.21
안드로이드 - 4대 컴포넌트  (0) 2015.12.21

Java Garbage Collection

지극히 개인적이고 주관적인 판단 기준을 먼저 밝힌다면, 가비지 컬렉션(Garbage Collection, 이하 GC)에 대해 잘 알고 있을수록 실력이 좋은 Java 개발자라고 생각합니다. GC 과정에 관심을 가질 정도라면 규모가 일정 이상인 애플리케이션을 제작해 본 경험이 있을 것입니다. 또, 어떤 GC 알고리즘을 선택할 것인지 고민할 정도면 스스로 제작한 애플리케이션의 특징을 정확히 이해하고 있다고 볼 수 있습니다. 이러한 판단 기준이 보편적이지는 않지만, GC에 대한 이해는 훌륭한 Java 개발자가 되기 위한 필수 조건이라는 데에는 별다른 이견이 없을 것입니다. 이 글에서는 GC 이론을 되도록 쉽게 소개하겠습니다. 피가 되고 살이 되는 글이 되기를 바랍니다.

가비지 컬렉션 과정 - Generational Garbage Collection

GC에 대해서 알아보기 전에 알아야 할 용어가 있다. 바로 'stop-the-world'이다. stop-the-world란, GC을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작한다. 어떤 GC 알고리즘을 사용하더라도 stop-the-world는 발생한다. 대개의 경우 GC 튜닝이란 이 stop-the-world 시간을 줄이는 것이다.

Java는 프로그램 코드에서 메모리를 명시적으로 지정하여 해제하지 않는다. 가끔 명시적으로 해제하려고 해당 객체를 null로 지정하거나 System.gc() 메서드를 호출하는 개발자가 있다. null로 지정하는 것은 큰 문제가 안 되지만, System.gc() 메서드를 호출하는 것은 시스템의 성능에 매우 큰 영향을 끼치므로 System.gc() 메서드는 절대로 사용하면 안 된다(다행히도 NHN에서 System.gc() 메서드를 호출하는 개발자를 보진 못했다).

Java에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에 가비지 컬렉터(Garbage Collector)가 더 이상 필요 없는 (쓰레기) 객체를 찾아 지우는 작업을 한다. 이 가비지 컬렉터는 두 가지 가설 하에 만들어졌다(사실 가설이라기보다는 가정 또는 전제 조건이라 표현하는 것이 맞다).

  • 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
  • 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

이러한 가설을 'weak generational hypothesis'라 한다. 이 가설의 장점을 최대한 살리기 위해서 HotSpot VM에서는 크게 2개로 물리적 공간을 나누었다. 둘로 나눈 공간이 Young 영역과 Old 영역이다.

  • Young 영역(Yong Generation 영역): 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다.
  • Old 영역(Old Generation 영역): 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말한다.

영역별 데이터 흐름을 그림으로 살펴보면 다음과 같다.

JavaGarbage1

그림 1 GC 영역 및 데이터 흐름도

위 그림의 Permanent Generation 영역(이하 Perm 영역)은 Method Area라고도 한다. 객체나 억류(intern)된 문자열 정보를 저장하는 곳이며, Old 영역에서 살아남은 객체가 영원히 남아 있는 곳은 절대 아니다. 이 영역에서 GC가 발생할 수도 있는데, 여기서 GC가 발생해도 Major GC의 횟수에 포함된다.

그렇다면 "Old 영역에 있는 객체가 Young 영역의 객체를 참조하는 경우가 있을 때에는 어떻게 처리될까?"라고 궁금해 하는 분도 더러 있을 것이다. 이러한 경우를 처리하기 위해서 Old 영역에는 512바이트의 덩어리(chunk)로 되어 있는 카드 테이블(card table)이 존재한다.

카드 테이블에는 Old 영역에 있는 객체가 Young 영역의 객체를 참조할 때마다 정보가 표시된다. Young 영역의 GC를 실행할 때에는 Old 영역에 있는 모든 객체의 참조를 확인하지 않고, 이 카드 테이블만 뒤져서 GC 대상인지 식별한다.

JavaGarbage2

그림 2 카드 테이블 구조

카드 테이블은 write barrier를 사용하여 관리한다. write barrier는 Minor GC를 빠르게 할 수 있도록 하는 장치이다. write barrirer때문에 약간의 오버헤드는 발생하지만 전반적인 GC 시간은 줄어들게 된다.

Young 영역의 구성

GC를 이해하기 위해서 객체가 제일 먼저 생성되는 Young 영역부터 알아보자. Young 영역은 3개의 영역으로 나뉜다.

  • Eden 영역
  • Survivor 영역(2개)

Survivor 영역이 2개이기 때문에 총 3개의 영역으로 나뉘는 것이다. 각 영역의 처리 절차를 순서에 따라서 기술하면 다음과 같다.

  • 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
  • Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다.
  • Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓인다.
  • 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 된다.
  • 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.

이 절차를 확인해 보면 알겠지만 Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다. 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 영역 모두 사용량이 0이라면 여러분의 시스템은 정상적인 상황이 아니라고 생각하면 된다.

이렇게 Minor GC를 통해서 Old 영역까지 데이터가 쌓인 것을 간단히 나타내면 다음과 같다.

JavaGarbage3

그림 3 GC 전과 후의 비교

참고로, HotSpot VM에서는 보다 빠른 메모리 할당을 위해서 두 가지 기술을 사용한다. 하나는 bump-the-pointer라는 기술이며, 다른 하나는 TLABs(Thread-Local Allocation Buffers)라는 기술이다.

bump-the-pointer는 Eden 영역에 할당된 마지막 객체를 추적한다. 마지막 객체는 Eden 영역의 맨 위(top)에 있다. 그리고 그 다음에 생성되는 객체가 있으면, 해당 객체의 크기가 Eden 영역에 넣기 적당한지만 확인한다. 만약 해당 객체의 크기가 적당하다고 판정되면 Eden 영역에 넣게 되고, 새로 생성된 객체가 맨 위에 있게 된다. 따라서, 새로운 객체를 생성할 때 마지막에 추가된 객체만 점검하면 되므로 매우 빠르게 메모리 할당이 이루어진다.

그러나 멀티 스레드 환경을 고려하면 이야기가 달라진다. Thread-Safe하기 위해서 만약 여러 스레드에서 사용하는 객체를 Eden 영역에 저장하려면 락(lock)이 발생할 수 밖에 없고, lock-contention 때문에 성능은 매우 떨어지게 될 것이다. HotSpot VM에서 이를 해결한 것이 TLABs이다.

각각의 스레드가 각각의 몫에 해당하는 Eden 영역의 작은 덩어리를 가질 수 있도록 하는 것이다. 각 쓰레드에는 자기가 갖고 있는 TLAB에만 접근할 수 있기 때문에, bump-the-pointer라는 기술을 사용하더라도 아무런 락이 없이 메모리 할당이 가능하다.

간단하게 Young 영역에 대한 GC에 대해서 알아보았다. 위에서 이야기한 두 가지 기술(bump-the-pointer, TLABs)을 반드시 기억하고 있을 필요는 없다. 몰라도 쇠고랑 안차고 경찰 출동 안한다. 그러나 Eden 영역에 최초로 객체가 만들어지고, Survivor 영역을 통해서 Old 영역으로 오래 살아남은 객체가 이동한다는 사실은 꼭 기억하기 바란다.

Old 영역에 대한 GC

Old 영역은 기본적으로 데이터가 가득 차면 GC를 실행한다. GC 방식에 따라서 처리 절차가 달라지므로, 어떤 GC 방식이 있는지 살펴보면 이해가 쉬울 것이다. GC 방식은 JDK 7을 기준으로 5가지 방식이 있다.

  • Serial GC
  • Parallel GC
  • Parallel Old GC(Parallel Compacting GC)
  • Concurrent Mark & Sweep GC(이하 CMS)
  • G1(Garbage First) GC

이 중에서 운영 서버에서 절대 사용하면 안 되는 방식이 Serial GC다. Serial GC는 데스크톱의 CPU 코어가 하나만 있을 때 사용하기 위해서 만든 방식이다. Serial GC를 사용하면 애플리케이션의 성능이 많이 떨어진다.

그럼 각 GC 방식에 대해서 살펴보자.

Serial GC (-XX:+UseSerialGC)

Young 영역에서의 GC는 앞 절에서 설명한 방식을 사용한다. Old 영역의 GC는 mark-sweep-compact이라는 알고리즘을 사용한다. 이 알고리즘의 첫 단계는 Old 영역에 살아 있는 객체를 식별(Mark)하는 것이다. 그 다음에는 힙(heap)의 앞 부분부터 확인하여 살아 있는 것만 남긴다(Sweep). 마지막 단계에서는 각 객체들이 연속되게 쌓이도록 힙의 가장 앞 부분부터 채워서 객체가 존재하는 부분과 객체가 없는 부분으로 나눈다(Compaction).

Serial GC는 적은 메모리와 CPU 코어 개수가 적을 때 적합한 방식이다.

Parallel GC (-XX:+UseParallelGC)

Parallel GC는 Serial GC와 기본적인 알고리즘은 같지다. 그러나 Serial GC는 GC를 처리하는 스레드가 하나인 것에 비해, Parallel GC는 GC를 처리하는 쓰레드가 여러 개이다. 그렇기 때문에 Serial GC보다 빠른게 객체를 처리할 수 있다. Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 유리하다. Parallel GC는 Throughput GC라고도 부른다.

다음 그림은 Serial GC와 Parallel GC의 스레드를 비교한 그림이다.JavaGarbage4

그림 4 Serial GC와 Parallel GC의 차이 (이미지 출처: "Java Performance", p. 86)

Parallel Old GC(-XX:+UseParallelOldGC)

Parallel Old GC는 JDK 5 update 6부터 제공한 GC 방식이다. 앞서 설명한 Parallel GC와 비교하여 Old 영역의 GC 알고리즘만 다르다. 이 방식은 Mark-Summary-Compaction 단계를 거친다. Summary 단계는 앞서 GC를 수행한 영역에 대해서 별도로 살아 있는 객체를 식별한다는 점에서 Mark-Sweep-Compaction 알고리즘의 Sweep 단계와 다르며, 약간 더 복잡한 단계를 거친다.

CMS GC (-XX:+UseConcMarkSweepGC)

다음 그림은 Serial GC와 CMS GC의 절차를 비교한 그림이다. 그림에서 보듯이 CMS GC는 지금까지 설명한 GC 방식보다 더 복잡하다.

JavaGarbage5

그림 5 Serial GC와 CMS GC(이미지 출처)

초기 Initial Mark 단계에서는 클래스 로더에서 가장 가까운 객체 중 살아 있는 객체만 찾는 것으로 끝낸다. 따라서, 멈추는 시간은 매우 짧다. 그리고 Concurrent Mark 단계에서는 방금 살아있다고 확인한 객체에서 참조하고 있는 객체들을 따라가면서 확인한다. 이 단계의 특징은 다른 스레드가 실행 중인 상태에서 동시에 진행된다는 것이다.

그 다음 Remark 단계에서는 Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인한다. 마지막으로 Concurrent Sweep 단계에서는 쓰레기를 정리하는 작업을 실행한다. 이 작업도 다른 스레드가 실행되고 있는 상황에서 진행한다.

이러한 단계로 진행되는 GC 방식이기 때문에 stop-the-world 시간이 매우 짧다. 모든 애플리케이션의 응답 속도가 매우 중요할 때 CMS GC를 사용하며, Low Latency GC라고도 부른다.

그런데 CMS GC는 stop-the-world 시간이 짧다는 장점에 반해 다음과 같은 단점이 존재한다.

  • 다른 GC 방식보다 메모리와 CPU를 더 많이 사용한다.
  • Compaction 단계가 기본적으로 제공되지 않는다.

따라서, CMS GC를 사용할 때에는 신중히 검토한 후에 사용해야 한다. 그리고 조각난 메모리가 많아 Compaction 작업을 실행하면 다른 GC 방식의 stop-the-world 시간보다 stop-the-world 시간이 더 길기 때문에 Compaction 작업이 얼마나 자주, 오랫동안 수행되는지 확인해야 한다.

G1 GC

마지막으로 G1(Garbage First) GC에 대해서 알아보자. G1 GC를 이해하려면 지금까지의 Young 영역과 Old 영역에 대해서는 잊는 것이 좋다.

다음 그림에서 보다시피, G1 GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다. 그러다가, 해당 영역이 꽉 차면 다른 영역에서 객체를 할당하고 GC를 실행한다. 즉, 지금까지 설명한 Young의 세가지 영역에서 데이터가 Old 영역으로 이동하는 단계가 사라진 GC 방식이라고 이해하면 된다. G1 GC는 장기적으로 말도 많고 탈도 많은 CMS GC를 대체하기 위해서 만들어 졌다.JavaGarbage6

그림 6 G1 GC의 레이아웃(이미지 출처: "The Garbage-First Garbage Collector" (TS-5419), JavaOne 2008, p. 19)

G1 GC의 가장 큰 장점은 성능이다. 지금까지 설명한 어떤 GC 방식보다도 빠르다. 하지만, JDK 6에서는 G1 GC를 early access라고 부르며 그냥 시험삼아 사용할 수만 있도록 한다. 그리고 JDK 7에서 정식으로 G1 GC를 포함하여 제공한다.

그러나 JDK 7을 실서비스에서 사용하려면 많은 검증 기간(1년은 필요하다는 생각이다)을 거쳐야 할 것으로 보이기 때문에, G1 GC를 당장 사용하고 싶어도 더 기다리는 것이 좋다는 것이 개인적인 생각이다. JDK 6에서 G1 GC를 적용했다가 JVM Crash가 발생했다는 말도 몇 번 들었기에 더더욱 안정화될 때까지 기다리는 것이 좋겠다.

마치며

이번 글에서는 Java의 GC에 대해서 아주 간단하게(?) 살펴보았다. 다음 글에서는 Java의 GC 상황을 모니터링하는 방법과 GC 튜닝 방법을 알아볼 예정이다.

마지막으로 한 가지 더 말하고 싶은 것이 있다. 어떤 서비스에서 A라는 GC 옵션을 적용해서 잘 동작한다고 그 GC 옵션이 다른 서비스에서도 훌륭하게 적용되어 최적의 효과를 볼 수 있다고 생각하지 말라는 것이다.

만약 애플리케이션에서 만들어지는 모든 객체의 크기와 종류가 같다면 회사에서 사용하는 모든 WAS의 GC 옵션을 동일하게 설정할 수 있다. 하지만, 각 서비스의 WAS에서 생성하는 객체의 크기와 생존 주기가 모두 다르고, 장비의 종류도 다양하다. WAS의 스레드 개수와 장비당 WAS 인스턴스 개수, GC 옵션 등은 지속적인 튜닝과 모니터링을 통해서 해당 서비스에 가장 적합한 값을 찾아야 한다. 이 이야기는 필자의 경험에서 나온 이야기가 아니고, 2010년 JavaOne에서 Oracle JVM을 만드는 엔지니어들이 한 말이다.

참고 자료

이 글의 내용과 그림은 다음의 자료를 참고했다.

출처: http://d2.naver.com/helloworld/1329


'Programing > Java' 카테고리의 다른 글

Java Reference와 GC  (0) 2016.02.29
Effective Java - Reference  (0) 2016.02.29
Wrapper클래스,박싱(boxing),언박싱(unboxing)  (0) 2015.11.15
Collection  (0) 2015.11.15
JAVA 실행 과정  (0) 2015.11.14

 자바에는 int, double과 같은 기본형 자료형(primitive type)의 포장 클래스(wrapper class)가 있어서 기본형을 객체로 다루어야 할 경우에 사용할 수 있다. 다음 표에서와 같이 포장 클래스명은 기본형의 첫 문자를 대문자로 바꾸면 된다.( char형과 int형만 이름이 다르다.)


[표 1] 포장 클래스

기본형

포장 클래스

생성 예

boolean

Boolean

Boolean bA = new Boolean(true);

Boolean bB = new Boolean(“false”);

char

Character

Character cA = new Character(‘a’);

byte

Byte

Byte byA = new Byte(10);

Byte byB = new Byte(“127”);

short

Short

Short sA = new Short(1234);

Short sB = new Short(“1234”);

int

Integer

Integer iA = new Integer(1234);

Integer iB = new Integer(“1234”);

long

Long

Long lA = new Long(1234);

Long lB = new Long(“1234”);

float

Float

Float fA = new Float(12.34f);

Float fB = new Float(“12.34f”);

double

Double

Double dA = new Double(12.34);

Double dB = new Double(“12.34”);


생성자는 위와 같이 해당하는 기본형 값을 줄 수도 있고 문자열로 줄 수도 있다. 문자열로 주는 경우 해당 데이터형의 형식에 맞아야 한다.


 박싱(boxing)이란 기본형을 참조형으로 변환하는 것이고 언박싱(unboxing)이란 반대로 참조형을 기본형으로 바꾸는 것이다. 그리고 JDK 1.5부터는 이것을 자동으로 해주는 기능이 추가되었다.


package tut02;
public class Tut02 {
   public static void main(String[] args) {
       Integer iA = new Integer(123);
       Integer iB = new Integer(123);
       
       int ia = (int)iA; //(1) 언박싱(unboxing)
       int ib = iB; //(2) 오토언박싱(auto unboxing)
       Integer iC = (Integer)456; //(3)박싱(boxing)
       Integer iD = ia; //(4)오토 박싱(auto boxing)
   }
}


위 예세서 (1)은 명시적으로 언박싱을 해주는 것이고 (2)는 자동으로 수행해 주는 것이다. 박싱의 경우도 자동으로 처리해 준다. 오토박싱과 오토언박싱은 대응되는 자료형 사이에만 일어난다는 점도 유의해야 한다.


 포장 클래스 객체간 연산도 가능하며 기본형과 포장형 간 연산도 가능하다.


package tut02;
public class Tut02 {
   public static void main(String[] args) {
       Integer iA = new Integer(123);
       Integer iB = new Integer(123);
       
       int ia = (int)iA; //(1) 언박싱(unboxing)
       int ib = iB; //(2) 오토언박싱(auto unboxing)
       Integer iC = (Integer)456; //(3)박생(boxing)
       Integer iD = ia; //(4)오토 박싱(auto boxing)
       
       Integer iE = iA + iB; // 포장형끼리의 연산
       Integer iF = ia - ib; // 기본형끼리의 연산 결과를 오토박싱
       int ic = ia * iB; // 기본형과 포장형 간 연산
   }
}


자바에서는 연산자가 오버로딩되지 않는다는 점을 생각하면 의아할 것이다. 하지만 이 코드는 내부적으로 포장형인 피연산자가 오토언박싱 되어서 기본형 끼리의 연산으로 수행되는 것이라고 이해할 수 있다.


 비교 연산도 가능하지만 내용물의 동치 여부를 검사할 때 ==기호대신 equals() 메소드를 이용해야 한다.


package tut02;
public class Tut02 {
   public static void main(String[] args) {
       Integer ia = new Integer(123);
       Integer ib = new Integer(123);
       Integer ic = new Integer(456);
       System.out.println("ia>=ib:"+(ia>=ib));
       System.out.println("ib>=ic:"+(ib>=ic));
       System.out.println("ia==ib:"+(ia==ib));
       System.out.println("ia.equals(ib):"+ia.equals(ib));
   }
}


ia>=ib:true
ib>=ic:false
ia==ib:false
ia.equals(ib):true


왜냐면 포장형고 객체이기 때문에 ==연산은 두 객체 인스턴스의 참조(주소값)을 비교하게 되는 것이다. 내용물의 동치 여부는 문자열 객체와 마찬가지로 equals() 메소드를 이용해야 한다.


출처: http://studymake.tistory.com/420

'Programing > Java' 카테고리의 다른 글

Effective Java - Reference  (0) 2016.02.29
Garbage Collection  (0) 2015.11.15
Collection  (0) 2015.11.15
JAVA 실행 과정  (0) 2015.11.14
JVM, JRE, JDK의 차이  (0) 2015.10.11

  1. Collection

    Collection 인터페이스를 상속받아 List와 Set 인터페이스가 된다. List는 순서가 있는 Collection, 그리고 List는 Data 중복을 허락한다. 하지만 Set은 순서의 의미가 없으며 Data를 중복해서 포함할 수 없다.

  • List 인터페이스의 특징
    • 순서가 있는 Collection.(이 순서는 삽입된 순서를 의미한다.)
    • Data를 중복해서 포함할 수 있다.
    • Stack의 특징
      • Data의 삽입과 추출이 후입선출(Last-In First-Out) 구조로 되어 있다.
      • push() method : Data 삽입할 때 사용
      • pop() method : Data 추출할 때 사용
      • peek() method : 추출할 Data를 삭제하지 않고 Data만을 가져 올 때 사용
      • search() method : Stack으로부터 Data를 검색할 때 사용
    • Vector의 특징
      • 자동으로 동기화를 보장해준다.
      • ArrayList에 동기화가 보장되도록 최적화한 클래스이다.
      • JAVA 5.0 이 후로는 AutoBoxing/AutoUnBoxing을 지원한다.
        • AutoBoxing이란? 기본 Data 타입을 Wrapper 클래스형의 객체로 자동으로 변환해주는 기능. AutoUnBoxing은 AutoBoxing의 반대 개념
        • JAVA 1.4까지

Vector v = new Vector();
v.addElement(new Integer(100));

  • JAVA 5.0이후

Vector v = new Vector();
v.addElement(100); // AutoBoxing 발생, 자동으로 Wrapper class인 Integer로 변경

  • addElement() method : Data를 삽입할 때 사용
  • elementAt() method : Data를 추출할 때 사용, Index에 해당하는 객체를 얻어냄
  • size() method : Vector 내에 존재하는 객체의 수를 얻어낼 대 사용
  • insertElementAt() method : Vector 내에 중간 삽입할 때 사용
  • setElementAt() method : Vector 내에 존재하는 Data를 수정할 때 사용
  • indexOf() method : Vector 내에 Data를 검색할 때 사용, Index를 반환
  • contains() method : Data의 존재 유무를 알기 위해 사용.
  • ArrayList의 특징
    • 동기화를 보장해주지 않는다.
    • 배열에 동적 메모리 증가 기능을 구현한 클래스이다.
    • 동기화 지원 방법 : List list = Collections.synchronizeList(new ArrayList(…));
    • add() method : Data 삽입할 때 사용
    • get(0 method : Data 추출할 때 사용
    • toArray() method : ArrayList로부터 배열 얻어낼 때 사용
    • contains() method : Data의 존재 유무를 알기 위해 사용
    • size() method : ArrayList의 요소 개수를 얻어낼 때 사용
  • Set 인터페이스의 특징
    • 집합적인 개념의 Collection
    • 순서의 의미가 없다.
    • Data를 중복해서 포함할 수 없다.
    • HashSet의 특징
      • add() method : Data 삽입할 때 사용
      • next() method : Data 추출할 때 사용
        • HashSet의 Data 추출은 Iterator을 이용하면 된다. Iterator는 Collection내의 모든 Data에 접근할 수 있는 특징이 있다. 그리고 Data의 마지막에 상관하지 않고 검색하기 위한 인터페이스이다. Set의 Iterator() method로 Iterator를 얻어 낼 수 있으며, Iterator의 hasNext() method를 이용해서 Data 끝을 만날 때까지 next() method를 호출해서 Data를 추출할 수 있다.

Iterator<String iter = set.iterator();
while(iter.hasNext()) {
String temp = iter.next();

System.out.print(temp + ", ");
}

  • remove() method : Data를 삭제할 때 사용
  • contains() method : Data의 포함여부를 알기 위해 사용
  • size() method : HashSet의 요소 개수를 얻어낼 때 사용

       

  1. Map

    List와 Set이 순서나 집합적인 개념의 인터페이스라면 Map은 검색의 개념이 가미된 인터페이스이다. Map 인터페이스는 데이터를 삽입할 때 Key와 Value의 형태로 삽입되며, Key를 이용해서 Value를 얻을 수 있다.

  • Hashtable, HashMap의 공통점
    • 내부적으로 모두 Hash 기법을 이용한다.
    • Map 인터페이스를 구현하고 있다.
    • Key와 Value를 이용해서 Data를 관리한다.
  • Hashtable, HashMap의 차이점
    • Hashtable은 동기화가 보장된다.
    • HashMap은 동기화가 보장되지 않는다.
    • HashMap의 동기화 지원 방법 : Map m = Collections.synchronizedMap(New HashMap(…));
  • Hashtable, HashMap과 HashSet과의 관계
    • Hashtable과 HashMap은 둘 다 Map 인터페이스를 구현하고 있다.
    • HashSet은 내부적으로 Hash기법을 사용하지만 Set인터페이스를 구현하고 있다.
  • HashMap
    • 객체 생성 : Map<String, Integer> map = new HashMap<String, Integer>();
    • put() method : Data 삽입할 때 사용
    • get() method : Data를 추출할 때 사용, argument값은 Key를 사용
  • Hashtable
    • 객체 생성 : Hashtable<String, Object> h = new Hashtable<String, Object>();
    • put() method : Data 삽입할 때 사용
    • get() method : Data를 추출할 때 사용, argument값은 Key를 사용

   

  1. Sorted

    Set과 Map 인터페이스를 상속받아 정렬 기능이 추가된 SortedSet과 SortedMap 인터페이스가 된다. 그리고 이들은 각각 TreeSet 클래스와 TreeMap 클래스로 구성된다. TreeSet과 TreeMap은 Set과 Map의 기능을 가지고 있으면서 정렬 기능이 가미되었다는 것이 특징이다.

  • Sorted를 지원하지 않는 클래스
    • HashSet, HashMap
  • Sorted를 지원하는 클래스
    • TreeSet, TreeMap
  • TreeMap
    • Key와 Value로 Data를 관리
    • Key를 기준으로 오름차순으로 정렬된다.
    • Map 인터페이스를 상속한 SortedMap 인터페이스를 구현한 클래스
  • TreeSet
    • Set 인터페이스를 상속한 SortedSet 인터페이스를 구현한 클래스
    • 데이터들이 자동으로 오름차순으로 정렬된다.
  • Comparator
    • TreeSet과 TreeMap은 사용자가 직접 정렬의 방식을 지정할 수 있다.
    • TreeSet과 TreeMap은 정렬을 위한 Comparator 인터페이스를 구현하면 된다.
    • TreeSet에 Data를 집어 넣으면 기본적으로 오름차순(Ascending) 정렬이 되지만 그것도 문자열이나 기본 데이터 타입과 같은 단순한 것에만 해당된다. 이에 사용자가 직접 비교법을 넣어주기 위해 사용하는 것이 Comparator 인터페이스이다.
    • Comparator의 구현 방법 : Comparator 내부에 compare() method를 구현하면 된다.

class Mycomparator<T> implements Comparator<T> {
public int compare(T o1, T o2) {
// 비교방법 구현
}

  • Comparator가 추가된 TreeSet의 생성

TreeSet<Score> tset = new TreeSet<Score>(new MyComparator<Score>());

  • Comparator가 추가된 TreeMap의 생성

TreeMap<Score, String> tset = new TreeMap<Score, String>(new MyComparator<Score>());

  • 일반적인 정렬기능의 사용
    • HashSet이나 HashMap을 정렬 기능이 지원되는 TreeSet이나 TreeMap으로 변환해서 사용
    • HashSet을 이용한 TreeSet 생성

Set<String> set = new HashSet<String>();
...
TreeSet<String> ts = new TreeSet<String>();
ts.addAll(set);

  • HashMap을 이용한 TreeMap 생성

Map<String, Integer> map = new HashMap<String, Integer>();
...
Map<String, Integer> sortedMap = new TreeMap<String, Integer>();
sortedMap.putAll(map);


출처: http://withwani.tistory.com/150

'Programing > Java' 카테고리의 다른 글

Effective Java - Reference  (0) 2016.02.29
Garbage Collection  (0) 2015.11.15
Wrapper클래스,박싱(boxing),언박싱(unboxing)  (0) 2015.11.15
JAVA 실행 과정  (0) 2015.11.14
JVM, JRE, JDK의 차이  (0) 2015.10.11

출처: http://loveinsky.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-1-2


앞에서 JAVA 에 대한 개략적인 특징들을 알아보았다. 그 개략적인 특징들을 중심으로 이제부터는 JAVA 의 세심한 부분에서의 특징들을 분석할 것인데, 우선 첫번째로 JAVA Development 과정을 알아볼 것이다. 어떻게 작성하고, 어떤 방식으로 '소스 코드'가 해석되고, 그 해석된 코드는 어떤 방식으로 실행되는지 전반적인 과정을 이번 1 (2) 에서 알아보고, 다음 글인 2 장에서 부터는 다른 언어와 차별화를 두는 JAVA의 특성인 '객체 지향성(Object-Oriented)'의 특성들에 대해 알아보자.

 

우선 컴퓨터 언어는 3 가지 종류로 분류된다.

   저수준 언어 (Low-Level)

 

1) 기계어 (Machine Language) : 0101 와 같이 오직 컴퓨터만 이해하는 언어로 CPU에 내장된 명령들을 직접 사용하는 것으로, 수행시간이 빠르다. 기종마다 기계어가 다르기 때문에 언어의 호환성이 없다. 반면에 Java의 경우는 위에서 설명하였듯이 JVM을 이용해 '바이너리 코드'를 각 기계에 맞게 실행시켜준다. 

 

2) 어셈블리어 (Assembly Language) 단순한 언어로 기계어와 고수준 언어 중간지점 개념의 언어. 기계어와 1:1로 대응되는 기호로 이루어진 언어로 이도 기계어와 마찬가지로 언어의 호환성이 없다.

 

   고수준 언어 (High-Level)

 

3) 고수준 언어 (High-Level) - C, C++, C#, Java 등 인간이 실생활에서 사용하는 자연어와 비슷한 형태와 구조를 갖는다. 실행을 하기 위해서는 컴퓨터가 이해할 수 있는 기계어로 반드시 해석(Translate)되야하는데, Translate 하는 프로그램에는 컴파일러나 인터프리터가 사용된다.

 

   + 추가. JAVA 언어에 대한 개략적인 역사

 

- C  C++ 의 역사 : 진화 과정 : C à C++ à JAVA

 현대에는 일반적인 목적을 지닌 운영 시스템들을 위한 거의 모든 코드들은 C나 C++로 작성된다.

 

C

Originally implemented in 1972 

UNIX 운영 체제 개발 언어로 널리 알려져있다.

 

C++

An extension of C Developed by Bjarne Stroustrup in the early 1980s at Bell Laboratories

객체 지향 프로그래밍의 능력을 제공해준다.

 

 

- Java 의 역사 

 

1991

썬 마이크로시스템의 James Gosling 는 C++을 기반으로한 Java를 만들었다.

 

1993

Web이 급 성장함과 동시에, Web에서 많이 사용하는 Java가 유명해졌다.

이렇게 해서 Java 가 우선적으로 웹 애플리케이션 작성도구로 유명해졌다.

 

– 인터넷 & 웹 개발

– 모바일 애플리케이션과 운영체제 (안드로이드)

– 임베디드 소프트웨어

– 거대한 소프트웨어 (Enterprise Software)
 

 

컴파일러와 인터프리터는 무엇인가? 간단하게 설명하자면, 고수준 언어를 저수준 언어인 기계어로 바꾸어주는 것이다. 이렇게 번역된 프로그램은 0101과 같은 기계어로 구성되어있으며, 일반적으로는 Object Program (목적 프로그램 / .obj 또는 .o) 이라고 부르며, Java에서는 Class Program (클래스 프로그램 / .class) 이라고 부른다. 컴파일러와 인터프리터는 이렇게 기계어로 바꾸어주는 똑같은 목적을 지녔지만, 방법면에서는 이 두 방법을 따로 분류시킬 정도의 상이한 차이를 보인다.

 

1. 컴파일러 Compiler
- 컴파일러는 '고수준 언어'를 읽어내어 '목적 프로그램'으로 번역한 후, Linking 작업을 통해 컴퓨터에서 실행 가능한 실행 프로그램인 ‘기계어 프로그램’을 만들어낸다. 아래 그림에서 점선 박스 안에 있는 과정이 컴파일러의 '컴파일' 과정이다.

 

Source ( 고수준언어로 작성된 소스 프로그램 ) ]

|

<Compiler (컴파일러) : Sourse를 Compile 한다.>

|

Object ( 기계어(저수준언어)로 작성된 목적 프로그램) ]

|

<Linker (링커) : Object들을 Link 한다.>

|

Execute ( 기계어들을 각자 의미에 맞게 Link시킨 최종 실행 프로그램 ) ]

 

 

 

2. 인터프리터 Interpreter

- 인터프리터는 ‘고수준 언어 프로그램’을 직접적으로 바로 실행 한다. 그렇기 때문에 목적 프로그램을 만들지 않는다.프로그램을 '인터프리트'하는 것은 그 프로그램의 ‘기계어(기계 코드) 프로그램’을 실행하는 것 보다 느리다. 아래 점선 박스 안에 있는 것이 인터프리터의 과정이다.

 

Source ( 소스 프로그램에서 '한 줄'만 ) ]

|

<Interpreter (인터프리터) : Sourse에서 '한 줄'의 고수준 언어를 Interpret 한다.>

< Object. 목적 프로그램을 거치지 않고, paser에 의해 자동 parsing 된 후 바로 실행된다. >

|

Execute* ( *작은 의미에서의 실행. 즉 '한 줄'에 대한 실행만을 뜻한다. ) ]

|

< 이 과정을 계속해서 반복한다. C 언어에서의 디버깅과 유사 >

 

인터프리터가 컴파일러에 비해 실행 속도가 느린 이유는 '기계어 프로그램'는 모든 순서 처리와 기타 다른 요소들을 다 정리한 후에 '목적 파일'이라는 하나의 통 파일로 제작된 것이기 때문이다. 기계어들이 처음부터 끝까지 정리된 상태에서 실행하는 것과, 기계어를 처음부터 끝까지 한 줄, 한 줄 해석해 나가는 것이 상식적으로 느리다. 추가적으로 컴파일러는 번역속도 면에서는 인터프리터 보다 느리다. 이유는 위와 같다. 한 줄을 번역하는 것이, 전체를 번역하는 것보다 빠른것은 당연하다.

 

 

Java 도 역시 '고수준 언어' 중 하나로, 해석 과정을 거쳐야지 비로소 실행을 할 수 있게된다.

' 그럼, Java 는 컴파일러를 사용하는 컴파일러 언어일까? 인터프리터를 이용하는 인터프리터 언어일까? '

 

 

Java 는 '고수준 언어'이기 때문에 Java 프로그램을 개발하려고 하는 프로그래머들은 어떠한 종류의 프로그램을 개발 하려고하던간에 우선 맨 처음 소스 프로그램을 Java 코드로 작성해야 한다. 이를 프로그래밍의 가장 초기 과정 Edit라 하며 컴파일러와 인터프리터의 사용은 그 다음 과정에서 사용된다. 전체 프로그래밍 과정은 아래와 같다.

 

1. Edit

2. Compile

3. Run ( Interpret )

   - Load

   - Verify

   - Execute  

 

Edit 다음 이 소스 프로그램을 기계어로 바꾸어야 한다. 위 2. 번 Compile을 보면 알 수 있듯이, 이 바꾸는 과정을 Compile 이라고 부르고 이 과정은 Compiler 를 통해 하게된다.

 

Compile 을 하면 .class 라는 확장자를 지닌 'Bytecode 프로그램'이 생겨난다. 그 다음 3. Run 과정에서는 2. Compile해서 나온 'Bytecode 프로그램'을 실행해서 원하는 결과를 출력하기 위하여, JVM 이라는 프로그램을 사용하게 된다. JVM 은 Bytecode 들을 C 언어에서와 같이 따로 Link 같은 결과를 거쳐 .exe 확장자를 가진 '실행 프로그램'과 같은 '결과 프로그램'을 만들지 않고, Bytecode 프로그램에 있는 코드 그대로 한 줄, 한 줄 씩 읽어서 Interpret 방법으로 프로그램을 직접 바로 실행한다. 한 줄 한 줄 씩 Interpret 하는 과정에서 JVM은 사용자 User 가 사용하고 있는 H/W 와 OS 들에 맞추어 Bytecode를 '맞춤 실행' 해준다. 이 '맞춤 실행'은 Java의 큰 특징이기도 하다.

 

 Compile 과정 ( 2. Compile 과정 )

Source ( Java 언어로 짜여진 소스 프로그램 ) ]

|

<Compile : 컴파일, 고수준 언어를 저수준 언어인 기계어로>

|

Class ( Source 프로그램을 기계어로 해석한 Bytecode 프로그램 ]

|

 

 

 Interpret 과정 ( 3. Run 과정 ) 

Class ( Source 프로그램을 기계어로 해석한 Bytecode 프로그램 ]

|

<Interpret : 인터프리트, Bytecode 프로그램인 Class 프로그램을 '한 줄' 단위로 실행>

|

Execute* ( *.exe 확장자와 같은 개별적인 '실행 프로그램'을 만들지 않는다. ]

이유는 .class 확장자를 지닌 Bytecode 프로그램들만 갖고,

어느 OS 든지 JVM 을 이용해 그때 그때 Interpret (즉흥적인 프로그램 실행) 을 하기 때문이다.

 

 

 

Java의 특징 중 하나인 JVM 가 수행하는 Interpret 과정( Run 과정 )은 단순하게 하나의 과정으로 보이지만, 사실은 하나의 과정속에 여러 추가 과정들이 포함되어 있다. Interpret ( Run ) 의 자세한 과정은 다음과 같다.

 

   - Load

Class loader 가 .class 파일들을 primary memory 로 load 하고, 또한 실행하려는 프로그램에 필요한 다른 .class 파일들( C 언어에서 '라이브러리' 처럼 미리 정의 되어있는 클래스들 )도 load 한다.

( 이 .class 파일들은 당신의 시스템에 있는 disk 에서 load 될 수 도있고, 네트워크를 통해서도 load 될 수 있다. )

 

   - Verify

 

.class 파일들이 load 되면, bytecode verifier 가 load 된 class 파일들의 bytecode들을 보안을 위해 검사한다.

( Java 가 서버, 클라이언트 등의 네트워크 애플리케이션에 많이 사용되기 때문에 Verify 기능을 넣었다. Java가 처음 개발될 때, 인터넷에 대한 언어로 개발했었기 때문. 위에 '파란 박스' Java의 역사 참조 )

Java 는 네트워크를 통해 전달된 Java 프로그램들이 컴퓨터, 웜 바이러스등의 이유로 당신의 시스템이나 파일들을 망가트리지 않는다는 점에 대해 강력한 보안을 확신시켜준다.


   - Execute

 

JVM 가 특정 프로그램의 bytecode들을 읽어내 실행한다. JVM 은 가장 초기 버전에는 Interpreter 로써의 역할만을 수행하였지만, 후에 여러 실행 효율에 대한 이야기가 나오자, 성능 향상을 위해 Compiler 를 추가시켰는데, 그것이 Just-In-Time Compiler 이다. 그렇게 해서 최종적으로 JVM 은 Interpreter + JIT Compiler 이들을 혼합하여 사용한다.

 

Interpret 를 수행함과 동시에 bytecode 들을 분석하면서, hot spots ( bytecodes 중에서 자주 실행하는 부분 ) 을 찾는다. hot spots 을 찾으면 JIT Compiler 가 프로그램내에서 반복 실행되는 부분에 대해서 실행중에 기계어 명령으로 변환하여 처리한다. 이런 이유로 JIT Compiler 를 Java HotSpot Compiler 라고도 부르며, bytecodes 들을 제일 컴퓨터에서 하드웨어적인 기계어(underlying computer's machine language)로 컴파일한다. ( bytecode 도 기계어로 컴파일 된 결과였다. 컴파일된 bytecode 를 한번 더 underlying computer's machine language, 아주 하위 단계의 기계어로 컴파일 하는것 ) JVM이 이렇게 가장 하위 단계의 기계어로 컴파일된 부분들을 Interpret 도중에 다시 또 다른 부분에서 맞닥뜨리게 되면, 이미 컴파일 되어있는 (가장 하위 단계의)기계어가 이 부분을 매우 빠르게 실행시켜준다. 이렇게 함으로써 '반복 처리되는 명령어들을 매 명령어 마다 반복 Interpret 해서 발생하는 커다란 비효율성'을 줄일 수 있게 된다.

 

Java 개발에서 Compiler 와 JVM 은 JDK에 포함되어있고, 이는 Oracle 홈페이지에서 언제든지 최신버전을 받을 수 있다. 이 '전체 프로그래밍 과정'을 수행하기 위해서 우리는

 

1. Edit 을 위해 메모장을 사용하고,

2. Compile 을 위한 JDK 를 다운받아서 DOS-MS (cmd.exe) 내에서 컴파일을 수행하고,

3. JDK 에 포함되어있는 JVM 을 이용하여 컴파일되어 새로 생긴 Bytecode 들을 실행해야한다.

 

이렇게 3 가지 과정을 순서대로 각자 수행하기에는 귀찮은 것이 사실이다. 이 과정들을 하나의 프로그램에서 간편하게 처리할 수 있게 해주기 위해, 예전 C 언어의 등장에서 부터 사람들이 쉽게 개발을 할 수 있게 도와주는 많은 '통합 Tool' 들이 많이 존재해 왔다. 에디터, 컴파일러, 실행기, 디버거 등의 개발에 필요한 모든 환경들을 하나로 모아준 것을 Integrated Development Environments (통합 개발 환경, IDEs) 이라고 부른다. 필자가 어렸을 때 읽었던 '터보 C'책에 나온 '터보 C' 라는것도 이 IDE 이며, 현재 사람들이 많이들 사용하는 Visual Studio 등의 Visual 시리즈들도 이 IDE 이다. Java는 현재 시중에 나와 있는 많은 언어 IDE 와는 달리 free IDE 인 Eclipse 가 존재한다. 무료임에도 매우 강력한 환경을 제공해 주기에 사람들이 많이 애용하고, 앞으로 작성할 모든 Java 관련 포스트도 다 Eclipse 를 기반으로 할 것이다.  

 

다음은 JAVA 의 가장 중요한 특징인 객체 지향성 에 대해 살펴볼 것이다. Class 에 대한 내용은 단순히 객체 개념 에서 끝나는 것이 아니라 그에 관련된 기타 다른 내용들도 많기 때문에, 1 장 처럼 2장 - (1), (2) 이런 식으로 나누어서 설명할 생각이다.

'Programing > Java' 카테고리의 다른 글

Effective Java - Reference  (0) 2016.02.29
Garbage Collection  (0) 2015.11.15
Wrapper클래스,박싱(boxing),언박싱(unboxing)  (0) 2015.11.15
Collection  (0) 2015.11.15
JVM, JRE, JDK의 차이  (0) 2015.10.11
  • JSP, MVC 패턴의 등장



  • JSP? JavaServer Pages는 스크립트 언어로서 다음과 같은 특징을 갖고있다.

     - 자바 언어를 기반으로 하는 스크립트 언어로서 자바가 제공하는 기능 그대로 사용 가능(플랫폼에 상관없이 사용 가능)

     - HTTP와 같은 프로토콜에 따라 클라이언트의 요청을 처리하고 응답

     - HTML, XML 등 클라이언트가 요청한 문서를 생성하는 데 주로 사용된다.

     - 서블릿/EJB 등의 엔터프라이즈 기술들과 잘 융합된다.

     - 표현언어, 표현식, 스크립트릿 등 다양한 스크립트 요소와 액션 태그 등을 제공함으로써 보다 쉽게 웹 어플리케이션을 프로그래밍 할 수 있도록 도와준다.

    - 요청 URL과 서블릿 매핑


     - 일반적인 웹 서버 동작 방식


    -
    JSP 동작 방식


     - JSP -> Servlet

     - JSP Lifecycle


'Programing > Jsp' 카테고리의 다른 글

웹 프로그래밍 - 서블릿(2)  (0) 2015.11.03
웹 프로그래밍 - 서블릿(1)  (0) 2015.11.03
웹 프로그래밍 - Apache Tomcat  (0) 2015.11.03
웹 프로그래밍 - 기초  (0) 2015.11.03

- ServletConfig 객체


- ServletContext 객체


- HttpSession 객체











  • 속성











'Programing > Jsp' 카테고리의 다른 글

웹 프로그래밍 - JSP  (0) 2015.11.03
웹 프로그래밍 - 서블릿(1)  (0) 2015.11.03
웹 프로그래밍 - Apache Tomcat  (0) 2015.11.03
웹 프로그래밍 - 기초  (0) 2015.11.03
  • 서블릿? 자바 언어를 개발한 썬에서 웹 개발을 위해 만든 표준이다. 서블릿 규약에 따라 만든 클래스를 서블릿(Servlet)라고 부른다.





    - Servlet 구조


    - Servlet Lifecycle





  • 웹 컨테이너? 웹 어플리케이션을 실행할 수 있는 컨테이너. JSP 컨테이너 + 서블릿 컨테이너 = 웹 컨테이너

웹컨테이너에 대한 이미지 검색결과


  • 컨테이너와 서블릿 동작 방식


  • HttpServletRequest
    : 파라미터, 헤더, 쿠키, 세션, GET/POST, IP 등의 정보를 얻을 수 있는 메서드 존재


  • HTTPServletResponse
    : content 타입, 헤더, 에러값 등을 전달할 수 있는 메서드 존재


'Programing > Jsp' 카테고리의 다른 글

웹 프로그래밍 - JSP  (0) 2015.11.03
웹 프로그래밍 - 서블릿(2)  (0) 2015.11.03
웹 프로그래밍 - Apache Tomcat  (0) 2015.11.03
웹 프로그래밍 - 기초  (0) 2015.11.03
  • Apche Tomcat Server?



  • Apache Tomcat = Apache + Tomcat? X 

 - Apache Tomcat = Tomcat의 WAS기능 + Apache의 웹서비스 데몬 기능

 - Apache Tomcat은 기본적인 HTTP web server 기능을 포함하고 있는 WAS server

  • 성능향상을 위해 Apache와 Tomcat 연동?

 - 과거 톰캣의 Web 서버 기능은 아파치보다 느린 속도처리로 정적인 페이지는 Apache가 처리하고, 동적인 페이지를 Tomcat이 처리, 부하를 분산하는 이유에서 Apache와 Tomcat을 연동하였습니다.

 - 현재는 Tomcat이 많이 발전해 Tomcat 내의 Web 서버가 아파치에 절대 뒤쳐지지 않을만큼의 역할을 수행합니다.

 - Apache와 Tomcat을 연동하여 사용하는 이유는, 아파치 내에서만 설정할 수 있는 부분이라던가 아파치에서 제공하는 유용한 모듈(PHP, ASP 등)들을 톰캣에서 사용할 수 없기 때문입니다.

 - 결과적으로 유연성 위해 연동



출처: http://joont.tistory.com/55

'Programing > Jsp' 카테고리의 다른 글

웹 프로그래밍 - JSP  (0) 2015.11.03
웹 프로그래밍 - 서블릿(2)  (0) 2015.11.03
웹 프로그래밍 - 서블릿(1)  (0) 2015.11.03
웹 프로그래밍 - 기초  (0) 2015.11.03
  • HTML? HyperTextMarkup Language 
     - 웹 페이지를 작성하기 위한 일종의 언어

     - 웹브라우저가 HTML문서를 파싱 후 화면에 출력

     - Tag? HTML에서 사용되는 일종의 명령어

      : 대소문자 구분이 없다.

      : 시작 tag와 종료 tag는 적합한 순서로 nesting되어야 한다.

      : 주석 <!--  -->


  • CSS? Cascading Style Sheets
     - 웹문서에 글꼴, 색상, 여백등을 지정해 줄 수 있는 수단

     - CSS 적용하는 3가지 방법

     ① 외부 스타일 시트(External Style Sheet)

      : <style type="*/css"> ~ </style>

     ② 내부 스타일 시트(Internal Style Sheet)

     : <link rel="stylesheet" href="*.css"> 

     ③ HTML태그내에 스타일 지정(Inline Styles)

     :<p style="color:gray;">이 문단의 색상은 회색으로 지정됩니다.</p>

    -URL: [프로토콜]://[호스트][:포트][경로][파일명[.확장자][쿼리문자열]

    -통신 프로토콜: 서로 다른 기종의 컴퓨터 사이에 자료를 주고받기 위한 약속된 규약
      


  • 웹 어플리케이션 구축을 위해 필요한 구성 요소들



 구성 요소 


 -웹 서버: 웹 브라우저의 요청을 받아서 알맞은 결과를 웹 브라우저에 전송한다. 만약 프로그램 처리가 필요하다면 어플리케이션 서버를 사용하거나 프로그램을 직접 호출하여 결과를 생성한다. 주로 정적인 HTML, 이미지, CSS, 자바 스크립트 파일을 웹브라우저에 제공할 때 웹 서버를 사용한다. (Apache, nginx 등)

 -어플리케이션 서버: 게시글 목록, 로그인 처리와 같은 기능을 실행(처리)하고, 그 결과를 응답으로 웹 서버에 전달한다. (톰캣, JBoss 등)

 -데이터베이스: 웹 어플리케이션이 필요로 하는 데이터를 저장한다. (오라클, MYSQL, MSSQL 등)

 -웹 브라우저: 웹 서버에 서비스 실행을 요청하며, 웹 서버의 처리 결과를 사용자에게 보여준다. (인터넷 익스플로러, 구글 크롬, 파이어 폭스 등)



  • Server-side Conding



 - CGI(Common Gateway Interface) 방식: 요청마다 매번 메모리에 프로그램 로딩


 - 어플리케이션 서버 방식 : 메모리에 한 번만 로딩

 비교항목

실행코드 방식 

스크립트 방식 

코드 형태

컴파일 된 실행 프로그램 

컴파일 되지 않은 스크립트 코드 

실행 방식

컴파일 된 기계어 코드 직접 실행 

스크립트 코드를 해석한 뒤 실행 

코드 변경

소스 코드를 다시 컴파일 해야 함 

스크립트 코드만 고치면 됨  

종류

C 기반 CGI 프로그램 

JSP, ASP.net, PHP, Ruby  





스크립트 코드 번역은 최초 요청에 대해서 한 번만 발생하며, 이후의 요청에 대해서는 번역 과정 없이 앞서 번역된 코드를 실행하도록 함으로써 번역 횟수를 최소화 하고 있다.









'Programing > Jsp' 카테고리의 다른 글

웹 프로그래밍 - JSP  (0) 2015.11.03
웹 프로그래밍 - 서블릿(2)  (0) 2015.11.03
웹 프로그래밍 - 서블릿(1)  (0) 2015.11.03
웹 프로그래밍 - Apache Tomcat  (0) 2015.11.03

+ Recent posts