Why is main() in java void?

http://stackoverflow.com/questions/540396/why-is-main-in-java-void

 

Q.

In the case of languages with a C-like syntax, we declare the main() method to return an int or float value (or void). Is it possible to declare a non-void return type from main() in Java? If not, then why not? Does this mean that a Java program doesn't return any value to the OS?

A - 1.

The main() method must indeed have a void return type. From the Java Language Specification on "Execution - Virtual Machine Start-Up" (§12.1.4):

The method main must be declared public, static, and void. It must accept a single argument that is an array of strings.

It goes on to describe when a program exits in "Execution - Program Exit" (§12.8):

A program terminates all its activity and exits when one of two things happens:

  • All the threads that are not daemon threads terminate.
  • Some thread invokes the exit method of class Runtime or class System and the exit operation is not forbidden by the security manager.

In other words, the program may exit before or after the main method finishes; a return value from main would therefore be meaningless. If you want the program to return a status code, call one of the following methods (note that all three methods never return normally):

Of the three, System.exit() is the conventional and most convenient way to terminate the JVM.

 

A - 2.

This is an interesting discussion on velocityreviews on the same topic:

Highlight:

Incidentally, this is considered bad style in C and C++ just because it's the wrong signature for main, not for any universal reason independent of programming languages. It's one of those things that is not really supposed to work, but might on your implementation.

In Java, the reason main returns void is threads. C and C++ were both designed as languages before multithreading was a widely known technique, and both had threads grafted onto them at a later date. Java was designed from the beginning to be a multithreaded environment, and frankly, it would be unusual to write any non-trivial Java application that doesn't use more than one thread. So the idea that a program moves linearly from the beginning to the end of main is a bit outdated.

written by

www.designacourse.com The Easiest Way to Train Anyone... Anywhere. Chris Smith - Lead Software Developer/Technical Trainer MindIQ Corporation

 

 

Posted by 하늘_

 

Posted by 하늘_

 

Posted by 하늘_

 

JAVA 를 대표할 특징이자 JAVA 프로그래밍의 기초는 무엇보다도 '객체 지향성' (Object-Oriented) 이다.

 

객체 지향이란 프로그램의 기능을 그룹별로 나누고, 이것을 조합하여 프로그램을 작성해 나간다는 개념이다. 이 특징을 지닌 Java를 이용하여 보다 복잡하고 수준 높은 프로그램을 만들 수 있다.

 

하나의 모든 제작흐름을 쪼개어 각 부서에 할당하는 산업사회에서의 분업화와 같다.

자동차 제작을 타이어 제작, 차체 제작, 도색, 조립작업 등 각 부서로 나누어, 둥근 타이어를 착용했다가 삼각형의 타이어를 자동차에 장착시켜 제작하고 싶으면, '타이어 제작' 부서에 있는 둥근 타이어를 모두 삼각형의 타이어로만 교체해주면 된다. 이렇게 모든 작업들이 부분 부분으로 묶여서 하나의 파츠가 되는것이다.

 

JAVA 의 이러한 객체 지향성을 이용하여, 작성한 프로그래밍 언어들을 부서로 나누어 마치 프로그래밍을 레고 조립하듯이 각자의 행동들을 묶어서 복합적인 행동(최종적인 결과물)으로 만들 수 있다.

 

Java 의 '객체 지향성'의 핵심은 Class 클래스와 Object 오브젝트이다.

 

 

Class 는 부서 내부의 구성원의 직급은 무엇무엇이 있으며, 각 구성원들의 행위에 대한 정의의 모음이다.

쉽게 생각하면 부서의 세세한 내용들(detail)에 대한 정의에 불가한 설계도의 개념이다. 클래스에는 2 가지의 정의가 있다. 하나는 '필드'라고 불리우는 데이터(data, 변수와 같은 것들)나머지 하나는 '메소드'라 불리우는 처리동작(함수, function) 이다. 이 둘을 합쳐 Class 의 '멤버'라고 부른다.

 

