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 |