Java/Java의 정석

Chapter 01 자바를 시작하기 전에

계란💕 2022. 2. 15. 01:13

1. 자바(Java Programming Language)

  1.1 자바란?

  - 자바는 선에서 개발하여 1996년 1월에 공식적으로 발표한 객체지향 프로그래밍 언어이다. 

  - 자바의 중요한 특징은 운영체제(Operating System, 플랫폼)에 독립적이라는 것이다. 

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

  - 이를 잘 활용하면 강력한 기능의 자바 프로그램을 작성할 수 있다. 

  - 자바는 꾸준히 성능 개선하며 새로운 버전을 발표한다.

  - 모바일(J2ME)이나 대규모 기업환경(J2EE), XML.. 등 최신기술을 지원하며 활동 영역을 넓히고 있다. 

 

  1.2 자바의 역사

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

  - 썬 엔지니어들의 본래 목표는 가전 제품에 탑재될 소프트웨어를 만드는 것이었다. 

  - 원래 C++을 이요하려 했지만 목적을 이루기에 부족했다. 

  - 그래서 C++의 장점을 도입하고 단점을 보완한 새로운 언어를 개발하게 되었다. 

  - Oak는 처음에 가전제품이나 PDA 같은 소형기기에 사용될 목적이었다. 

  - 여러 종류의 운영체제를 사용하는 인터넷이 등장하자 운영체제에 독립적인 Oak가 적한하다고 판단했다. 

  - Oak를 인터넷에 적합하도록 개발 방향을 바꾸면서 이름을 자바로 변경했다. 

  - 자바로 개발한 웹 브라우저인 '핫 자바(Hot java)'를 발표하고 다음해 1996년 1월에 자바 정식버전을 발표했다. 

  - 자바로 작성된 애플릿(Applet)은 정적인 웹페이지의 사운드와 애니메이션 등 멀티미디어적인 요소들을 제공하는

  - 유일한 방법이었기 때문에 많은 인기를 얻고 단 기간에 가장 많은 사용자층을 확보했다. 

  - 그러나 보안상 이유로 최신 웹브라우저에에서 애플릿을 더 이상 지원하지 않게 되었다. 

  - 대신 서버 쪽 프로그래밍을 위해 서블릿(Servlet)과 JSP(Java Server Pages)가 더 많이 사용되고 있다. 

  - 구글의 스마트폰 운영체제인 안드로이드에서도 Java를 사용한다. 

  - 앞으로도 소규모 가전제품, 대규모 기업환경을 가리지 않고 SW개발 분야에서 활발히 자바를 사용할 것으로 보인다. 

 

  1.3 자바 언어의 특징

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

  - 기존의 언어는 한 운영체제에 맞게 개발된 프로그램을 다른 종류의 운영체제에 적용하는 게 힘들었다. 

  - 하지만 자바에서는 그런 수고가 필요 없다.

  - 일종의 에뮬레이터인 자바 가상머신(JVM)을 통해 가능하다. 

  - 자바 응용프로그램은 운영체제나 하드웨어가 아닌 JVM하고만 통신한다.

  - JVM이 자바 응용프로그램으로부터 전달받은 명령을 해당 운영체제가 이해할 수 있도록 변환하여 전달한다. 

  - 자바로부터 작성된 프로그램을 운영체제에 독립적이지만 JVM은 운영체제에 종속적이다.

  - 그래서 썬에서는 여러 운영체제에 설치할 수 있는 서로 다른 버전의 JVM 제공하고 있다. 
  - 자바로 작성된 프로그램을 운영체제와 하드웨어에 관계없이 실행 가능하다

  - 한번 작성하면 어디서나 실행된다. 

 

  (2) 객체지향언어이다. 

  - 객체지향 프로그래밍 언어(Object Oriented Programming Language)중의 하나이다.

  - 객체지향언어의 특징인 상속, 캡슐화, 다형성이 잘 적용된 순수 객체지향언어라는 평가를 받는다. 

 

  (3) 비교적 배우기 쉽다. 

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

  - 두 언어의 장점은 불필요한 부분은 제거하여 쉽게 배울 수 있어서 간결하고 이해하기쉬운 코드로 작성 가능하다. 

  - 객체지향언어의 장점에도 불구하고 배우기 어려워서 사용자층을 확보하기 어려웠다. 

  - 그러나 자바의 간결, 명료한 객체지향적 설계는 쉽게 활용할 수 있어서  객체지향프로그래밍 저변확대에 기여했다. 

   

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

  - 자바로 작성된 프로그램이 실행되면 가비지 컬렉터(garbage collector)가 자동으로 메모리를 관리해준다. 

  - 그래서 프로그래머는 메모리를 따로 관리하지 않아도 된다. 

  - 덕분에 프로그래머는 보다 프로그래밍에 집중할 수 있다. 

 

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

  - 다양한 네트워크 프로그래밍 라이브러리(Java API)로 네크워크 관련 프로그램을 쉽게 개발하도록 지원한다.

 

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

  - 일반적으로 멀티쓰레드의 지원은 운영체제에 따라 구현 방법, 처리 방식도 다르다. 

  - 그러나 자바에서 개발되는 멀티쓰레드 프로그램은 시스템과는 관계없이 구현가능하다. 

  - 여러 쓰레드에 대한 스케줄링(scheduling)을 자바 인터프리터가 담당하게 된다. 

 

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

  - 자바로 작성된 애플리케이션은 여러 개의 클래스로 구성된다. 

  - 자바는 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩 되지 않고 필요할 때, 로딩하여 사용 가능하다. 

  - 일부 클래스가 변경되도 전체 애플리케이션을 다시 컴파일하지 않아도 된다. 

  - 애플리케이션의 변경사항이 발생해도 간단하게 처리 가능한 애플리케이션을 작성할 수 있다. 

  - 과거에 자바는 속도에 대한 문제가 있었다. 

  - 요즘에는 JIT컴파일러와 Hotspot과 같은 신기술 도입으로 JVM 기능이 향상되고 속도문제가 개선되었다. 

 

  (8) 번역 언어

  - 자바의 프로그램 소스는 중간 코드인 바이트 코드로 변환되고, 바이트코드는 자가 가상 기계에서 인퍼프리터의 도움으로 실행된다. 

 

 

  1.4 JVM(Java Virtual Machine) - 자바 가상 머신

  - JVM(Java Virtual Machine)은 자바를 실행하기 위해 가상 기계를 의미한다. 

  - 가상 기계(Virtual Machine)는 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미의 용어이다. 

  - 가상 컴퓨터는 소프트웨어로 구성된 컴퓨터이며 컴퓨터 속의 컴퓨터라고 생각하면 된다. 

  - 자바로 작성된 애플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행된다. 

  - 따라서, 자바 애플리케이션이 실행되기 위해서 반드시 JVM이 필요하다. 

  -일반 애플리케이션의 코드는 OS만 거치고 하드웨어로 전달 되는데 비해 자바는 JVM을 한 번 더 거친다. 

  - 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석되기 때문에 속도가 느리다는 단점이 있다. 

  - 그러나 요즘에는 JIT 컴파일러와 향상된 최적화 기술이 적용되서 속도의 격차가 많이 줄어 들었다. 

  - OS에 종속적인 일반 애플리케이션과 다르게 Java는 JVM하고만 상호작용하기 때문에 OS와 하드웨어에 독립적이다. 

  - 그래서 다른 OS에서도 프로그램의 변경 없이 실행 가능한 것이다. 

  - 단, JVM은 OS에 종속적이기 때문에 해당 OS에서 실행가능한 JVM이 필요하다. 