1. 부서 내부의 직급 (필드) :

사원, 대리, 과장, 차장, 부장, 사장

 

2. 구성원들의 행위에 대한 정의 (메소드) :

사원은 대리에게 항상 A 계획서를 제출

대리는 과장에게 항상 A 계획서의 정리본을 제출

 

 

 

Object 는 Class 에서 정의된 직급 등의 세세한 내용들을 실제로 적용하는 것이다. 이를 '실체화' 라고 하며 전문용어로 '인스턴스화' 라고 한다. Class 는 설계도 틀 (실제로 구현된것이 아닌 추상화 지도), Object 는 그 설계도 틀을 기반으로 우리가 필요한 의도에 맞게 만들어낸 실체인것이다. 그렇기 때문에 Class는 그 자체로 우리가 사용할 수 없으며, Object로 꼭 실체화를 해주어야지 이용 가능하다.

 

같은 Class 를 이용하더라도 각자 다른 값들을 넣을 수 있으므로 Object 는 유저가 원하는 만큼 무한대로 만들어 낼 수 있다. Class 라는 여러 행위들이 정해진 기계를 이용해 물품을 반복적으로 찍어내는 것과 같다.

 

인스턴스(Instance)는 추상화 개념, 클래스 객체, 컴퓨터 프로세스 등과 같은 틀(template)이 실제 구현된것.

 

1. 부서 내부의 직급에 해당하는 구성원 (필드) :

사원 - 김xx, 진xx, 허xx, 대리 - 이xx, 과장 - 정xx 등등... 

사원은 3명, 대리는 1명, 과장은 1명 등등...

이렇게 각 직급의 사람 수, 실제로 사람들에게 직급을 할당해준다.

 

2. 구성원들의 행위에 대한 자세한 정의 (메소드) :

김xx(사원)은 이xx(대리)에게 게임 스토리 계획서를 제출한다.

이xx(대리)는 정xx(과장)에게 항상 게임 스토리 계획서 정리본을 제출.

 

 

 

- Class 의 생성

필드와 메소드가 각각 무엇인지에 대해 이 Class에서 정의만을 해 놓는다.

 

Class 이름 : '회사 정보'

 

필드(데이터)

int 형 : 사원은 총 몇명인가에 대한 변수

String 형 : 사원의 이름은 무엇인가를 넣기 위한 변수

 

메소드(처리동작, 함수)

send( String a, String b, String A ) : a 사원이 b 대리에게 A 계획서를 전해주는 함수

 

- Object 의 생성

Class 는 변수의 형과 같은 것으로, 단지 설계도면 개념에 불가하다. 그래서 Class의 틀을 기반으로 실체를 만든다.

 

Class 이름 : '회사 정보' - 에 대한 Object 의 이름 : 'Abc 회사'

 

필드(데이터)

int 형 : 사원은 총 몇명인가에 대한 변수 = 3 명이다.

String 형 : 사원의 이름은 무엇인가를 넣기 위한 변수 = 각각 김xx, 진xx, 허xx

 

메소드(처리동작, 함수)

send( String '김xx', String '이xx', String '게임 스토리' ) 

'김xx' 사원이 '이xx' 대리에게 '게임 스토리' 계획서를 전해주는 함수

 

 

 

 

 

 

 

+ Object 생성 후

 

- Class의 필드를 참조, 대입

- 같은 Object 내의 필드

- 다른 Object 의 필드

 

- Class의 메소드를 참조, 대입

- 같은 Object 내의 메소드

- 다른 Object 의 메소드

- 인수를 갖는 메소드

- 인수를 가지지 않는 메소드

 

오버로딩

 

생성자

- 인수가 없는 생성자

- 인수가 있는 생성자

 

+ 여러 생성자

- 디폴트 생성자

- 복제 생성자

 

 

 

++++ main 메소드

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Java 프로그래밍에서는

 

부품(물건, 객체, 오브젝트)별로 프로그램들을

 

 

 

 

 

 

 

 

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

Posted by 하늘_

 

