자바의정석

[자바의 정석] ch01 자바를 시작하기 전에

유호야 2020. 11. 14. 18:45
반응형

1. 자바(Java Programming Language)

1.1 자바란?

썬 마이크로시스템즈에서 개발하여 1996년 1월에 공식적으로 발표한 객체지향 프로그래밍 언어(Object-Oriented-Programming Language)이다. 자바의 가장 중요한 특징은 운영체제(Operating System, 플랫폼)에 독립적이라는 것이다. 자바로 작성된 프로그램은 운영체제의 종류에 관계없이 실행이 가능하기 때문에, 운영체제에 따라 프로그램을 전혀 변경하지 않고도 실행이 가능하다. 지금도 자바는 꾸준히 자바의 성능을 개선하여 새로운 버전을 발표하고 있으며, 모바일(J2ME)이나 대규모 기업환경(J2EE), XML 등의 다양한 최신 기술을 지원함으로써 그 활동영역을 넓혀 가고 있다.

참고 |  2010년에 썬이 오라클(Oracle)사에 인수되면서 이제는 자바는 오라클 사의 제품이 되었다.

1.3 자바 언어의 특징

자바는 최근에 발표된 언어답게 기존의 다른 언어에는 없는 많은 장점을 가지고 있다.

1) 운영체제에 독립적이다.

자바로 작성된 프로그램은 운영체제에 독립적이지만 JVM은 운영체제에 종속적이어서 썬에서는 여러 운영체제에 설치할 수 있는 서로 다른 버전의 JVM을 제공하고 있다. 그래서 자바로 작성된 프로그램은 운영체제와 하드웨어에 관계없이 실행가능하며, 이것을 '한번 작성하면 어디서나 실행된다.'(Write once, run anywhere)'고 표현하기도 한다.

2) 객체지향 언어이다.

자바는 프로그래밍의 대세로 자리 잡은 객체지향 프로그래밍언어 중의 하나로 객체지향개념의 특징인 상속, 캡슐화, 다형성이 잘 적용된 순수한 객체지향언어라는 평가를 받고 있다.

3) 비교적 배우기 쉽다.

4) 자동 메모리 관리(Garbage Collecton)

자바로 작성된 프로그램이 실행되면 Garbage collector가 자동적으로 메모리를 관리해주기 떄문에 프로그래머는 메모리를 따로 관리하지 않아도 된다. 가비지 컬렉터가 없다면 프로그래머가 사용하지 않는 메모리를 체크하고 반환하는 일을 수동적으로 처리해야 할 것이다. 자동으로 메모리를 관리한다는 것이 다소 비효율적인 면도 있지만, 프로그래머가 보다 프로그래밍에 집중할 수 있도록 도와준다.

5) 네트워크와 분산처리를 지원한다.

 인터넷과 대규모 분산환경을 둔 까닭인지 풍부하고 다양한 네트워크 프로그래밍 라이브러리(Java API)를 통해 비교적 짧은 시간 내에 네트워크 관련 프로그램을 쉽게 개발할 수 있도록 지원한다.

6) 멀티스레드를 지원한다.

일반적으로 멀티스레드의 지원은 사용되는 운영체제에 따라 구현방법도 상이하며, 처리 방식도 다르다. 그러나 자바에서 개발되는 멀티쓰레드 프로그램은 시스템과는 관계없이 구현가능하며, 관련된 라이브러리(Java API)가 제공되므로 구현이 쉽다. 그리고 여러 스쓰레드에 대한 스케줄링을 자바 인터프리터가 담당하게 된다.

7) 동적로딩(Dynamic Loading) 을 지원한다.

자바는 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 수 있다는 장점이 있다. 그 외에도 일부 클래스가 변경되어도 전체 애플리케이션을 다시 컴파일 하지 않아도 되며, 애플리케이션의 변경사항이 발생해도 비교적 적은 작업만으로도 처리할 수 있는 유연한 애플리케이션을 작성할 수 있다.

1.4 JVM(Java Virtual Machine)

Java 애플리케이션 <-> JVM <-> OS(Windows) <-> 컴퓨터(하드웨어)
일반 애플리케이션 <-> OS(Windows) <-> 컴퓨터(하드웨어)
일반 애플리케이션의 코드는 os만 거치고 하드웨어로 전달되는데 비해 java 애플리케이션은 JVM을 한 번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석(Interpret)되기 때문에 속도가 느리다는 단점을 가지고 있다. 그러나 요즘엔 바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT 컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄였다.
일반 애플리케이션은 OS와 바로 맞붙어 있기 때문에 OS종속적이다. 그래서 다른 OS에서 실행시키기 위해서는 그 애플리케이션을 그 OS에 맞게 변경해야 한다. 반면에 Java 애플리케이션은 JVM하고만 상호작용하기 때문에 OS와 하드웨어에 독립적이라 다른 OS에서도 프로그램의 변경 없이 실행이 가능한 것이다. 단 JVM은 OS에 종속적이기 때문에 해당 OS에서 실행가능한 JVM이 필요하다.

