Java의정석 1| 자바를 시작하기 전에

두윤기·2022년 12월 3일
0
post-thumbnail

1. Java(자바)

1.1 자바란 ?

- 객체지향 프로그래밍 언어

- 운영체제에 독립적이다 => 운영체제의 종류에 관계없이 실행 가능

- 풍부한 클래스 라이브러리(Java API)

1.2 자바의 역사

- Oak(프로그래밍 언어)이 Java로 이름변경

가전제품에 탑재 될 소프트웨어

C++로 하고자 했지만 한계 느낌, C++의 장점 도입하고 단점 보완

- 소규모 가전제품과 대규모 기업환경을 위한 소프트웨어 개발 분야

1.3 자바언어의 특징

1. 운영체제에 독립적

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

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

- JVM이 명령을 해당 운영체제가 이해할 수 있도록 변환하여 전달

- JVM은 운영체제 종속적

2. 객체지향언어(object-oriented programming language)

- 객체지향개념의 특징인 상속, 캡슐화, 다형성

- 재사용성과 유지보수의 용이성

3. 배우기 쉽다

- 자바의 연산자와 기본구문은 C++에서, 객체지향관련 구문은 스몰톡이라는 개체지향언어에서 가져옴

- 간결하고 명료한 객체지향적 설계

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

- 가비지컬렉터(garbage collector)가 자동적으로 메모리 관리

- garbage collector가 없다면 프로그래머가 사용하지 않는 메모리를 체크하고 반환하는 일을 수동적으로 처리

- 자동으로 메모리 관리하는 것이 비효율적인 측면도 있지만, 보다 프로그래밍에 집중할 수 있게 도와줌

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

- 인터넷과 대규모 분산환경을 염두에 둔 까닭에 풍부하고 다양한 네트워크 프로그래밍 라이브러리를 통해 비교적 짧은 시간에 네트워크 관련 프로그램 쉽게 개발

6. 멀티쓰레드 지원

- 자바에서 개발되는 멀티쓰레드 프로그램은 시스템(운영체제)과는 관계없이 구현가능

- 여러 쓰레드에 대한 스케쥴링(scheduling)을 자바 인터프리터가 담당

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

- 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 수 잇다

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

참고| JAVA의 단점:속도문제 -> 바이트코드(byte code)를 기계어로 바로 변환해주는 JIT컴파일러와 Hotspt과 같은 신기술의 도입으로 JVM의 기능 향상(속도 문제 상당히 개선)

1.4 JVM(Java Virtual Machine)

- JVM: 자바를 실행하기 위한 가상 컴퓨터

- 가상 기계(virtual machine): 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미의 용어

- 가상 컴퓨터: 실제 컴퓨터(하드웨어)가 아닌 소프트웨어로 구현된 컴퓨터

- 자바로 작성된 어플리케이션은 모두 JVM에서만 실행

- "write once, run anywhere"

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

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

JDK: Java Development Kit, JVM과 자바클래스 라이브러리외에 자바를 개발하는데 필요한 프로그램들 설치

JDK의 bin 디렉토리에 있는 주요 실행 파일들

  • javac.exe: 자바 컴파일러, 자바소스코드를 바이트코드로 컴파일
  • java.exe: 자바 인터프리터, 컴파일러가 생성한 바이트코드를 해석하고 실행한다
  • javap.exe: 역어셈블러, 컴파일된 클래스파일을 원래의 소스로 변환한다
  • appletviewer.exe: 에플릿 뷰어, HTML문서에 삽입되어 있는 applet을 실행시킨다
  • javadoc.exe: 자동문서생성기, 소스파일에 있는 주석(/** */)을 이용하여 Java API문서와 같은 형식의 문서를 자동으로 생성한다
  • jar.exe: 압축 프로그램, 클래스파일과 프로그램의 실행에 관련된 파일을 하나의 jar파일(.jar)로 압축하거나 압축해제한다.
    압축할 때 jar cvf Hello.jar Hello1.class Hello2.class
    압축풀 때 jar xvf Hello.jar
    참고| JDK와 JRE
    JDK: 자바개발도구 (Java Development Kit), JRE + 개발에 필요한 실행파일(Javac.exe 등)
    JRE: 자바실행환경 (Java Runtime Evironment), 자바로 작성된 응용프로그램이 실행되기 위한 최소환경, JVM + 클래스라이브러리(Java API)

2.2 Java API문서 설치하기

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

3.1 Hello.java

자바 편집기

  • 메모장(notepad.exe)
  • editplus
  • eclipse
  • netbeans
class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world.");
    }
}

자바 실행 순서

자바파일 작성 (.java, 첫글자 대문자)
->javac.exe(.class 클래스파일 생성)
->java.exe(클래스파일 실행)

클래스(class)

  • 자바에서 모든 코드는 반드시 클래스 안에 존재
  • 서로 관련된 코드들을 그룹으로 나누어 별도의 클래스를 구성
  • 클래스들이 모여 하나의 Java 어플리케이션