앞에서 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. Comfile

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) 이런 식으로 나누어서 설명할 생각이다.

 

 

 

Posted by 하늘_


C 언어, C++ 언어와 같이 Java프로그래밍 언어이다. 하지만 Java는 단지 언어를 뜻하는 것이 아니다.
( 후에 배울 Java VM (실행기), 인터프리트(컴파일러와 비슷하나 다른 것) 같은것도 Java의 범주에 속한다. )

우리는 현대에 프로그래머들에 의하여 중요 프로그래밍 방법론으로 사용되는 Java를 배울것이다. 중요 프로그래밍 방법론으로 택하였다는 말의 의미는 대표적인 프로그래밍 언어로 사용되고 있다는 뜻이다. 이렇게 Java는 현대의 소프트웨어 개발을 위한 여러 유명한 언어들 중에 하나이다.

 

대표적인 언어인 만큼 Java는 여러 분야에서 사용되어지고 있다.
아래 예를 보면
매우 다양하게 사용되고 있다는 것을 알 수 있다.

인터넷 & 웹 개발

모바일 소프트웨어 (안드로이드)

임베디드 소프트웨어

엔터프라이즈 소프트웨어

Java가 작성할 수 있는 프로그램의 인터페이스들은 DOS 에서와 같은 CUI나 마우스와 아이콘을 이용하여 직관적으로 사용가능한 GUI 모두 다 가능하다.

– CUI (Character User Interface) 애플리케이션
– GUI (Graphical User Interface) 애플리케이션


위와 같이 모든 인터페이스의 프로그램들을 작성할 수 있으며,
특정한 몇 개의 Java 프로그램들을 설명하자면,


– Java 애플릿(applet : application) - '클라이언트'에서 실행
Web 브라우저 상에서 동작하는 프로그램으로, HTML 안에서 '애플릿'을 지정하면 Web 서버로부터 자동적으로 다운로드 되어 클라이언트의 Web 브라우저 상에서 동작한다(실행된다).

'서버'에서 다운로드 [Java, HTML] > '클라이언트'에서 실행



– Java 서블릿(servlet : server) - '서버'에서 실행
Web 브라우저 상에서 동작하는 프로그램으로, 서버에서 실행되고, 실행 결과를 Web 페이지로 클라이언트에게 보내준다. 서버에서 동작하는 Java 서블릿과 비슷한 프로그램으로 CGI가 있지만, Java 서블릿이 더 효율적이기 때문에, 서블릿의 이용이 증가하고 있다.

'클라이언트''서버'에게 요청 > '서버'에서 실행 [Java] > 결과'클라이언트'에게 전송 [HTML]



– JSP (Java Server Page)
HTML 문서와 Java 프로그램을 조합하여 동적인 Web페이지를 간단하게 만들 수 있습니다. JSP는 서버에서 실행되고, 그 결과를 클라이언트에게 보내준다. HTML 문서 속에 Java 코드를 삽입하는 형태로 작성한다.

'서버'에서 실행 [Java 코드를 삽입한 HTML]결과를 '클라이언트'에게 전송 [HTML] 



– Java 빈즈(Beans)
Java로 작성되어진 프로그램을 부품(컴포넌트)으로써 다루는 것이다. 이 부품들을 조합하여 애플리케이션을 간단하게 만들어 낼 수 있다.

Java Beans 의 사용 목적

- 프로젝트의 능률적인 진행을 위해 아래 2 개의 부분을 '분리'하는 것을 뜻한다

1. '디자이너가 작업하는 화면 View 부분' [ = 프레젠테이션 (웹 디자이너 측) 부분 ]
2. '프로그래머가 작업하는 로직(model)부분' [ = 비지니스 로직 (개발자 측) 부분 ]