일반 프로그램 소스코드 ==(컴파일러)==> 이진 코드 => OS(하드웨어)
자바 프로그램 소스코드 ==(컴파일러)==> 바이트 코드 => API/JVM => OS(하드웨어)

 

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

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

  - 먼저 JDK(Java Development Kit)를 설치해야 한다. 

  - 그러면 JVM과 Java API외에 필요한 프로그램들이 설치된다. 

  - 설치된 디렉토리의 bin디렉토리(실행 파일 들어 있음)를 Path에 추가해줘야 한다. 

    -> 자바가 실행되는 경로를 Path의 환경 변수에 추가한다.

    -> %JAVA_HOME%\bin... 라고 추가할 수도 있다. 

 

  - Path는 OS가 파일의 위치를 파악하는데 사용하는 경로(Path)이다. 

  - Path에 디렉토리를 등록하면 파일 경로 없이 파일 이름만으로도 사용할 수 있다. 

 

 

  2.2 Java API문서 설치하기 

  - Java API를 사용하기 위해 Java API문서가 필수적이다. 모든 클래스에 대한 내용이 자세히 나와있다. 

  - http://java.sun.com/ 에서 다운 가능하다. 

  - Java API문서가 C:\jdk1.8에 설치 되었을 때, 

  - C:\jdk1.8\docs\api\index.html 을 웹 브라우저로 열면 클래스에 대한 설명을 볼 수 있다. 

 

  2.3. 

  - 자바 소스

    -> 확장자는 java 

    -> 클래스 이름과 동일해야한다.  

  - 컴파일과 실행

    -> 명령어 javac 자바소스파일

    -> 명령어 java 클래스 이름

 

 

  Ex) cmd창으로 코딩