Java 애플리케이션    Java 애플리케이션    Java 애플리케이션
Windows용 JVM       Macintosh용 JVM     Linux용 JVM
OS(Windows)            OS(Macintosh)         OS(Linux)
컴퓨터(하드웨어)        컴퓨터(하드웨어)        컴퓨터(하드웨어)

그래서 썬에서는 일반적으로 많이 사용되는 주요 os용 JVM을 제공하고 있고, 이렇게 함으로써 자바의 중요한 장점 중에 하나인 "Write once, run anywehre.(한 번 작성하면 어디서든 실행된다.)"이 가능하게 된다.

 

2. 자바 개발환경 구축하기

2.1 자바 개발도구 (JDK) 설치하기

javac.exe 자바 컴파일러, 자바소스코드를 바이트코드로 컴파일한다.
java.exe 자바 인터프리터, 컴파일러가 생성한 바이트코드를 해석하고 실행한다.
javap.exe 역어셈블러, 컴파일된 클래스파일을 우너래의 소스로 변환한다.
참고 |  바이트코드 - JVM이 이해할 수 있는 기계어, JVM은 바이트코드를 해당 OS의 기계어로 변환하여 OS로 전달함javadoc.exe 자동문서 생성기, 소스파일에 있는 주석을 이용하여 Java API문서와 같은 형식의 문서를 자동으로 생성한다.
jar.exe 압축프로그램, 클래스 파일과 프로그램의 실행에 관련된 파일을 하나의 jar파일(.jar)로 압축하거나 압축해제한다.
JDK - 자바개발도구(Java Development Kit)
JRE - 자바실행환경(Java Runtime Environment), 자바로 작성된 응용프로그램이 실행되기 위한 최소환경.
JDK  = JRE + 개발에 필요한 실행파일(javac.exe 등)
JRE = JVM + 클래스라이브러리(Java API)

2.2 Java API 문서 설치하기

자바에서 제공하는 클래스 라이브러리(Java API)를 잘 사용하기 위해서는 Java API문서가 필수적이다. 이 문서에는 클래스 라이브러리의 모든 클래스에 대한 설명이 자세하게 나와 있다. 모든 클래스를 다 공부할 필요는 없고, 자주 사용되는 것만을 공부한 다음 나머지는 영어사전처럼 필요할 때 찾아서 사용하면 된다.
Java API문서는 'http://java.sun.com/'에서 다운 받을 수 있다.

 

3. 자바로 프로그램 작성하기

3.1 Hello.java

자바로 프로그램을 개발하려면 JDK 이외에 메모장이나 에딧플러스와 같은 편집기가 필요하다.
하지만 익숙한 사람들이라면 이클립스(Eclipse)나 넷빈즈(netbeans)와 같은 고급툴을 사용하자.

하나의 소스파일 안의 public class는 하나여야 하며,
소스파일명과 public class 명은 일치해야 한다.

public class가 없고 class파일만 있을 경우에는 어떤 이름을 지어도 무방하다.

모든 클래스가 main 메소드가 필요한 것은 아니지만, main 메소드는 자바 애플리케이션의 시작점이므로, main 메소드 없이는 실행될 수가 없다.
작성 된 java 애플리케이션을 실행할 때는 java.exe 다음에 main 메소드를 포함한 클래스의 이름을 적어줘야 한다.

소스파일(*.java)과 달리 클래스파일(*.class)은 클래스마다 하나씩 만들어진다.
소스파일 안에 public class Hello2 {} 와 class Hello3 {} 가 정의 되어있다면 두 개의 클래스 파일이 생성된다.

3.2 자주 발생하는 에러와 해결방법

1) cannot find symbol 또는 cannot resolve symbol
지정된 변수나 메소드를 찾을 수 없다는 뜻으로 선언되지 않은 변수나 메소드를 사용하거나, 변수 또는 메소드의 이름을 잘못 사용한 경우에 발생한다. 자바에서는 대소문자 구분을 하기 때문에 철자 뿐 만 아니라 대소문자의 일치여부도 꼼꼼하게 확인해야 한다.

2) ';' expected
세미콜론 ';' 이 필요한 곳에 없는 뜻이다. 자바의 모든 문장의 끝에는 ';' 을 붙여줘야 하는데 가끔 이를 잊고 실수하기 쉽다.

3) Exception in thread "main" java.lang.NoSuchMethodError: main
'main 메소드를 찾을 수 없다.'는 뜻인데 실제로 클래스 내에 main 메소드가 존재하지 않거나 메소드의 선언부 'public static void main(String [] args)'에 오타가 존재하는 경우에 발생한다.
이 에러의 해결방법은 main 메소드가 클래스에 정의되어 있는지 확인하고, 정의되어 있다면 main메소드의 선언부에 오타가 없는지 확인한다. 자바는 대소문자를 구별하므로 대소문자의 일치여부까지 정확히 확인해야 한다.