이렇게 함으로써 웹의 내용으로부터 웹 표현을 분리함으로써 동적인 웹 페이지 제작을 위한 개발관리에 있어 명확한 작업의 분리가 가능하다. 또한 동일한 기능이 페이지 구성이 달라서 반복적으로 사용되어지는 경우가 있을 경우에도 웹페이지를 효율적으로 작성, 수정하려면 반복적으로 사용되는 코드를 재사용 할 수 있어야 한다. 빈은 이와 같은 효율적인 코딩작업을 가능하게 한다. 목적을 간단하게 정리하면 아래와 같다.

1) JSP 페이지의 로직 부분을 분리해서 코드를 재사용함으로 프로그램의 효율을 높이는 것.
2) 프로그램의 모듈화 (컴포넌트 : component)는 코드를 재사용하므로 프로그램의 작성기간이 단축되고, 이미 실제 시스템에 사용했던 코드를 사용하므로 코드의 안정성이 보장되서 유지 보수가 쉽다.

현재 개발되었거나 되고 있는 프로그램들은 모두 MVC(Model-View-Controller) 기법에 의해 개발되어 지고 있다.

+ MVC 기법은 프로그램을 모델(Model), 뷰(View), 컨트롤러(Controller)로 나누어 개발하는데
- Model : 모델은 로직을 가지고 있는 부분으로 DB와 연동 하는 부분이며,
- View : 뷰는 사용자에게 제공하는 화면으로 UI(User Interface)에 해당하고,
- Controller : 컨트롤러는 뷰와 모델사이에서 흐름을 제어한다.

자세한 내용 및 그림자료 (MVC 2 패턴) : http://www.cyworld.com/aspire1127/5309794  ]

JSP 페이지에 화면 표출부분과 로직들이 혼재한 형태의 코드는 재사용이 어렵다. 이런 '혼재함으로 인한 복잡한 구성'들을 가능한 피하고, JSP 페이지의 로직 부분을 분리해서 코드를 재 사용함으로 프로그램의 효율을 높이는 것이 Java Beans를 사용하는 목적이다.

 

 

위에서 많은 이용 예들을 살펴보았다. 그렇다면 왜? 이렇게 많은 프로그램에 사용되고, 현대에 Java가 대표 프로그래밍 언어가 된것일까? 어떠한 장점들이 있는지 'Java의 특징'을 중심으로 살펴보자.

  

 

1.     단순, 다루기가 쉬운 언어사양을 지니고 있다.

 

사실 Java의 표기법은 기본적인 C C++의 표기법과 별로 다를게 없다.

'C 언어'는 매우 세세한 부분까지 제어를 할 수 있다는 것이 장점이라면 장점이지만, 그만큼 다루기가 어렵고, 익숙해지기가 상대적으로 어렵다는 특징이 있다. 그러나 이 'Java'는 포인터의 개념이 없는 등 세세한 부분까지 신경 쓰지 않아도 될 정도로 굉장히 다루기가 쉽다.

 

 

2.     실행 파일 수준의 호환성 : 운영체제에 독립적 / 멀티 OS

 

기존의 프로그램은 OS를 통해 들어와 Runtime으로 들어오게 되고, 다시 나가는 과정으로 된다. 즉, 그 프로그램이 대응하는 기본 운영체제 상에서만 동작하기 때문에, OS가 다르면 프로그램이 실행이 되지 않는 경향이 있다. Java 프로그램은 Java VM 이라는 실행 환경만 있으면 어디서든지 실행할 수 있다.

[ Java 프로그램을 실행하기 위해서는 JRE (Java Runtime Environment)라는 실행환경 프로그램이 필요 ]

Java Virtual Machine (JVM) 은 OS 위의 가상 OS이다. 이 때문에, 어느 프로그램을 JVM을 통해 실행할때 운영체제에는 독립적이라는 장점이 있으나, JVM (가상 OS) 이 기존의 OS와 상호 교환을 하고 다시 프로그램과 JVM이 서로 상호 교환을 하기 때문에, 성능 면에 있어서 약간은 저하가 발생할 수 있다. 하지만 H/W의 개발 속도가 매우 빠르기 때문에, '성능 저하'라는 특성은 따로 단점으로 작용하지는 않는다.