<hide/>
Microsoft Windows [Version 10.0.19044.1645]
(c) Microsoft Corporation. All rights reserved.

C:\Users\82104>copy con Hello.java
public class Hello{
        public static void main(String[] args){
                System.out.println("Hello!!");
        }
}

        1개 파일이 복사되었습니다.("Hello!!");

C:\Users\82104>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: F41D-CAD1

 C:\Users\82104 디렉터리

2022-05-13  오후 12:49    <DIR>          .
2022-05-13  오후 12:49    <DIR>          ..
2022-04-30  오후 02:37    <DIR>          .android
2022-02-02  오후 03:50    <DIR>          .cache
2022-05-12  오후 08:49    <DIR>          .eclipse
2022-05-13  오전 11:14    <DIR>          .m2
2022-05-12  오후 09:10    <DIR>          .p2
2021-11-14  오후 09:05    <DIR>          .vscode
2021-05-05  오후 02:54    <DIR>          3D Objects
2021-05-05  오후 02:54    <DIR>          Contacts
2022-05-13  오전 10:41    <DIR>          Desktop
2022-05-12  오후 09:28    <DIR>          Documents
2022-05-13  오후 12:38    <DIR>          Downloads
2022-05-12  오후 08:41    <DIR>          eclipse
2022-05-12  오후 08:49    <DIR>          eclipse-workspace
2021-05-05  오후 02:54    <DIR>          Favorites
2022-05-13  오후 12:53               106 Hello.java
2022-04-30  오후 02:42    <DIR>          IdeaProjects
2019-01-05  오후 04:21    <DIR>          Intel
2021-05-05  오후 02:54    <DIR>          Links
2022-02-02  오후 03:14    <DIR>          Music
2021-08-05  오후 09:23    <DIR>          OneDrive
2022-02-09  오전 11:08    <DIR>          Pictures
2022-02-02  오후 06:47    <DIR>          Roaming
2021-05-05  오후 02:54    <DIR>          Saved Games
2021-05-05  오후 02:54    <DIR>          Searches
2021-05-05  오후 02:54    <DIR>          Videos
               1개 파일                 106 바이트
              26개 디렉터리   8,894,377,984 바이트 남음

C:\Users\82104>type Hello.java
public class Hello{
        public static void main(String[] args){
                System.out.println("Hello!!");
        }
}


