자바를 시작하기 전에

양성빈·2022년 5월 10일

참고
자바의 정석
https://rutgo.tistory.com/449
https://ksabs.tistory.com/162

자바란?

  • 자바는 썬 마이크로시스템즈에서 개발하여 공식적으로 발표한 객체지향 프로그래밍 언어이다.
  • 운영체제(플랫폼)에 독립적이다.
  • C++의 장점을 채택하는 동시에 잘 사용하지 않은 부분은 과감히 제외시켜 비교적 배우기 쉽고 간결한 표현이 가능하도록 했다.
  • 자바는 풍부한 클래스 라이브러리를 통해 프로그래밍에 필요한 요소들을 기본적으로 제공한다.

2010년부로 썬 마이크로시스템즈가 오라클사에 인수되면서 자바는 오라클사의 제품이 되었다.

자바의 유료화?

많은 사람들은 JAVA 8버전 이후로는 유료라고 많이 오해를 하고 있다.
물론 유료가 맞다. 오라클에서 만든 Oracle JDK 11 버전부터 상용으로 사용할 때 유료이다.
하지만 위의 강조된 조건에 하나라도 부합하지 않는다면 무료로 사용이 가능하다.

https://medium.com/@javachampions/java-is-still-free-c02aef8c9e04

자바의 역사

  • 자바는 오크(Oak)라는 언어로부터 시작되었다.
  • 자바의 처음의 목적은 가전제품에 소프트웨어를 탑재하는데 목적을 두었다.
  • 오크는 처음에는 가전제품이나 PDA와 같은 소형기기에 사용될 목적이었으나 여러종류의 운영체제를
    사용하는 컴퓨토들이 통신하는 인터넷이 등장하자 오크의 개발방향을 인터넷에 적합하도록 변경하며
    명칭을 자바로 바꾸었다.
  • 자바로 작성된 애플릿 (Applet)은 정적인 웹페이지에 사운드와 애니메이션 등의 멀티미디어적인
    요소들을 제공할 수 있는 유일한 방법이었기 때문에 많은 인기를 얻고 사용자층을 많이 확보하였다.
  • 하지만, 보안상의 이유로 최신 웹브라우저에서 더 이상 애플릿을 지원하지 않게되었고, 대신, 서버쪽
    프로그래밍을 위한 서블릿 (Servlet)과 JSP가 더 많이 사용되었다.
  • 그리고 현재에는 스마트폰 운영체제인 안드로이드에서도 자바를 사용한다.

자바 언어의 특징

  • 운영체제에 독립적이다.
    • 일종의 에물레이터인 자바가상머신 (JVM)을 통해서 가능
    • 자바응용프로그램은 운영체제나 하드웨어가 아닌 JVM하고만 통신
    • JVM은 전달받은 명령들을 해당 운영체제가 이해할수 있도록 변환
    • JVM은 운영체제에 종속적이기 때문에 여러 운영체제에 설치할 수 있는
      서로 다른 버전의 JVM 제공
    • 자바로 작성된 프로그램은 운영체제와 하드웨어에 관계없이 실행 가능하며
      이것을 '한번 작성하면 어디서나 실행된다. (Write once, run anywhere)'고 표현
  • 객체지향 언어이다.
    • 프로그래밍 언어 + 객체지향 개념 (ex. C++, JAVA, Python..)
    • 객체지향 프로그램으로 유지보수와 확장성이 좋다.
    • C나 C++보다 안정적이다.
  • 비교적 배우기 쉽다.
    • 자바의 연산자와 기본구문은 C++, 객체지향관련 구문은 스몰톡이라는 객체지향언어에서
      가져왔다.
    • 풍부한 라이브러리가 제공되고 오픈소스와 연동된다.
    • 하지만 개인적인 생각으로는 이런 풍부한 라이브러리때문에 배울 양이 많고 혼동이
      오는것 같다.
  • 자동 메모리 관리 (Garbage Collection)
    • 가비지 컬렉터 (garbage collector)가 자동적으로 메모리를 관리해주기 때문에
      개발자는 메모리를 따로 관리할 필요가 없다.
    • 예를 들어 C++같은 경우 가비지 컬렉터가 없어서 객체를 생성하고 꼭 소멸자로 소멸
      시켜줘야 한다.
  • 네트워크 분산처리를 지원한다.
  • 멀티쓰레드를 지원한다.
    • 일반적으로 멀티쓰레드 (multi-thread)의 지원은 사용되는 운영체제에 따라 구현방법도
      상이하며 처리 방식도 다르다.
    • 그러나, 자바는 관련된 라이브러리가 제공되므로 구현이 쉽다.
    • 여러 쓰레드에 대한 스케줄링을 자바 인터프리터가 담당한다.
  • 동적 로딩을 지원한다.
    • 자바는 실행 시에, 모든 클래스들이 로딩되지 않고 필요한 시점에 클래스를 로딩하여
      사용할수 있는 장점이 있다.