기존의 OS와 가상 OS인 JVM 이 상호 작용한다는 소리는 Java Virtual Machine (JVM) 은 H/W 에 탑재되어있는 S/W 의 개념으로, JVM을 설치할 때 H/W의 종류에 맞추어 설치해주어야한다는 것을 뜻한다. 그래서 Java 개발 툴을 다운 받을 때 여러 OS 군에서 자신에게 맞는 OS 버전의 Java 툴을 설치하여야한다.

JVM이 읽는 파일은 일반적으로 우리가 생각하는 .exe 확장자를 지닌 파일이 아니다. Java 프로그램의 실행 파일은 플랫폼에 의존하지 않는 바이트 코드로 만들어 진다. 이를 JVM을 이용하여 바이트 코드를 기종 고유(OS, H/W)의 코드로 변환하고 실행하여, 최종적인 실행 결과를 우리들에게 보여주는 것이다.

이 'OS' 와 '기종'에 독립적이라는 Java의 특징에 의하여 OS, 기종 상관없이 어느 컴퓨터이든, 심지어 냉장고와 같은 가전제품 등에서도 Java VM이 탑재되었다면 Java 프로그램을 실행 가능하다. 

이러한 장점은 [ Java의 모토 : Write Once Run Anywhere, WORA ] 에서 잘 드러난다.

 

 + 자바 가상 머신(Java Virtual Machine, JVM) 


자바 VM : http://ko.wikipedia.org/wiki/Java_Virtual_Machine

자바 의 장점, 회사에서의 경험 : http://blog.naver.com/borahoon?Redirect=Log&logNo=120120434950

자바 의 장점 (약간은 공학논리적) : http://sessionk.tistory.com/15


자바 가상 머신
은 자바 바이트코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현되나 자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. (이론적으로는 100% 하드웨어 구현도 가능하나 비효율적이다) 자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.

 

 

3.     개발 환경이 충실하다.

 

Java 개발 툴은 Web상에서 무료로 다운로드 할 수 있다. (Eclipse 라는 유명한 무료 Intergrated Development Environment, IDE) 그리고 풍부한 기술을 포함하고 있는 라이브러리들을 표준으로 이용할 수 있어 다양한 스타일의 프로그램을 만들어낼 수 있다.

 

 

4.     객체 지향

 

객체 지향이란 프로그램의 기능을 '그룹'별로 나누고, 이런 '그룹'들의 집합들을 조합하여 프로그램을 작성해 나간다는 개념이다. 객체 지향 언어인 Java를 사용하면 이런 기능을 이용하여 보다 복잡하고 수준 높은 프로그램을 만들 수 있다. '객체 지향'에 대한 자세한 내용은 '2 장'에서 설명하겠다.


 

이렇게 다양한 특징과 장점을 갖춘 Java 언어로 프로그램을 작성하기 위해 우리는 개발 Tool들을 필요로 한다. 프로그래밍의 방향성(무엇에 대한 프로그램을 만들 것인가?)에 맞추어 여러 다양한 Tool들이 있다.

 

Java Development Kits 는 각 개발 목적에 따라 다양한 버전을 제공하여 준다.

- Java Standard Edition (Java SE)
.

클라이언트 지향의 기본적인 환경


- Java Enterprise Edition (Java EE)

큰 규모를 지닌 네트워크 애플리케이션웹 기반 애플리케이션개발을 위한 환경

일반적으로 서버 소프트웨어 개발을 위한 환경


- Java Micro Edition (Java ME)

휴대 전화(cell phones), 무선 호출 수신기(pagers), PDA와 같은 작고, 메모리가 작은 값으로 제한된 기기들의 개발을 위한 환경

 

이렇게 JAVA의 매우 개략적인 특징들과 Development Kits를 살펴보았다. 이 특징들이 개략적이지만, 앞으로 설명할 자세한 모든 특징들의 토대 라는 점에서 제대로 숙지하고 다음 글을 읽는 것을 권한다.

 

Posted by 하늘_