4) Exception in thread "main" java.lang.NoClassDefFoundError: Hello
'Hello'라는 클래스를 찾을 수 없다.'는 뜻이다. 클래스 'Hello'의 철자, 특히 대소문자를 확인해보고 이상이 없으면 클래스파일(*.class)이 생성되었는지 확인한다.
예를 들어 'Hello.java'가 정상적으로 컴파일 되었다면 클래스 파일 'Hello.class'가 있어야 한다. 클래스 파일이 존재하는데도 동일한 메세지가 반복해서 나타난다면 클래스패스(classpath)의 설정이 바르게 되었는지 다시 확인해보자.

5) illegal start of expression
직역하면 문장(또는 수식, expression)의 앞부분이 문법에 맞지 않는다는 의미인데, 간단히 말해서 문장에 문법적 오류가 있다는 뜻이다. 괄호'('sk '{'를 열고서 닫지않거나, 수식이나 if문, for문 등에 문법적 오류가 있을 때 또는 public이나 static과 같은 키워드를 잘못 사용한 경우에도 발생한다. 에러가 발생한 곳이 문법적으로 옳은지 확인하라.

6) class, interface, or enum expected 
이 메세지의 의미는 '키워드 class나 interface 또는 enum이 없다.'이지만, 보통 괄호 '{' 또는 '}' 의 개수가 일치 하지 않는 경우에 발생한다. 열린괄호와 닫힌 괄호의 개수가 같은지 확인하자
마지막으로 한 가지 더 이야기하고 싶은 것은 에러가 발생했을 때, 어떻게 해결할 것인가에 대한 방법이다. 아주 간단하고 당연한 내용이라서 다소 실망스럽게 느껴질지도 모르지만, 막상 실제 에러가 발생했을 때 아래의 순서대로 처리해보면 도움이 될 것이다.

1. 에러메세지를 잘 읽고 해당 부분의 코드를 살펴본다.
이상이 없으면 해당 코드 주위(윗줄과 아래 줄)도 함께 살펴본다.
2. 그래도 이상이 없으면 에러 메세지는 잊어버리고 기본적인 부분을 재확인한다.
때부분의 에러는 사소한 것인 경우가 많다.
3. 의심이 가는 부분을 주석처리하거나 따로 떼어내서 테스트 한다.

3.3 자바 프로그램의 실행과정

콘솔에서 아래와 같이 Java 애플리케이션을 실행시켰을 때

c:\jdk1.8\work>java Hello 
                       ㄴ---> Hello : main(String [] args)

내부적인 진행 순서는 다음과 같다.

1. 프로그램의 실행에 필요한 클래스(*.class파일)를 로드한다.
2. 클래스 파일을 검사한다. (파일형식, 악성코드 체크)
3. 지정된 클래스(Hello)에서 main(String[] args)를 호출한다.

main 메소드의 첫 줄부터 코드가 실행되기 시작하여 마지막 코드까지 모두 실행되면 프로그램이 종료되고, 프로그램에서 사용했던 자원들은 모두 반환된다. 만일 지정된 클래스에 main 메소드가 없다면 다음 에러 메세지가 나타난다.

 Exception in thread "main" java.lang.NoSuchMethodError : main

 

 

참고 |  이 외에도 Java API 문서와 같은 형식의 문서를 자동으로 만들 수 있는 주석(/** ~ */)이 있지만 많이 사용되지 않으므로 자세한 설명은 생략하겠다. 이 주석은 javadoc.exe에 의해서 html 문서로 자동 변환되며, 보다 자세한 내용은 인터넷에서 'javadoc'으로 검색하면 찾을 수 있다.

한 가지 주의해야 할 점은 문자열을 의미하는 큰 따옴표(") 안에 주석이 있을 때는 주석이 아닌 문자열로 인식된다.

package ch01;

public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(" 큰 따옴표 안에서는 //나 /* */ 주석을 사용할 수 없다.");
	}

}

 

3.5 이 책으로 공부하는 방법

네이버 카페를 이용하면서 강의 및 질문을 할 수 있고, 또한 연습문제로 한 챕터가 끝날 때마다 공부할 수 있다.

 

castello/javajungsuk3

soure codes and ppt files of javajungsuk 3rd edition - castello/javajungsuk3

github.com

 

반응형

'자바의정석' 카테고리의 다른 글

@SuppressWarning  (0) 2021.04.16
lastIndexOf  (0) 2021.04.12
System.out.printf('%2d', x); %2d란??  (0) 2021.04.06
ch02 연습문제  (0) 2020.11.22
[자바의 정석] ch02 변수 Variable  (0) 2020.11.14