본문 바로가기

Study/Java

Chapter01. 자바를 시작하기 전에

728x90

GTH 블로그 작성 전 다짐

책에 내용을 그대로 적는 것이 아닌 내용을 이해한 후 요약하여 주관적 생각과 함께 기록할 것입니다.

읽고 도움이 되신다면 감사드리며, 부족한 부분이 있다면 댓글을 통해 피드백 주시면 감사하겠습니다.

[남궁성(2016), 『Java의 정석』(도우출판), 2~14쪽 참조.]

1. 자바(Java Programming Language).

1.1 자바란?

썬 마이크로 시스템즈(Sun Microsystems, Inc. 이하 썬)에서 개발하여 1996년 1월에 공식적으로 발표한 객​체지향 프로그래밍 언어이다.

 

자바의 특징

- 운영체제에 독립적

 - 컴퓨터와 운영체제가 공존하는 인터넷 환경에 적합한 언어

 - 비교적 배우기 쉽고 이애하기 쉬운 간결한 표현이 가능

- 풍부한 클래스 라이브러리(Java API)를 통해 프로그래밍에 필요한 요소들을 기본적으로 제공

 - 클래스 라이브러리만 잘 활용해도 강력한 기능의 자바 프로그래밍을 작성할 수 있음.

1.2 자바의 역사

 1991년 썬의 엔지니어들에 의해서 고안된 오크(Oak)라는 언어에서부터 시작되었다.

 원래 가전제품에 탑재될 소프트웨어를 만드는게 목표였는데, C++을 확장해서 사용하기엔 부족하다 생각되어 단점을 보완한 새로운 언어를 개발하기에 이르렀다. 여러 종류의 운영체제를 사용하는 컴퓨터들이 통신하는 인터넷이 등장하여 운영체제에 독립적인 Oak가 이에 적합하다고 판단하여, 인터넷에 적합하도록 그 개발 방향을 바꾸며 이름을 Java라고 바꾸고 자바로 개발한 웹브라우저인 '핫 자바(Hot java)'를 발표하고 1996년 1월에 정신 버전을 발표했다.

 자바로 작성된 Applet은 정적인 웹페이지에 사운드와 애니메이션 등의 멀티미디어적인 요소들을 제공할 수 있는 유일한 방법이었기 때문에 많은 인기를 얻고 단 기간에 많은 사용자층을 확보할 수 있었으나, 보안상의 이유로 최신 웹 브라우져에서 애플릿을 더이상 지원하지 않게 되었다. 대신 서버쪽 프로그래밍을 위한 서블릿(Servlet)과 JSP(Java Server Pages)가 더 많이 사용되고 있다.

 구글의 스마트폰 운영체제인 안드로이드에서도 Java를 사용한다. 자바의 원래 목표였던 소규모 가전제품과 대규모 기업환경을 위한 소프트웨어 분야에 활발히 사용될 것으로 기대된다.

1.3 자바언어의 특징

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

2. 객체지향언어이다.

3. 비교적 배우기 쉽다.

4. 자동 메모리 관리(Garbage Collection)

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

6. 멀티쓰레드를 지원한다.

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

1.4 JVM(Java Virtual Machine)

'자바를 실행하기 위한 가상 기계(컴퓨터)'

@ 가상컴퓨터란?

 - 제 컴퓨터(하드웨어)가 아닌 소프트웨어로 구현된 컴퓨터라는 뜻으로 컴퓨터 속의 컴퓨터라고 생각하면 된다.

 

 자바로 작성된 애플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행되기 때문에, 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다. Java 애플리케이션은 JVM을 한 번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석(interpret)되기 때문에 속도가 느리다는 단점을 갖고 있다.

