[자바의정석]Chapter 01. 자바를 시작하기 전에

seungwon·2022년 12월 19일
0

자바의 정석

목록 보기
1/14
post-thumbnail

출처 : Java의 정석 3rd Edition(남궁 성 지음)

1. Java

1.1 자바란

객체지향 프로그래밍 언어
(썬 마이크로시스템즈에서 개발하여 1996년 1월 공식 발표)

개요

  • 운영체제에 독립적 = 운영체제에 따라 프로그램 변경 없이 실행 가능
  • 풍부한 클래스 라이브러리(Java API)
  • 꾸준히 새로운 버전 발표중, 다양한 최신 기술 지원 및 활동 영역 확장 - 모바일(J2ME), 기업환경(J2EE), XML
  • 오라클(Oracle)사의 제품

1.2 자바의 역사

오크(Oak)라는 언어에서 시작됨
1. 처음 자바를 만들때 목표 : 가전제품에 탑재될 소프트웨어(C++의 장점 도입, 단점 보완)
2. 인터넷 등장 : 여러 종류의 운영체제를 사용하는 컴퓨터들이 통신
-> 운영체제에 독립적인 Oak를 인터넷에 적합하도록 바꿈
3. 자바로 개발한 웹브라우저(Hot java) 발표 -> 자바의 정식버전 발표

당시에는 자바로 작성된 애플릿(Applet)이 웹페이지에 사운드/애니메이션 등을 제공할 수 있는 유일한 방법
-> 보안 상의 이유로 웹브라우저에서 애플릿 지원 중단

현재 : 서버 쪽 프로그래밍 - 서블릿(Servlet), JSP(Java Server Pages), 안드로이드(구글의 스마트폰 운영체제)

전망: 자바의 원래 목표였던 소규모 가전제품/대규모 기업환경을 위한 소프트웨어 개발 분야에 활발히 사용될 것으로 기대됨

1.3 자바언어의 특징

  1. 운영체제에 독립적 : 자바가상머신(JVM)
    = 자바로 작성한 프로그램은 운영체제/하드웨어와 관계없이 실행 가능
    = Write Once, run any where
    자바 응용프로그램은 JVM하고만 통신하고 JVM이 자바 응용 프로그램으로부터 전달받은 명령을 운영체제가 이해할 수 있도록 변환하여 전달(JVM은 운영체제에 종속적)
  2. 객체지향언어 : 객체지향개념의 특징인 상속, 캡슐화, 다형성이 잘 적용된 순수한 객체지향언어라는 평가를 받음
  3. 비교적 배우기 쉽다
    자바의 연산자와 기본구문 : C++에서 채택
    객체지향관련 구문 : small talk에서 채택
    -> c++, small talk의 장점을 취하고 단순화해서 간결하고 이해하기 쉬운 코드
  4. 자동 메모리 관리 : Garbage Collection
    프로그래머가 사용하지 않는 메모리를 체크하고 반환할 필요가 없음(가비지 컬렉터가 대신함)
  5. 네트워크와 분산처리 지원
  6. 멀티쓰레드 지원
    일반적으로는 운영체제에 따라 구현방법/처리방식이 다름
    <-> 자바에서의 멀티쓰레드 프로그램 : 시스템 관계없이 구현 가능, 라이브러리(JAVA API)가 제공되어 구현이 간편, 쓰레드에 대한 스케줄링을 자바 인터프리터가 담당(?)
  7. 동적로딩(Dynamic Loading) 지원
    : 필요한 시점에 클래스가 로딩됨, 일부 클래스 변경시 전체를 컴파일할 필요 없음

1.4 JVM(Java Virtual Machine)

자바를 실행하기 위한 가상 컴퓨터
(자바로 작성된 애플리케이션은 모두 JVM에서 실행됨, JVM은 운영체제에 종속적)

virtual machine : 소프트웨어로 구현된 하드웨어
ex) 윈도우 미디어 플레이어 : TV와 비디오를 소프트웨어화, 윈앰프 : 오디오 시스템을 소프트웨어화

-> 가상 컴퓨터(virtual computer) : 소프트웨어로 구현된 컴퓨터(컴퓨터 속의 컴퓨터)

단점

  1. 애플리케이션 코드가 OS -> 하드웨어로 거치는 것이 아니라 JVM을 한번 더 거친다.
  2. 하드웨어에 맞게 완전히 컴파일된 상태가 아니라 실행시에 해석(interpret)됨
    -> 1,2 때문에 속도가 느림

개선

JIT 컴파일러 : 바이트코드(byte code)를 하드웨어의 기계어로 바로 변환
+) 최신 기술 Hotspot, JVM의 기능 향상


2. 개발환경 구축

  1. 자바 개발 도구(JDK) 설치
    JDK = JVM + JAVA API
  2. API 문서
    다운로드 : https://www.oracle.com/kr/java/technologies/javase-jdk8-doc-downloads.html
    웹사이트 : https://docs.oracle.com/en/java/javase/19/