C:\Users\82104>javac
Usage: javac <options> <source files>
where possible options include:
  @<filename>                  Read options and filenames from file
  -Akey[=value]                Options to pass to annotation processors
  --add-modules <module>(,<module>)*
        Root modules to resolve in addition to the initial modules, or all modules
        on the module path if <module> is ALL-MODULE-PATH.
  --boot-class-path <path>, -bootclasspath <path>
        Override location of bootstrap class files
  --class-path <path>, -classpath <path>, -cp <path>
        Specify where to find user class files and annotation processors
  -d <directory>               Specify where to place generated class files
  -deprecation
        Output source locations where deprecated APIs are used
  --enable-preview
        Enable preview language features. To be used in conjunction with either -source or --release.
  -encoding <encoding>         Specify character encoding used by source files
  -endorseddirs <dirs>         Override location of endorsed standards path
  -extdirs <dirs>              Override location of installed extensions
  -g                           Generate all debugging info
  -g:{lines,vars,source}       Generate only some debugging info
  -g:none                      Generate no debugging info
  -h <directory>
        Specify where to place generated native header files
  --help, -help, -?            Print this help message
  --help-extra, -X             Print help on extra options
  -implicit:{none,class}
        Specify whether or not to generate class files for implicitly referenced files
  -J<flag>                     Pass <flag> directly to the runtime system
  --limit-modules <module>(,<module>)*
        Limit the universe of observable modules
  --module <module-name>, -m <module-name>
        Compile only the specified module, check timestamps
  --module-path <path>, -p <path>
        Specify where to find application modules
  --module-source-path <module-source-path>
        Specify where to find input source files for multiple modules
  --module-version <version>
        Specify version of modules that are being compiled
  -nowarn                      Generate no warnings
  -parameters
        Generate metadata for reflection on method parameters
  -proc:{none,only}
        Control whether annotation processing and/or compilation is done.
  -processor <class1>[,<class2>,<class3>...]
        Names of the annotation processors to run; bypasses default discovery process
  --processor-module-path <path>
        Specify a module path where to find annotation processors
  --processor-path <path>, -processorpath <path>
        Specify where to find annotation processors
  -profile <profile>
        Check that API used is available in the specified profile
  --release <release>
        Compile for a specific VM version. Supported targets: 6, 7, 8, 9, 10, 11
  -s <directory>               Specify where to place generated source files
  -source <release>
        Provide source compatibility with specified release
  --source-path <path>, -sourcepath <path>
        Specify where to find input source files
  --system <jdk>|none          Override location of system modules
  -target <release>            Generate class files for specific VM version
  --upgrade-module-path <path>
        Override location of upgradeable modules
  -verbose                     Output messages about what the compiler is doing
  --version, -version          Version information
  -Werror                      Terminate compilation if warnings occur


C:\Users\82104>javac Hello.java

C:\Users\82104>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: F41D-CAD1

 C:\Users\82104 디렉터리

2022-05-13  오후 12:57    <DIR>          .
2022-05-13  오후 12:57    <DIR>          ..
2022-04-30  오후 02:37    <DIR>          .android
2022-02-02  오후 03:50    <DIR>          .cache
2022-05-12  오후 08:49    <DIR>          .eclipse
2022-05-13  오전 11:14    <DIR>          .m2
2022-05-12  오후 09:10    <DIR>          .p2
2021-11-14  오후 09:05    <DIR>          .vscode
2021-05-05  오후 02:54    <DIR>          3D Objects
2021-05-05  오후 02:54    <DIR>          Contacts
2022-05-13  오전 10:41    <DIR>          Desktop
2022-05-12  오후 09:28    <DIR>          Documents
2022-05-13  오후 12:38    <DIR>          Downloads
2022-05-12  오후 08:41    <DIR>          eclipse
2022-05-12  오후 08:49    <DIR>          eclipse-workspace
2021-05-05  오후 02:54    <DIR>          Favorites
2022-05-13  오후 12:57               411 Hello.class
2022-05-13  오후 12:53               106 Hello.java
2022-04-30  오후 02:42    <DIR>          IdeaProjects
2019-01-05  오후 04:21    <DIR>          Intel
2021-05-05  오후 02:54    <DIR>          Links
2022-02-02  오후 03:14    <DIR>          Music
2021-08-05  오후 09:23    <DIR>          OneDrive
2022-02-09  오전 11:08    <DIR>          Pictures
2022-02-02  오후 06:47    <DIR>          Roaming
2021-05-05  오후 02:54    <DIR>          Saved Games
2021-05-05  오후 02:54    <DIR>          Searches
2021-05-05  오후 02:54    <DIR>          Videos
               2개 파일                 517 바이트
              26개 디렉터리   8,890,417,152 바이트 남음