class 클래스명 {
	/*
    	주석을 제외한 모든 코드는 클래스의 블럭 {} 내에 작성해야 한다
	*/
}

참고| package문과 import문은 예외적으로 클래스 밖에 작성

  • main메서드(java application의 시작과 끝점)
public static void main(String[] args) // main 메서드의 선언부
{
	// 실행될 문장들을 적는다.
}

- java 프로그램을 실행할 때, 'java.exe'에 의해 호출될 수 있도록 미리 약속된 부분, 항상 똑같이 작성
- Java application은 main메서드의 호출로 시작해서 main메서드의 첫 문장부터 마지막 문장까지 수행을 마치면 종료
- 모든 클래스가 main 메서드를 가지고 있어야 하는 것은 아니지만, 하나의 Java application에는 main메서드를 포함한 클래스가 반드시 하나는 있어야 한다.
- Java application을 실행할 때는 main메서드를 포함한 클래스의 이름 적어주어야한다.
참고| 예외적으로 애플릿(applet)이나 서블릿(servlet)은 main메서드가 없어도 된다. 대신 유사한 역할을 하는 다른 메서드가 존재

  • public class와 다중 class
    - 하나의 소스파일에 하나의 클래스만을 정의하는 것이 보통이지만, 하나의 소스파일에 둘 이상의 클래스를 정의하는 것도 가능
    - 소스파일의 이름은 public class의 이름과 일치해야 한다
    - 소스파일 내에 public class가 없다면, 소스파일의 이름은 소스파일 내 어떤 클래스의 이름으로 해도 상관없다.
    - 올바른 작성 예시
// Hello2.java
public class Hello2 {}
	   class Hello3 {}
       
// Hello2.java
class Hello2 {}
class Hello3 {}

- 잘못된 작성 예시

//Hello2.java
public class Hello2 {}
public class Hello3 {}

// Hello3. java
public class Hello2 {}
	   class Hello3 {}
       
// hello2.java
public class Hello2 {}
	   class Hello3 {}

- 소스파일과는 달리 클래스파일을 클래스마다 하나씩 만들어지므로 Hello2.java를 컴파일 하면 'Hello2.class'와 'Hello3.class' 모두 두개의 클래스파일이 생성된다.
- 접근제어자(access modifier)인 'public'은 추후 학습

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

1. cannot find symbol || cannot resolve symbol

  • 지정된 변수나 메서드를 찾을 수 없다
  • 변수 또는 메서드의 이름을 잘못 사용한 경우
  • 철자 뿐만 아니라 대소문자의 일치여부 확인

2. ';' expected

  • 세미콜론';'이 필요한 곳에 없다는 뜻

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

  • 'main메서드를 찾을 수 없다'
  • 실제로 클래스 내에 main메서드가 존재하지 않거나 메서드의 선언부 'public static void main(String[] args)'에 오타

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

  • 'Hello라는 클래스를 찾을 수 없다'
  • 클래스 'Hello'의 철자, 대소문자를 확인해보고 이상이 없으면 클래스파일이 생성되었는지 확인
  • 클래스파일이 존재하는데도 동일한 메시지가 반복해서 나타난다면 클래스패스(classpath) 설정 확인

5. illegal start of expression

  • 문법적 오류
  • 괄호 열고서 닫지 않거나, 수식이나 if문 for문 등에 문법적 오류 있을 때, 또는 public이나 static과 같은 키워드 잘못 사용한 경우

6. class, interface, or enum expected

  • 키워드 class나 interface 또는 enum이 없다
  • 보통 열린괄호'{'와 닫힌괄호'}'의 개수가 일치하지 않을 때

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

Java application 진행순서

  • 프로그램의 실행에 필요한 클래스(.class파일)를 로드
  • 클래스파일 검사(파일형식, 악성코드 체크)
  • 지정된 클래스(Hello)에서 main(String args)를 호출
    main method의 첫 줄부터 마지막 코드까지 모두 실행되면 프로그램 종료, 프로그램에 사용했던 자원 반환
    참고| AWT나 Swing처럼 멀티쓰레드를 이용하는 기술로 작성된 Java application은 main method가 종료되어도 실행중인 다른 thread가 존재하면 프로그램이 종료되지 않는다.

3.4 주석

  • 작성하는 프로그램의 크기가 커질수록 프로그램을 이해하고 변경하는 일이 점점 어려워진다
  • 주석을 이용해서 프로그램 코드에 대한 설명을 적절히 덧붙여 놓으면 프로그램을 이해하는 데 많은 도움이 된다.
  • 그 외에도 프로그램의 작성자, 작성일시, 버전과 그에 따른 변경이력 등의 정보 제공

- 범위 주석: /* */

- 한줄 주석: //

profile
programmerD

0개의 댓글