신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

Chapter 01. 자바를 시작하기전에

1. 자바

1.1. 자바란?

자바는 선 마이크로시스템즈에서 개발된 객체지향 프로그래밍 언어이다.

 

운영체제에 독립적이기 때문에, 자바로 작성된 프로그램은 운영체제의 종류에 상관없이 실행이 가능하다.

 

다양한 기종의 컴퓨터, 운영체제가 공존하는 인터넷 환경에 적합한 언어로써 많은 사용자층을 확보했다.

 

기본적으로 풍부한 라이브러리(Java API)가 존재하여 개발에 강력하다.

1.2. 자바의 역사

1991년 오크(Oak)라는 언어에서 시작되었다.

 

제임스 고슬링과 아서 밴 호프와 같은 썬 엔지니어들은 가전제품에 탑재될 소프트웨어를 만들기위해 C++로 만들려 했다. 하지만, C++로는 목적을 이루기어려웠다. C++의 단점을 보완하고 장점을 도입하여 새로운 언어를 Oak를 개발했다.

 

운영체제에 독립적인 특징을 가진 Oak가 인터넷 환경에서 적합하다 판단하여 본격적으로 개발방향을 바꿔 자바(Java)를 만들었다. 1996년 1월에 자바의 정식 버전을 발표했다.

 

자바로 작성된 애플릿(Applet)을 이용하여 웹 개발을 했지만, 보안상의 이유로 더이상 최신 브라우저에서 애플릿을 사용하지 않게 되었다. 현재는 Servlet, JSP가 더 많이 사용되고 있다. 그리고, 안드로이드 운영체제로 Java를 사용하고 있다.

1.3. 자바의 특징

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

일종의 에뮬레이터인 자바 가상머신 ( Java Virtual Machine)을 통해 운영체제를 걱정하지 않고 개발을 할 수 있다.

 

자바 응용프로그램은 JVM 하고만 통신하고, JVM은 응용프로그램으로부터 전달받은 명령을 각각의 운영체제에 맞게 번역하여 전달한다.

그래서, 자바는 운영체제와 하드웨어에 관계없이 실행이 가능하다.

 

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

1.3.2. 객체지향 언어이다.

자바는 프로그래밍의 대세로 자리잡은 객체지향 프로그래밍 언어( Object-oriented programming language)이다.

 

객체지향의 특징

  • 상속
  • 캡슐화
  • 다형성

1.3.3. 비교적 배우기 쉽다.

자바는 기본 구문은 C++에서 가져오고, 객체 지향 관련 구문은 스몰톡(small talk) 이라는 객체지향언어에서 가져왔다.

 

(상대적으로..) 간결하고 이해하기 쉬워서 배우기 쉽다.

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

가비지 컬렉터(Garbage Collector)에 의해 자동적으로 메모리를 관리해주기 때문에, 프로그래머는 메모리를 따로 관리하지 않고 개발을 할 수 있다.

 

가비지 컬렉터가 없다면 수동으로 매번 메모리를 체크하고 반환하는 일을 해줘야 한다. 그래서 자바의 가비지 컬렉터는 개발에 집중할 수 있게 도와준다.

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

자바는 애초에 인터넷 환경을 방향으로 잡고 개발된 언어라서, 네트워크 관련 라이브러리가 풍부하고 다양하다. 비교적 빠르게 네트워크 관련 프로그램을 개발할 수 있다.

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

보통은 멀티 쓰레드 지원은 운영체제에 따라 구현방법이 다르지만, 자바에서는 시스템에 관계없이 동일한 방식으로 구현이 가능하다. 관련된 라이브러리(Java API)가 제공되므로 구현이 쉽다.

 

그리고, 자바 인터프리터가 여러 쓰레드에 대한 스케줄링(Scheduling)을 담당한다.

1.3.7. 동적 로딩(Dynamic Lading)을 지원한다.

자바는 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 수 있다는 장점이 있다.

일부 클래스가 변경이되면 전체 어플리케이션을 다시 컴파일 할 필요없다.

1.4. JVM (Java Virtual Machine)

JVM은 자바를 실행하기 위한 가상 컴퓨터라고 할 수 있다. 가상 컴퓨터라는 것은 실제 하드웨어가 아닌 소프트웨어로 작성된 컴퓨터라고 할 수 있다.

 

자바로 작성된 어플리케이션은 JVM 위에서 동작하기 때문에, 반드시 JVM이 필요하다.

 

일반 어플리케이션과 다르게 JVM을 거쳐서 OS와 통신을 한다.