JDK 내의 주요 실행파일

  • javac : 자바 컴파일러(자바 소스코드 -> 바이트코드로 컴파일)
    javac Hello.java
    • 바이트코드 : 기계어(JVM이 이해 -> JVM이 바이트 코드를 기계어로 변환 -> OS로 전달),
  • java : 자바 인터프리터(바이트코드를 해석/실행)
    java Hello
  • javap : 역어셈블러(컴파일된 클래스 파일 -> 소스 코드)
    javap Hello > Hello.java
    • '-c' 옵션 없이 : 원래 소스 전체가 아닌 선언부만 저장됨
    • '-c' 옵션 : 소스 전체(바이트코드로 컴파일된 내용까지_
  • javadoc : 자동문서생성기(소스파일의 주석을 이용하여 java API문서와 같은 형식의 문서를 자동생성)
    javadoc Hello.java
  • jar : 압축프로그램(클래스파일/프로그램 실행에 관련된 파일을 .jar 파일로 압축/압축해제)
     // 압축 
     jar cvf Hello.jar Hello1.class Hello2.class
     
     //압축해제
     jar xvf Hello.jar

3. 프로그램 작성

  • 자바에서 모든 코드는 반드시 클래스 안에 존재 (클래스들이 모여 JAVA 애플리케이션을 이룸)
    (package문, import문 예외)
    class 클래스명{
    	
    }
  • main메서드 선언문
    class 클래스명{
    	public static void main(String[] args){
      
      }
    }
    • 하나의 애플리케이션에는 main메서드를 포함한 클래스가 하나이상 있어야 함
      ->실행 : java.exe {main메서드를 포함한 클래스 이름}
  • 하나의 소스파일에 하나의 클래스만을 정의하는 것이 일반적
    • 하나의 소스파일에 둘 이상의 클래스를 정의하는 것도 가능
      단, 소스파일의 이름 = public class의 이름 ( = 한 파일에 public class는 1개)
      (public class가 없다면 소스파일내의 어떤 클래스의 이름으로 해도 상관 없음)

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

자주 발생하는 에러

  1. cannot find symbol / cannot resolve symbol
    = 지정된 변수나 메서드를 찾을 수 없다
    선언되지 않은 변수나 메서드를 사용하거나 변수 또는 메서드의 이름을 잘못 사용한 경우
  1. ';' expected
  1. Exception in thread "main" java.lang.NoSuchMethodError: main
    = 'main메서드를 찾을 수 없다.'
    실제로 클래스 내에 main메서드가 존재하지 않거나 메서드의 선언부 'public static void main(String[] args)'에 오타가 존재하는 경우
    (args는 매개변수의 이름이므로 args 대신 argv나 arg와 같이 다른 이름을 사용할 수 있다.)
  1. Exception in thread "main" java.lang.NoClassDefFoundError: Hello
    = 'Hello라는 클래스를 찾을 수 없다.'
    클래스 'Hello'의 철자, 특히 대소문자를 확인해보고 이상이 없으면 클래스파일(* . class)이 생성되었는지 확인한다.
    ex) 'Hello.java' --정상적으로 컴파일--> 'Hello.class'
    클래스파일이 존재하는데도 동일한 메시지가 반복해서 나타난다면 클래스패스 (classpath)의 설정이 바르게 되었는지 다시 확인
  1. illegal start of expression
    = 문장에 문법적 오류가 있다
    괄호나 '(', '{' 를 열고서 닫지 않거나, 수식이나 if문, for문 등에 문법적 오류가 있을 때, public이나 static과 같은 키워드를 잘못 사용한 경우
  1. class, intertace, or enum expecied
    = '키워드 class나 interface 또는 enum이 없다.'
    = 보통 괄호 '{', '}' 개수가 일치 하지 않는 경우

해결방법

  1. 에러 메시지를 잘 읽고 해당 부분의 코드를 살펴본다.
    이상이 없으면 해당 코드의 주위(윗줄과 아래 줄)도 함께 살펴본다.
  2. 그래도 이상이 없으면 에러 메시지는 잊어버리고 기본적인 부분을 재확인한다.
    대부분의 에러는 사소한 것인 경우가 많다.
  3. 의심이 가는 부분을 주석처리하거나 따로 떼어내서 테스트 한다.
    에러 메시지가 실제 에러와는 관계없는 내용일 때도 있지만, 대부분의 경우 에러 메시지 만 잘 이해해도 문제가 해결되는 경우가 많으므로 에러 해결을 위해서 제일 먼저 해야 할 일은 에러 메시지를 잘 읽는 것임을 명심하자.

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

java Hello

내부적인 진행 순서
1. 프로그램의 실행에 필요한 클래스(* .class파일) 로드
2. 클래스 파일 검사(파일형식, 악성코드)
3. 지정된 클래스(Hello) 에서 main 호출

3.4 주석

  • 범위 주석 : /* */
  • 한줄 주석 : //

0개의 댓글