멀티쓰레드란?
하나의 프로그램으로 여러 작업을 하는 행위
ex) 카카오톡 (채팅 + 데이터 전송)

자바의 단점으로 속도문제가 있었지만, 바이트코드를 하드웨어가 알아들을 수 있는 기계어로 변환해주는
JIT 컴파일러와 Hotspot과 같은 신기술 도입으로 JVM의 기능이 향상되어 속도문제가 상당히 개선되었다.

JVM (Java Virtual Machine)

  • JVM은 직역하면 자바를 실행하기 위한 가상 컴퓨터
  • 자바로 작성된 애플리케이션은 모두 이 가상 컴퓨터 (JVM)에서만 실행되기 때문에
    자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.
  • 일반 애플리케이션 코드는 OS만 거치고 하드웨어로 전달되는 반면,
    자바 애플리케이션은 JVM을 한번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된
    상태가 아니고 실행시에 해석되기 때문에 속도가 느리다는 단점이 있지만 위에서 언급했듯이
    JIT 컴파일러와 향상된 최적화 기술이 적용되어 속도를 많이 개선되었다.
  • JVM은 플랫폼에 독립적이며 OS에 종속적이다.
  • 그래서 해당 OS에서 실행가능한 JVM이 필요하다.

JIT 컴파일러: https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/
JDK, JRE 그리고 JVM: https://howtodoinjava.com/java/basics/jdk-jre-jvm/
https://en.wikipedia.org/wiki/List_of_JVM_languages

JDK 설치하기

  • Oracle JDK 설치 경로
  • JDK를 설치 후 bin 디렉터리에 있는 실행파일은 다음과 같다.
    • javac.exe : 자바컴파일러. 자바소스코드를 바이트코드로 컴파일
    • java.exe : 자바 인터프리터. 컴파일러가 생성한 바이트코드를 해석하고 실행
    • javap.exe : 역어셈블러. 컴파일된 클래스 파일을 원래 소스로 변환
    • javadoc.exe : 자동문서생성기. 소스파일에 있는 주석을 이용하여
      Java API문서와 같은 형식의 문서를 자동으로 생성한다.
    • jar.exe : 압축 프로그램. 클래스파일과 프로그램의 실행에 관련된 파일을
      하나의 jar파일로 함축하거나 압축해제한다.
      - 압축: jar cvf Hello.jar Hello1.class Hello2.class
      - 압축해제: jar xvf Hello.jar

-c 옵션을 통해 바이트코드로 컴파일된 내용도 확인이 가능하다.

