[Chapter 1] 자바를 시작하기 전에

slchoi·2022년 1월 3일
0

자바의 정석

목록 보기
2/19
post-thumbnail

'자바의 정석 3rd Edition'을 공부하며 정리한 내용입니다.

1. 자바(JAVA Programming Language)


1.1 자바란?

  • 썬에서 개발하여 1996년 1월에 공식적으로 발표한 객체지향 프로그래밍 언어
  • 운영체제에 독립적. 자바로 작성된 프로그램은 운영체제의 종류에 관계없이 실행 가능
  • 풍부한 클래스 라이브러리(Java API)를 통해 프로그래밍에 필요한 요소들을 기본적으로 제공

1.3 자바언어의 특징

1. 운영체제에 독립적

  • 기존의 언어는 한 운영체제에 맞게 개발된 프로그램을 다른 종류의 운영체제에 적용하기 위해서는 많은 노력이 필요. Java는 그럴 필요 없음
  • 일종의 에뮬레이터인 자바가상머신(JVM)을 통해 자바 응용프로그램은 운영체제나 하드웨어가 아닌 JVM과 통신하고 JVM이 자바 응용프로그램으로부터 전달받은 명령을 해당 운영체제가 이해할 수 있도록 변환해 전달
    • 자바로 작성된 프로그램은 운영체제에 독립적이지만 JVM은 운영체제에 종속적이어서 썬에서는 여러 운영체제에 설치할 수 있는 서로 다른 버전의 JVM을 제공

2. 객체지향언어

  • 객체지향개념의 특징인 상속, 갭슐화, 다형성이 잘 적용된 객체지향언어

3. 비교적 배우기 쉬움

  • 연산자와 기본구문은 C++에서, 객체지향관련 구문은 스몰톡이라는 객체지향언어에서 가져와 두 언어의 장점은 취하면서 복잡하고 불필요한 부분은 제거해 쉽게 배울 수 있음

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

  • 자바로 작성된 프로그램이 실행되면, 가비지컬렉터(garbage collector)가 자동적으로 메모리를 관리해주기 때문에 프로그래머는 메모리를 따로 관리하지 않아도 됨

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

  • 다양한 네트워크 프로그래밍 라이브러리(Java API)를 통해 비교적 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발할 수 있도록 지원

6. 멀티쓰레드 지원

  • 일반적인 멀티쓰레드의 지원은 사용되는 운영체제에 따라 구현 방법이 상이
  • 자바에서 개발되는 멀티쓰레드 프로그램은 시스템과 상관없이 구현가능하며, 관련된 라이브러리가 제공되므로 구현이 쉬움
  • 여러 쓰레드에 대한 스케줄링을 자바 인터프리터가 담당

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

  • 자바로 작성된 애플리케이션은 여러 개의 클래스로 구성
  • 자바는 동적 로딩을 지원하므로 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 수 있음
  • 일부 클래스가 변경되어도 전체 애플리케이션을 다시 컴파일하지 않아도 되며, 애플리케이션의 변경사항이 발생해도 비교적 적은 작업만으로도 처리할 수 있는 애플리케이션을 작성할 수 있음

1.4 JVM(Java Virtual Machine)

  • 자바를 실행하기 위한 가상 컴퓨터
  • 가상 기계: 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미
  • 가상 컴퓨터: 실제 컴퓨터(하드웨어)가 아닌 소프트웨어로 구현된 컴퓨터
  • 자바로 작성된 애플리케이션은 모두 JVM에서만 실행되므로 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요

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


