1. 자바 언어의 특징
1. 운영체제에 독립적이다.
자바 응용프로그램은 운영체제나 하드웨어가 아닌 JVM하고만 통신한다. JVM이 자바 응용프로그램으로부터 전달받은 명령을 해당운영체제가 이해할 수 있도록 변환하여 전달한다. 자바로 작성된 프로그램은 독립적이지만 JVM은 종속적이여서 썬에서는 여러 운영체제에 설치할 수 있는 다른 버전의 JVM을 제공한다. 자바로 작성된 프로그램은 운영체제와 하드웨어에 관계없이 실행가능하며 이것을 한번 작성하면 어디서나 실행된다고 표현하기도 한다.
2. 객체지향언어(object-oriented pro gramming language)이다.
객체지향의 특징인 상속, 캡슐화, 다형성이 잘 적용된 언어이다.
3. 자동 메모리 관리
프로그램이 실행되면 가비지컬렉터가 자동적으로 메모리를 관리해주기 때문에 프로그래머는 메모리를 따로 관리하지 않아도 된다.
4. 네트워크 분산처리를 지원한다.
네트워크 프로그래밍 라이브러리를 통해 비교적 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발할 수 있도록 한다. 네트워크 관련으로 찾아보니 java.net을 지원하였는데, 최근에는 지원을 하지 않는것으로 확인했다.
https://en.wikipedia.org/wiki/Java.net
java.net - Wikipedia
From Wikipedia, the free encyclopedia java.netType of siteNews and Collaborative revision controlAvailable inEnglishDissolved28 April 2017OwnerOracleURLwww.java.netRegistrationOptionalLaunched2003Current statusPermanently shut down java.net was[1] a Java
en.wikipedia.org
5. 멀티쓰레드를 지원한다.
일반적으로 멀티스레드의 지원은 운영체제에 따라 구현방법도 상이하며, 처리방식도 다르다. 자바는 JVM덕분에 시스템과 관계없이 구현 가능하며, 관련 라이브러리가 제공된다. 그리고 여러 쓰레드에 관한 스케줄링을 자바 인터프리터가 담당하게 된다.
🤷🏻♀️인터프리터란?
인터프리터는 소스 코드를 순차적으로 읽어와서 각 줄의 명령을 번역하고 실행한다. 따라서 인터프리터는 코드를 수정하고 바로 실행 결과를 확인할 수 있으며, 개발과 테스트 과정에서 빠른 반복 개발을 지원한다. 그러나 인터프리터는 실행 시간에 코드를 해석하고 실행하기 때문에 컴파일러에 비해 일반적으로 느린 실행 속도를 가질 수 있습니다.
인터프리터는 다양한 프로그래밍 언어에서 사용될 수 있습니다. 예를 들어, Python, JavaScript, Ruby 등의 스크립팅 언어는 대표적인 인터프리터 언어입니다. 또한, 일부 언어는 컴파일과 인터프리트를 혼합하여 사용하기도 합니다. 자바는 소스 코드를 컴파일하여 바이트코드로 변환한 뒤, JVM 상에서 인터프리터에 의해 실행됩니다. 이러한 조합 방식을 통해 인터프리터의 장점과 컴파일러의 장점을 함께 활용할 수 있습니다.
인터프리터(Interpreter)는 소스 코드를 한 줄씩 읽어와서 해당 줄의 명령을 해석하고 실행하는 프로그램입니다. 인터프리터는 소스 코드를 실시간으로 해석하여 실행하기 때문에 컴파일 단계가 필요하지 않고, 개발자가 작성한 코드를 직접 실행할 수 있습니다.
🤷🏻♀️인터프리터는 어떻게 각 행마다 실행할까?
일반적인 인터프리터는 소스 코드를 실행하는 동안 실시간으로 해석하고 실행하기 때문에, 한 줄의 코드를 실행할 때마다 해당 코드의 의미를 해석하고 결과를 즉시 반환합니다. 따라서 인터프리터는 코드를 수정하고 바로 실행 결과를 확인할 수 있는 장점이 있습니다.결론적으로, 일반적인 인터프리터는 한 줄씩 실행하지만, 일부 인터프리터는 더 큰 단위로 실행하거나 JIT 컴파일러를 사용하여 실행 성능을 개선할 수 있습니다.
그러나 최적화를 위해서 일부 인터프리터는 한 줄 단위로 실행하는 것이 아니라, 일부 코드 블록이나 함수 단위로 실행하거나, 미리 컴파일된 바이트코드로 변환하여 실행하는 JIT (Just-In-Time) 컴파일러를 사용하기도 합니다. JIT 컴파일러는 반복적으로 실행되는 코드 블록을 기계어로 변환하여 성능을 향상시킬 수 있습니다.
🤷🏻♀️인터프리터와 컴파일러의 다른점은 무엇일까?
- 인터프리터는 고레벨언어로 각 행마다 실행한다.
- 컴파일러는 소스코드 전체를 컴퓨터 프로세서가 실행 할 수 있도록 바로 기계어로 변환한다.
- 일반적으로 컴파일러가 각 행마다 실행하는 특성을 가진 인터프리터보다는 실행시간이 빠르다
- 컴파일러는 전체 소스코드를 변환한 뒤 에러를 보고,
인터프리터는 각 행마다 실행하는 도중 에러가 보고되면 이후 작성된 코드를 살펴보지 않는다. 이는 보안적인 관점에서 도움이 된다. - 자바는 인터프리터와 컴파일러 모두 사용한다.
🤷🏻♀️JIT는 무엇일까?
자바에서 사용하는 컴파일러와는 다른 종류인가요?JIT(J ust-In-Time)는 실행 시간에 프로그램 코드를 기계어로 변환하여 성능을 향상시키는 컴파일 기술입니다. JIT 컴파일러는 프로그램이 실행되는 동안 인터프리터에 의해 해석된 중간 언어나 바이트코드를 실시간으로 기계어로 번역하여 실행합니다. 이러한 JIT 컴파일 기술을 통해 프로그램의 실행 속도가 향상되는 경우가 많습니다.자바는 기본적으로 인터프리터와 JIT 컴파일러를 함께 사용하는 방식을 채택하고 있습니다. 자바 소스 코드는 자바 컴파일러에 의해 바이트코드로 변환되며, 이 바이트코드는 JVM(Java Virtual Machine) 상에서 인터프리터에 의해 해석되고 실행됩니다. 그러나 JVM은 JIT 컴파일러를 내장하고 있어서 일부 코드 블록이나 루프 등의 반복적으로 실행되는 부분을 실시간으로 기계어로 변환하여 성능을 향상시킬 수 있습니다.
즉, 자바에서의 컴파일러는 소스 코드를 바이트코드로 변환하는 역할을 수행하고, 인터프리터는 바이트코드를 실행하는 역할을 수행하며, JIT 컴파일러는 인터프리터가 실행하는 도중에 일부 코드를 선택하여 기계어로 컴파일하여 실행 속도를 향상시킵니다. 이렇게 자바는 컴파일러와 인터프리터, 그리고 JIT 컴파일러를 조합하여 효율적인 실행 환경을 제공합니다.
하지만 JIT 컴파일러를 사용하면 아래 이미지와 같이 먼저 JIT 컴파일러가 소스 코드 전체를 확인한 후 중복된 부분을 미리 기계어로 번역시켜서 저장해놓습니다 이후 인터프리터 방식으로 번역하다가 중복된 부분을 만나게 되면 이미 변환된 기계어 코드를 재사용합니다. 따라서 훨씬 시간속도 면에서 개선된 모습을 보여줍니다 이 과정을 수행하기 위해서는 초반에 메모리를 잡아두거나 하는 선행 작업들이 있어서 초기 실행속도는 다소 느릴 수도 있습니다.
🤷🏻♀️ 자바는 왜 컴파일러와 인터프리터 모두 사용할까?
- 플랫폼 독립성
Java는 플랫폼 독립성을 갖는 언어입니다. Java 소스 코드는 컴파일러에 의해 바이트코드로 변환되는데, 이 바이트코드는 Java 가상 머신 (JVM)에서 실행됩니다. 인터프리터는 JVM 상에서 바이트코드를 해석하고 실행하는 역할을 수행합니다. 이렇게 함으로써 Java 언어로 작성된 프로그램은 어떤 플랫폼에서도 실행될 수 있습니다. - 성능과 실행시간
Java의 초기 목표 중 하나는 성능과 실행 시간을 개선하는 것이었습니다. Java 컴파일러는 소스 코드를 바이트코드로 변환하여 최적화된 실행 파일을 생성합니다. 이렇게 컴파일된 바이트코드는 인터프리터가 빠르게 실행할 수 있으며, JIT (Just-In-Time) 컴파일러를 통해 실시간으로 기계어로 변환되어 성능을 향상시킬 수 있습니다. - 보안
Java는 보안에 중점을 둔 언어입니다. JVM은 보안 기능을 내장하고 있으며, 인터프리터는 실행 시간에 코드 검증 및 보안 검사를 수행합니다. 이를 통해 악성 코드 실행을 방지하고 안전한 실행 환경을 제공합니다.
5. 동적 로딩을 지원한다.
자바로 작성된 애플리케이션은 여러 개의 클래스로 구성되어 있다. 자바는 동적로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 수 있다는 장점이 있다.
일부 클래스가 변경되어도 전체 애플리케이션을 다시 컴파일하지 않아도 되며, 애플리케이션의 변경사항이 발생해도 비교적 작은 작업만으로도 처리할 수 있는 유연한 애플리케이션을 작성할 수 있다.
JVM(Java Virtual Machine)
일반 애플리케이션은 OS만 거치고 하드웨어로 전달되는데 비해 Java 애플리케이션은 JVM을 한번 더 거친다. 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행시에 해석되기 때문에 속도가 느린 단점이 있지만 JIT컴파일러와 Hotspot 같은 신기술 도입으로 속도의 격차를 많이 줄였다.
Java 애플리케이션 |
JVM |
OS |
하드웨어 |
JDK설치하기
- JDK : 자바 개발도구
- JRE : 자바 실행환경
- javac.exe: 자바컴파일러, 자바소스코드를 바이트코드로 컴파일한다
- java.exe: 자바 인터프리터 컴파일러가 생성한 바이트코드를 해석하고 실행
- javap.exe : 역어셈블러, 컴파일된 클래스 파일을 원래의 소스로 변환한다.
- jar.exe : 압축프로그램 클래스 파일과 프로그램의 실행에 관련된 파일을 하나의 jar파일로 압축하거나 압축 해제한다.
⚠️ (소스)→ 컴파일러 (바이트코드) → 디스크 (바이트코드) → JVM (기계어) → 운영체제
프로그래밍에서 필요한 데이터를 추상화 시켜서 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.
3. 자바로 프로그램 작성하기
Hello.java
// [Hello.java] →(javac.exe 컴파일) Hello.class 생성 → (java.exe 실행)“Hello,world”출력
class Hello{
public static void main(String[] args){
System.out.println("Hello,world");
}
}
class 클래스이름{
public static void main(String[] args){} //메인 메서드 선언부
//주석을 제외한 모든 코드는 클래스 블럭 {}내에 작성해야한다.
}
잘못된 예시
- Hello2.java
public class Hello2{}
public class Hello3{}
// 하나의 소스 파일에 둘 이상의 public class가 존재하면 안된다!
- Hello3.java
public class Hello2()
class Hello3()
// 소스파일이름과 public 클리새의 이름이 일치해야한다.
자바 프로그램의 실행과정
- 프로그램의 실행에 필요한 클래스(*.class)파일을 로드한다
- 클래스파일을 검사한다
- 지정된 클래스에서 main을 호출한다.
주석
- 범위주석 : ‘/’, ‘/’ 사이의 내용은 주석으로 간주된다.
- 한 줄 주석 : // 부터 한줄의 내용은 주석으로 간주된다.
자주 발생하는 에러와 해결방법
- cannot find symbol / cannot resolver symbol
- 지정된 변수, 메서드를 찾을 수 없다는 뜻입니다.
- 선언되지 않은 변수 또는 메서드를 사용하거나, 변수 또는 메서드의 이름을 잘못 사용한 경우 발생
- 자바에서는 대소문자를 구분하므로 철자 뿐만아니라 대소문자 일치 여부도 확인해주세요
- ‘;’ expected(세미콜론)
- 세미콜론이 필요한 곳에 없다는 뜻
- 자바에서는 모든 문장의 끝에 세미콜론을 붙여줘야합니다.
- Exception int thread “main” java.lang.NoSuchMethodError.main
- main 메서드를 찾을 수 없다는 뜻
- 클래스 내에 main 메서드가 존재하지 않거나 선언부(public static void main(String[] args))에 오타가 존재할 경우 발생
- 클래스에 main 메서드가 정의되어 있는지 확인, 정의 되어 있다면 main 메서드의 선언부에 오타가 없는지 확인, 대소문자 일치여부도 확인필요
- Exception in thread “main” java.lang.NoClassDefFoundError:Hello
- Hello라는 클래스를 찾을 수 없다는 뜻
- Hello의 철자, 대소문자 등을 확인, 이상이 없다면 클래스 파일이 생성되었는지 확인 필요
- (Hello.java가 정상적으로 컴파일 된 경우 Hello.class가 있어야 함 / 클래스파일이 존재하는데 동일한 메시지가 반복될 경우 클래스패스(classpath)의 설정이 바르게 되었는지 확인 필요)
- illegal start of expression
- 문장 또는 수식의 앞부분이 문법에 맞지 않다는 뜻
- 문법적 오류가 있다는 것으로, 괄호(’(’, ‘{’) 등을 열고서 닫지 않았거나, 수식이나 if 문, for문 등에 문법적 오류가 존재하는 경우 또는 public, static 등의 키워드를 잘못 사용한 경우 발생
- 에러가 발생된 부분이 문법적으로 올바른지 확인 필요
- class, interface or enum expected
- 키워드 class나 interface 또는 enum이 없다는 뜻
- (보통 괄호 ('{' 또는 '}')의 개수가 일치 하지 않는 경우 발생)
- 열린괄호와 닫힌괄호의 개수가 같은지 확인 필요
@출처: 자바의 정석3rd Edition/ 도우출판/ 남궁성
'programming language > Java' 카테고리의 다른 글
[Java] 03.메서드 (0) | 2021.11.28 |
---|---|
[Java] 02. 변수 (0) | 2021.11.28 |
[Java] 01.클래스와 객체 (0) | 2021.11.28 |
[Java] PrepareSatement (0) | 2021.11.05 |
[Java]데이터 베이스 연결 예제 (0) | 2021.11.05 |
댓글