Java의 동작 구조

하지만, JVM 위에서 동작하기 때문에 하드웨어에 맞게 컴파일이 된 것이 아니다. 그래서, 속도가 느리다는 단점이 있다.

 

요즘에는 컴파일된 자바 코드를 하드웨어의 기계어로 바로 변환해주는 JIT 컴파일러와 향상된 최적화 기술로 속도의 격차가 줄고 있다.

 

자바 어플리케이션은 운영체제에 독립적이지만, JVM은 OS와 맞붙어 있기 때문에 종속적이다. 해당 OS에 맞는 JVM이 필요하다.

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

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

자바 프로그래밍을 하려면 JDK(Java Development Kit)를 설치해야 한다. JDK를 설치하면 JVM과 자바 클래스 라이브러리(Java API), 기타 등등 개발에 필요한 프로그램들이 설치된다.

 

  • javac.exe: 자바 컴파일러. 자바 소스를 바이트 코드로 컴파일한다.
    • javac Hello.java
  • java.exe: 자바 인터프리터. 컴파일된 코드를 해석하고 실행한다.
    • java Hello
  • javap.exe: 역어셈블러, 컴파일된 클래스 파일을 원래의 소스로 변환한다.
    • javap Hello > Hello.java
  • javadoc.exe: 자동 문서 생성기. 소스 파일에 정의된 주석을 이용하여 Java API 문서를 자동으로 생성한다.
  • jar.exe: 압축프로그램. 클래스파일과 프로그램 실행에 관련된 파일을 하나의 jar 파일(.jar)로 압축하거나 압축해제한다.

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

3.1. Hello.java

자바 소스를 작성한다.

public class Hello {
    public static void main(String[] args) { // main 메소드
        // 실행할 코드들
        System.out.println("Hello, Java!"); // 콘솔에 Hello, Java! 를 출력한다.
    }
}

자바로 작성한 코드를 실행하기 위해서는 컴파일 과정이 필요하다.

컴파일러에 의해 java 파일이 class 파일(byte code)로변환되어 JVM 위에서 실행

모든 클래스가 main 메소드를 가지고 있어야 하는 것은 아니다. 하지만, 하나의 Java 어플리케이션에는 main 메소드를 포함한 클래스가 반드시 하나 이상은 존재해야 한다. (main 메소드 없이 자바 코드가 실행될 수 없기 때문에)

 

보통은 하나의 파일에 하나의 클래스를 작성하지만, 여러개의 클래스를 사용할 수 있다. 주의해야할 점은 반드시 소스 파일의 이름은 클래스(class)의 이름과 일치해야 한다.

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

3.2.1. cannot find symbol 또는 cannot resolve symbol

지정된 변수나 메소드를 찾을 수 없다는 뜻. 선언되지 않은 변수 혹은 메소드를 사용하기 때문에 발생한다.

 

3.2.2. ";" expected

자바에서는 코드가 끝나는지점에 세미콜론(;)을 작성한다. 세미콜론은 작성하지 않으면 아래와 같은 예외가 발생한다.

 

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

"main" 메소드를 찾을 수 없다는 에러이다. 클래스 내에 main 메소드가 존재하지 않거나 오타가 존재하여 발생하는 에러이다.

 

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

Hello 라는 클래스를 찾을 수 없을때 발생하는 에러이다.

 

3.2.5. illegal start of expression

문법이 올바르지 않으면 발생하는 에러이다. 예를들어, 괄호를 제대로 안닫았거나 public 이나 static 키워드를 잘못 사용하는 경우에 발생한다.

 

3.2.6. class, interface or enum expected

키워드 class나 interface 또는 enum이 없다라는 의미지만, 보통은 괄호의 개수가 맞지 않는 경우에 발생한다.

 

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

콘솔에서 java Hello 를 실행하면 아래와 같이 진행이 된다.

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

 

3.4. 주석 (comment)

작성하는 프로그램의 크기가 커질수록 복잡해지기 떄문에 주석을 이용하여 설명을 작성한다.

 

주석에는 2종류가 있다.

  • 범위 주석: /* ... */
  • 한 줄 주석: //
/*
Date   : 2019. 09. 26
Source : Hello.java
Author : 김태홍
Email  : taehong0115@gmail.com
*/

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}

주석은 성능에 영향을 주지 않고 건너뛰기 때문에 주석이 많다고 컴파일한 결과가 달라지지 않는다. 안심하고 적극적으로 작성해도 된다.

4. Reference

Java의 정석, 남궁 성 지음

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기