JAVA에 대하여(1)

JAVA 자체에 대하여 물음 답변 형식으로 몇번의 글을 거쳐 정리할 예정이다.

JAVA 에 대한 총체적인 이해

JAVA는 객체지항의 언어이다. JAVA만의 특징을 꼽으라면 아마도 플랫폼에 의존적이지 않는 특성과 가비지 콜랙션일 것이다.

두가지 개념

JRE(Java Runtime Environment): Java의 실행 환경이다. JRE에는 JVM과 JAVA 라이브러리들이 포함된다.

JDK(Java Development Kit): JRE를 포함한 더 많은 개발자 도구들을 제공한다. 예를 들면 컴파일러이다.

JAVA언어로 작성된 코드는 컴파일러(javac)를 통해 bytecode로 컴파일되고

컴파일된 bytecode는 JRE에서 실행된다. 실행될때 bytecode를 기계어로 해석하여 실행 할 수도 있지만 JIT(Just-In-Time) 도입으로 인하여 자주 사용되는 코드를 미리 컴파일하여 기계어로 만들 수 있다.

Oracle JDK 9부터 AOT(Ahead-of-Time compilation)을 추가하여 구현한 코드를 바로 기계어로 컴파일할 수 있는 기능을 제공하고 있다.(jaotc 툴을 사용해야된다.)

jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base

Exception 과 Error

JAVA에서 오류처리를 Exception과 Error 두가지로 분류한다.

그럼 이 두가지에 대하여 간략히 알아보고 넘어가자

Error: 시스템이 붕괴할 정도의 수습불가 상황을 말한다. 이런 오류는 왕왕 개발 단계에서 발견하지 못합니다. 예를 들어 OutOfMemoryError 같은 것들이다.

Exception: 이 오류는 예측 가능하고 개발자에 의해서 요리할 수 있는 것을 말한다. 예를 들어 NullPointerException 같은 것이다.

이 두 객체는 Throwable라는 Java의 상위 객체에서 상속받습니다. Throwable는 JAVA에서 유일하게 throw혹은 catch할 수 있는 객체 이다.

또한 Exception은 checked 와 unchecked 로 구분 될 수 있다.

Checked Exception

컴파일 단계에서 예외를 catch하는지를 정적으로 확인하는 exception이다. 정의는 Exception으로 부터 상속 받아 정의 한다.

public class InvalidUserNameException extends Exception {
    public InvalidUserNameException(String message) {
        super(message);
    }
}

아래와 같이 간단히 사용할 수 있다.

public class userService{   
    public userService(String userName) throws InvalidUserNameException {
        if (userName.length() <10) {
            throw new InvalidUserNameException ("User name length must larger than 10 ");
        }
        //logic
    }    
}

Unchecked Exception

이 exception은 RuntionException으로부터 상속 받는다. 이 방식으로 정의하면 컴파일 단계에서 예외가 발생하는지 여부를 판단하지 않는다. 즉 명시적으로 예외처리를 하지 않아도 된다.

Exception 설계

몇가지 실제 개발에 적용할 수 있는 원칙에 대해 설명하려고 한다.

  • 일반적인 에러를 퉁쳐서 catch하지 말라
  • 일반적인 알고 있는 에러도 무시하고 지나치지 말라
  • try/catch문보다 if/else, switch 문으로 에러를 처리해라
  • 최대한 에러가 발생하지 않게 설계하라(ㅠㅠ, 에러처리에 드는 비용은 생각보다 크다)

'JAVA' 카테고리의 다른 글

[JobRunr] Pro 버전에서 Server Tag 설정 방법 및 실전 노하우  (0) 2022.01.14
[JVM] Garbage Collection  (0) 2021.12.10