3.1 Hello.java

  • 자바에서 모든 코드는 반드시 클래스 안에 존재해야 하며, 서로 관련된 코드들을 그룹으로 나누어 별도의 클래스를 구성. 이 클래스들이 모여 하나의 Java 애플리케이션을 이룸
  • 클래스 작성하는 방법
  class 클래스이름 {
  	/*
     	주석을 제외한 모든 코드는 클래스의 블럭 {} 내에 작성
     */
  }
  • package문과 import문은 예외적으로 클래스의 밖에 작성
 class 클래스이름 {
 	public static void main(Strirng[] args) // main 메서드의 선언부
    {
    	// 실행될 문장들을 적음
    }
 }
  • 모든 클래스가 main 메서드를 가지고 있어야 하는 것은 아니지만, 하나의 Java 애플리케이션에는 main 메서드를 포함한 클래스가 반드시 하나는 있어야 함.
  • main 메서드는 Java 애플리케이션의 시작점이므로 main 메서드 없이는 Java 애플리케이션은 실행될 수 없기 때문
  • 하나의 소스파일에 하나의 클래스만을 정희하는 것이 보통이지만, 하나의 소스파일에 둘 이상의 클래스를 정의하는 것도 가능
    • 단, 소스파일의 이름은 public class의 이름과 일치해야 함. 만일 소스파일 내에 public class가 없다면, 소스파일의 이름은 소스파일 내의 어떤 클래스의 이름으로 해도 상관없음

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

1. cannot find symbol 또는 cannot resolve symbol

  • 의미: 저장된 변수나 메서드를 찾을 수 없다
  • 원인: 선언되지 않은 변수나 메서드를 사용하거나, 변수 또는 메서드의 이름을 잘못 사용한 경우에 발생
  • 해결방법: 자바는 대소문자를 구분하므로 철자와 대소문자의 일치여부 확인

2. ';' expected

  • 의미: 세미콜론이 필요한 곳에 없다
  • 자바의 모든 문장의 끝에는 ';'을 붙여줘야 함

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

  • 의미: main 메서드를 찾을 수 없다
  • 원인: 실제로 클래스 내에 main 메서드가 존재하지 않거나 메서드 선언부 'public static void main(String[] args)'에 오타가 존재하는 경우
    • args는 매개변수의 이름이므로 args 대신 argv나 arg와 같이 다른 이름을 사용할 수 있음
  • 해결방법: main 메서드가 클래스에 정의되어 있는지 확인. 정의되어 있는 경우 선언부에 오타가 없는지 확인. 대소문자의 일치여부까지 정확히 확인해야 함

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

  • 의미: Hello라는 클래스를 찾을 수 없다
  • 해결방법: 클래스 Hello 철자, 대소문자를 확인해보고 이상이 없으면 클래스파일(*.class)이 생성되었는지 확인
    - ex) 'Hello.java'가 정상적으로 컴파일 되었다면 클래스파일 'Hello.class'가 있어야 함
    • 클래스 파일이 존재하는데도 동일한 메시지가 반복해서 나타나면 클래스 패스의 설정이 바르게 되었는지 다시 확인

5. illegal start of expressin

  • 의미: 문장에 문법적 오류가 있다
  • 원인: 괄호 '('나 '{'를 열고서 닫지 않거나, 수식이나 if문, for문 등에 문법적 오류가 있을 때, public이나 static과 같은 키워드를 잘못 사용한 경우 발생
  • 해결방법: 에러가 발생한 곳이 문법적으로 맞는지 확인

6. class, interface, or enum expected

  • 의미: 키워드 class나 interface 또는 enum이 없다
  • 원인: 괄호 '{' 또ㅗ는 '}'의 개수가 일치 하지 않는 경우 발행
  • 해결방법: 열린 괄호와 닫힌 괄호의 개수가 같은지 확인

에러 발생시 처리 순서
1. 에러 메시지를 잘 읽고 해당 부분의 코드를 살펴봄. 이상이 없으면 해당 코드의 주위도 함께 살펴봄
2. 그래도 이상이 없으면 에러 메시지는 잊어버리고 기본적인 부분을 재확인
3. 의심이 가는 부분을 주석처리하거나 따로 떼어내서 테스트

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

  1. 프로그램의 실행에 필요한 클래스(*.class 파일)를 로드
  2. 클래스 파일을 검사 (파일형식, 악성코드 체크)
  3. 지정된 클래스에서 main(String[] args)를 호출
  4. main 메서드의 첫 줄부터 코드가 실행되기 시작하여 마지막 코드까지 모두 실행되면 프로그램이 종료되고, 프로그램에서 사용했던 자원들은 모두 반환

Chapter 1 끝!!

profile
예비 백엔드 개발자

0개의 댓글