자바 프로그래밍 작성

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

  • 자바에서 모든 코드는 반드시 클래스 안에 존재
  • 클래스는 반드시 패키지안에 존재
  • public static void main(String[] args)는 다른언어의 main 메서드이다.
  • 이 부분은 자바 프로그램의 시작점이다.
  • 모든 클래스가 main 메서드를 가지고 있어야 하는것은 아니지만, 하나의 자바 애플리케이션에는
    main 메서드를 포함한 클래스가 반드시 하나는 있어야 한다.
  • 하나의 소스 파일에 하나의 클래스만을 정의하는것이 일반적이지만 여러개가 있을 수도 있다.
  • 주의할 점은 소스파일의 이름은 public class의 이름과 일치해야한다.
  • 만약 public class가 없는 경우 class 이름 중에 하나로 해도 무방하다.
  • 하나의 소스파일에 둘 이상의 public class가 존재하면 안된다.
  • 소스파일 이름과 public class의 이름은 대소문자까지 일치해야한다.

자주 발생되는 에러와 해결법

일단 에러를 만나면 디버깅을 해보고 그래도 힘들면 구글링을 해보자.

  • cannot find symbol 또는 cannot resolve symbol
    • 지정된 변수나 메서드를 찾을 수 없다는 뜻
    • 선언되지 않은 변수나 메서드를 사용하거나 변수 또는 메서드 이름을 잘못 사용한 경우
    • 대소문자의 일치여부도 꼼꼼하게 확인
  • ';' expected
    • 세미콜론이 필요한 곳에 없다는 뜻
    • 자바의 모든 문장의 끝에는 ;을 붙여줘야한다.
    • 일종의 마침표
  • Exception in thread 'main' java.lang.NoSuchMethodError: main
    • main 메서드를 찾을 수 없다라는 뜻
    • public static void main(String[] args)에 오타가 존재하는 경우 발생
    • 하지만 IDE에 도움으로 거의 에러를 만날 경우는 드물다.
  • Exception in thread 'main' java.lang.NoSuchMethodError: Hello
    • Hello라는 클래스를 찾을 수 없다라는 뜻
    • 클래스 'Hello'라는 철자, 특히 대소문자를 확인해보고 이상이 없으면 클래스파일
      생성 여부를 확인해보자.
    • 그래도 에러가 나오면 클래스패스의 설정이 바르게 되었는지 확인해보자.
  • illegal start of expression
    • 문장에 문법적인 오류가 발생할 때 오류가 나온다.
    • 괄호나 중괄호를 열고서 닫지 않거나 수식이나 문법적인 오류 또는 public이나
      static과 같은 키워드를 잘못 사용한 경우에도 발생한다.
  • class, interface, or enum expected
    • 보통 괄호의 개수가 일치하지 않는 경우에 발생한다.

에러 메세지를 잘 읽고 해당 부분의 코드를 살펴본다.
이상이 없으면 해당 코드의 주위도 함께 살펴본다.
그래도 이상이 없으면 에러 메세지는 잊고 기본적인 부분을 재확인한다.
대부분 사소한 경우가 많다.
의심이 가는 부분을 주석처리하거나 따로 떼어내서 테스트를 해본다.

자바 프로그램 실행과정

  1. 프로그램의 실행에 필요한 클래스파일을 로드한다.
  2. 클래스 파일을 검사한다. (파일형식, 악성코드 체크)
  3. 지정된 클래스에 main 메서드를 호출한다.
  4. 프로그램 종료후에 사용했던 자원을 반납한다.

주석

  • 일종의 설명문
  • 주석을 이용해서 프로그램 코드에 대한 설명을 덧붙여 놓으면 프로그램을 이해하는데 많은 도움이 된다.
  • 주석 부분은 프로그램이 실행하지 않는다.
  • 단, 큰따옴표 안에 주석을 쓰면 문자열로 인식이 되어서 주석 효력이 없어진다.

범위주석: /* */ 사이의 내용은 주석으로 처리된다.
한줄 주석: // 부터 라인 끝까지의 내용은 주석으로 간주된다.

profile
모든 것을 즐길줄 아는 개발자입니다!

0개의 댓글