Java애플리케이션과 일반 애플리케이션의 비교

 

 근데 요즘엔 바이트코트(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄였다. 위 사진에서 볼 수 있듯이 일반 애플리케이션은 OS와 바로 맞붙어 있기 때문에 OS에 종속적(어떤 것에 딸려 붙어 있음)이다. 그래서 다른 OS에서 실행시키기 위해서는 애플리케이션을 당신의 OS에 맞게 설치해주어야 한다. Java 애플리케이션은 JVM하고만 상호작용해서 OS와 하드웨어에 독립적이라 다른 OS에서도 프로그램의 변경없이 실행이 가능한 것이다. 단, JVM은 OS에 종속적이기 때문에 해당 OS에서 실행가능한 JVM이 필요하다. 

Write once, run anywhere. (한 번 작성하면 어디서든 실행된다.)

다양한 OS용 JVM

 

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

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

javac.exe 자바 컴파일러 : 자바소스코드를 바이트코드로 컴파일한다.

java.exe 자바 인터프리터 : 컴파일러가 생성한 바이트코드를 해석하고 실행한다.

javap.exe 역 어셈블러 : 컴파일된 클래스파일을 워래의 소스로 변환한다.

javadoc.exe 자동문서생성기 : 소스파일에 있는 주석(/** */)을 이용하여 Java API문서와 같은 형식의 문서를 자동으로 생성한다.

jar.exe 압축프로그램 : 클래스파일과 프로그램의 실행에 관련된 파일을 하나의 jar(.jar)로 압축하거나 압축해제한다.

 

(Open jdk 다운로드 주소.) https://jdk.java.net/

 

JDK Builds from Oracle

Production and Early-Access OpenJDK Builds, from Oracle Looking to learn more about Java? Visit dev.java for the latest Java developer news and resources. Looking for Oracle JDK builds and information about Oracle’s enterprise Java products and services?

jdk.java.net

Oracle Open jdk 설치법

1. Oracle JDK Download page. 클릭
2. 쿠키 승인
3. 스크롤 좀 내리다보면 JDK SE 버전 나오는데 필자는 JDK11 version으로 사용.
4. 오라클 로그인 해야됨.(??)
5. jdk 압출 풀기.
6. 안에 JDK 파일들 잘 있는가 확인하고
7. 새폴더 jdk 만들고 안에 파일들 안에 넣어서 c드라이브로 옮긴다.
8. 본인이 원하는 위치로 옮겨도 되는데 환경변수 설정 시 디렉터리 위치가 달라질 수 있음!!(참고)
9. 윈도우 + r 키 눌러서 시스템 속성 창으로 go
10. 고급탭의 환경 변수(N) 클릭
11. 새로 만들기(W)... 버튼 클릭.
12. 변수 이름엔 JAVA_HOME, 변수 값엔 JDK 설치 경로 입력.
13. classpath 변수 생성
14. 사용자 변수 Path 편집
15. 새로만들기 눌러서 %JAVA_HOME%bin 내용추가.
16. 다시 윈도우 + r 눌러서 cmd 실행
17. Java -version과 Javac -version이 나온다면 JDK 설치완료 ~

2.2 Java API문서 설치하기

 자바에서 제공하는 클래스 라이브러리(Java API)를 잘 사용하기 위해서는 Java API문서가 필수적이다. 여기에 클래스 라이브러리의 모든 클래스에 대한 설명이 자세하게 나와있음. 자주 사용되는 것만 공부한 다음 필요한건 찾아서 검색해 사용하면 된다.

https://docs.oracle.com/javase/8/docs/api/index.html

 

Java Platform SE 8

 

docs.oracle.com

 

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

3.1 Hello.java

메모장 실습을 위한 디렉터리 생성, (필자경로)D:\GTH\workSpace\Java 폴더에

메모장에 해당 내용 입력.
Hello.java 파일로 저장, 다른 파일은 신경쓰지말고 디렉터리 경로에 저장하면 됨.

이 예제를 실행하려면, 먼저 자바 컴파일러(javac.exe)를 사용해서 소스파일(Hello.java)로부터 클래스파일(Hello.class)파일을 생성해야 한다.

동작원리
윈도우 + r 눌러서 cmd 실행.
cmd 창에 차례대로 입력 후 엔터 누르면 Hello. world. 출력 메세지를 볼 수 있음.

D: -> 디렉터리 D:로 이동

cd D:\GTH\workSpace\Java -> change directory 해당 디렉터리로 이동하겠다.

dir -> 폴더 및 파일명 확인

javac Hello.java -> 자바 컴파일러를 사용해서 소스파일(Hello.java)로 부터 클래스 파일(Hello.class)을 생성한다.

java Hello -> 자바 인터프리터(Java.exe)로 클래스 파일을 실행한다.

 

클래스를 작성하는 방법

class 클래스이름{
	/*
    주석을 제외한 모든 코드는 클래스 블럭{} 내에 작성해야한다.
    */
}

 

아래 코드의 'public static void main(String[] args)'는 main메서드의 선언부인데, 프로그램을 실행할 때 'java.exe'에 호출될 수 있도록 미리 약속된 부분이므로 항상 똑같이 적어주어야 한다.

class 클래스이름{
	public static void main(String[] args) // main메서드의 선언부
	{
    	//실행될 문장들을 적는다.
    	}
}

- {과 }는 메서드의 시작과 끝을 의미한다.

- 괄호 사이에 실행될 문장들을 적는다.

- Java 애플리케이션은 main메서드의 호출로 시작해서 main메서드의 첫 문장부터 마지막 문장까지 수행을 마치면 종료된다.

 

main메서드는..

 모든 클래스가 main 메서드를 갖고 있어야 하는건 아니지만, 하나의 Java 애플리케이션에는 main 메서드를 포함한 클래스가 반드시 하나는 있어야 한다. main 메서드는 Java애플리케이션의 시작점이므로 main 메서드 없이는 Java 애플리케이션은 실행 될 수 없기 때문이다. 작성된 Java애플리케이션을 실행할 때는 'java.exe' 다음에 main메서드를 포함한 클래스의 이름을 적어줘야 한다.

[남궁성(2016), 『Java의 정석』(도우출판), 9쪽 참조.]

 

소스파일의 작성 규칙..

 하나의 소스파일에 하나의 클래스만을 정의하는 것이 보통인데, 하나의 소스파일에 둘 이상의 클래스를 정의하는 것도 가능하다. 이 때 주의해야할 점은 '소스파일의 이름은 public class의 이름과 일치해야 한다.'는 것이다.' 만약 소스파일내에 public class가 없다면, 소스파일의 이름은 소스파일 내의 어떤 클래스의 이름으로 해도 상관없다.

[남궁성(2016), 『Java의 정석』(도우출판), 9쪽 참조.]

 

public class Hello2() {}      
       class Hello3() {}

public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야한다. 이게 뭔소리냐면.

소스파일 Main.java과 class 이름의 Main이 같아야한다.

근데 public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java, Hello.java' 둘 다 가능하다.

 

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

1. cannot find symbol 또는 cannot resolve sysbol

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

[남궁성(2016), 『Java의 정석』(도우출판), 11쪽 참조.]

 

2. ';' expected

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

[남궁성(2016), 『Java의 정석』(도우출판), 11쪽 참조.]

 

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

 - 'main메서드를 찾을 수 없다.'는 뜻인데 실제로 클래스 내에 main 메서드가 존재하지 않거나 메서드의 선언부 'public static void main(String[] args)'에 오타가 존재하는 경우에 발생한다.

 - 이 에러의 해결 방법은 main메서드가 클래스에 정의되어 있는지 확인하고, 정의되어 있다면 main메서드의 선언부에 오타가 없는지 확인한다. 자바는 대소문자를 구별하므로 대소문자의 일치여부까지 정확히 확인해야한다.

[남궁성(2016), 『Java의 정석』(도우출판), 11쪽 참조.]

 

4. Exception in thread "main" java.lang.NoClassDefFoundError: Hello

 - 'Hello라는 클래스를 찾을 수 없다.'는 뜻이다. 클래스 'Hello'의 철자, 특히 대소문자를 확인해보고 이상이 없으면 클래스파일(*.class)이 생성되었는지 확인한다.

 - 예를 들어 'Hello.java'가 정상적으로 컴파일 되었다면 클래스파일 'Hello.java'가 있어야한다. 클래스 파일이 존재하는데도 동일한 메시지가 반복해서 나타난다면 클래스패스(classpath)의 설정이 바르게 되었는지 다시 확인해보자.

[남궁성(2016), 『Java의 정석』(도우출판), 11쪽 참조.]

 

5. illegal start of expression

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

[남궁성(2016), 『Java의 정석』(도우출판), 11쪽 참조.]

 

6. class, interface, or enum expected

 - 이 메세지의 의미는 '키워드 class나 interface 또는 enum이 없다.'이지만, 보통 괄호 '{'또는 '}'의 개수가 일치 하지 않는 경우에 발생한다. 열린괄호 '{'와 닫힌괄호 '}'의 개수가 같은지 확인하자.

[남궁성(2016), 『Java의 정석』(도우출판), 11쪽 참조.]

 

* 핵심내용

 에러가 발생했을 때, 어떻게 해결할 것인가? - 에러메시지를 잘 읽는것!

1. 에러 메시지를 잘 읽고 해당 부분의 코드를 살펴본다.
이상이 없으면 해당 코드의 주위(윗줄과 아래 줄)도 함께 살펴본다.

2. 그래도 이상이 없으면 에러 메시지는 잊어버리고 기본적인 부분을 재호가인한다.
대부분의 에러는 사소한 것인 경우가 많다.

3. 의심이 가는 부분을 주석처리하거나 따로 떼어내서 테스트 한다.

 

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

Java 애플리케이션을 실행시켰을 때

내부적인 진행순서

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

1. 프로그램의 실행에 필요한 클래스(*.class)를 로드한다.

2. 클래스파일을 검사한다.(파일형식, 악성코드 체크)

3. 지정된 클래스(Hello)에서 main(String[] args)를 호출한다.

main메서드의 첫 줄부터 코드가 실행되기 시작하여 마지막 코드까지 모두 실행되면 프로그램이 종료되고, 프로그램에서 사용했던 자원들은 모두 반환된다.

 

만일 지정된 클래스에 main메서드가 없다면 다음과 같은 에러 메시지가 나타날 것이다.

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

3.4 주석(comment)

주석을 이용해서 프로그램 코드에 대한 설명을 적절히 덧붙여 프로그램을 이해하는데 도움이 될 수 있도록 활용하자.

범위 주석 '/*'와 '*/'사이의 내용은 주석으로 간주된다.

한 줄 주석 '//'부터 라인 끝까지의 내용은 주석으로 간주된다. 
class Hello
{
	public static void main(String[] args) /* 프로그램의 시작 */
    {
    	System.out.println("Hello, world."); // Hello, wolrd를 출력
    }
}

주석이 많다고 해서 프로그램의 성능이 떨어지는 일은 없다. 주석을 적극적으로 활용하라.

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

class Hello
{
	public static void main(String[] args)
    {
    	System.out.println("Hello, /* 이것은 주석이 아님*/ world.");
        System.out.println("Hello, world. // 이것도 주석 아님");
    }
}

ㅇㅋ?

반응형

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

Java04_연산자  (0) 2022.05.14
Java03_자료형과변수  (0) 2022.05.14
Java02_입출력  (0) 2022.05.14
Java01_기본문법  (0) 2022.05.14
Chapter02. 변수(Variable)  (0) 2022.04.26