C:\Users\82104>java Hello
Hello!!

C:\Users\82104>javac Hello.java

C:\Users\82104>
C:\Users\82104>
C:\Users\82104>java Hello
Hello!!!!!!!!!!!!!!!!!!!!

C:\Users\82104>

 

 

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

  3.1 Hello.java

  - 자바로 프로그램을 개발하려면 편집기가 필요하다. 

  - 처음 자바를 배우면 이클립스나 인텔리제이와 같이 고급 개발도구를 사용하는 게 좋다. 

  - 자바에서 모든 코드는 반드시 클래스 안에 존재해야 한다. 

  - 이 클래스들이 모여 하나의 Java애플리케이션을 이룬다. 

  - 클래스 작성 방법

<hide/>
class 클래스이름{
	/*
	주석을 제외한 모든 코드는 클래스의 블럭{}내에 작성해야한다. 
	*/
}
<hide/>
class 클래스이름{
	public static void main(String[] args) { // main메서드의 선언부
		/실핼된 문장들을 적는다. 
	}
}

  - public static void main(String[] args) : main 메서드의 선언부이다.

  - 프로그램을 실행할 때 java.exe 에 의해 호출되도록 미리 약속된 부분이므로 항상 똑같이 적어야 한다. 

  - '[]'은 배열을 의미하는 기호로 배열의 타입 또는 배열의 이름 옆에 붙일 수 있다. 

  - String[] args : String 타입의 배열 args를 선언한다. 

  - '{}'는 메서드의 시작과 끝을 의미하고 이 괄호 사이에 작업할 내용을 작성해 넣는다. 

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

  - 모든 클래스가 main메서드를 가지고 있어야 하는 건 아니다.

  - 하지만, Java 애플리케이션에는 main메서드를 포함한 클래스가 반드시 하나는 있어야한다. 

  - 하나의 소스 파일에 하나의 클래스만 정의하는 것이 보통이지만 둘 이상의 클래스 정의도 가능하다.  

  - 소스파일의 이름은 public class의 이름과 일치해야 하는 것을 주의한다. 

 

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

  (1) cannot find symbol 또는 canno resolve symbol 또는 cannot resolve symbol

  - 변수 또는 메서드 이름을 잘못 사용한 경우: 대소문자나 철자를 확인한다. 

  (2) ';' expected

  - 세미콜론이 없다: 모든 문장의 끝에 필요하다. 

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

  - main 메서드를 찾을 수 없다: 클래스 내에 메인 매서드가 없거나 메서드의 선언부에 오타가 있는 경우

  (4) Exception in thread "main"java.lang.NoSuchMethodError: Hello

  - Hello라는 클래스를 찾을 수 없다: 클래스의 철자를 확인해보고 클래스 파일이 생성되었는지 확인한다. 

  (5) illegal start of expression 

  - 문장의 앞부분이 문법에 맞지 않는 경우: 문장에 문법적 오류 있는 경우 

  - {},[] 괄호, if, for문에 오류가 있거나 public이나 static 키워드를 잘못 사용한 경우에도 발생한다. 

  (6) class, interfere, or enum expected

  - 열린괄호'{' 와 닫힌괄호'}'의 개수가 같은지 확인한다. 

 

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

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

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

  (3) 지정된 클래스(Hello)에서 main 메서드를 호출한다. 

 

  3.4 주석(Comment)

  - 주석을 이용해서 코드에 대한 설명을 덧붙일 수 있다. 

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

  - 한 줄 주석: //부터 라인 끝까지의 내용은 주석으로 간주된다. 

  - ""(큰따옴표) 안에 주석이 있을 때는 주석이 아닌 문자열로 인식된다. 

 

'Java > Java의 정석' 카테고리의 다른 글

Chapter 06 객체지향 프로그래밍 I  (0) 2022.02.22
Chapter 05 배열(Array)  (0) 2022.02.20
Chapter 04 조건문과 반복문  (0) 2022.02.19
Chapter 03 연산자(Operator)  (0) 2022.02.19
Chapter 02 변수(Variable)  (0) 2022.02.17