반응형

취준생일 때 우연치 않게 구글링하다가 '기억보단 기억을' 블로그 운영자이신 이동욱 님의 3번째 직장에 오기까지 시리즈를 읽게 되었다.

정말 그 당시 너무 감명 깊게 읽었다. 이동욱 님의 간절했고, 피나는 노력이 글 한 문장 한 문장에서 느껴졌다. 글이 살아있다는 느낌을 받았다.

지금까지 블로그 글을 읽고 나서 그런 감정을 느껴본 적은 없었다. 지금까지도... 내가 가고자 하는 길인데 의지박약인 내가 이 정도의 피나는 노력을 할 수 있을까..  무섭고 이동욱 님이 경의로웠다. 그다음부터 자연스럽게 나의 롤 모델이 되었고, 블로그를 자주 들여다보게 되었다. 그 당시 이동욱 님의 블로그 글을 이해하기에는 부족한 실력을 가진 나였지만 한 번씩 들여다보았다.

 

그러던 중 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 책을 쓰셨다는 글을 읽었다.

고민도 하지 않고 바로 주문했다. 책 구성부터가 당시 나에게 너무 필요한 부분이었다. 혼자서 개발 환경 구성부터 배포까지 경험해본 적이 없었기 때문이다. 책을 따라서 해볼 생각에 엄청 설렜던 기억이 난다. 하지만.. 부족한 실력에도 불구하고 당시 취업을 해서 많은 시간이 지난 지금 다시 책을 폈다... 

 

그래도 그 당시에는 목차에 있는 제목들이 많이 낯설었는데 시간이 지난 지금은 많이 익숙한 제목들이 보인다. 조금이나마 성장을 하고 있다는 뜻일까 ㅎㅎ,,  

 

시간이 지난 지금도 사실 개발 환경 구성과 배포의 경험을 제대로 해본 적이 없다. 책을 조금 읽었는데 정말 이해하기 쉽고 따라 하기 쉽게 잘 구성되어져있다. 이 책을 통해서 차근차근 성장하는 개발자가 되고싶다.

 

 

 

728x90
반응형

'Spring' 카테고리의 다른 글

스프링 부트 데이터 레스트로 REST API 만들기  (0) 2021.05.05
스프링 부트 데이터 레스트  (0) 2021.05.01
스프링 부트 시큐리티 + OAuth2  (0) 2021.04.20
스프링 부트 웹  (0) 2021.04.11
스프링 부트 테스트  (0) 2021.04.09
반응형

목표

자바의 애노테이션에 대해 학습하세요.

 

학습할 것

  • 애노테이션 정의하는 방법
  • @Retention
  • @Target
  • @documented
  • 애노테이션 프로세서

Annotation이란?

애노테이션은 주석이라는 뜻을 가지고 있다.

보통 주석은 코드를 보는 사람에게 정보를 제공해 주기 위해서 사용한다. 하지만 오늘 정리할 Annotation은 성격이 다르다. 사람에게 정보를 주는 용도로 사용하지만 컴파일러를 위해서 작성하는 주석이기도 하다.

Annotation은 빌드 시 코드를 생성한다거나 런타임 시 참고해서 특정 동착을 하도록 할 때 사용한다.

 

Annotation 특징

  • java 5부터 추가된 기능이다.
  • 클래스, 메소드, 변수등에 붙여서 사용된다.
  • 애노테이션은 interface앞에 @기호를 붙여서 생성할 수 있다.
  • 메타데이터라고 불린다.
  • 부가적인 표현뿐만 아니라 리플렉션(reflection)을 이용하여 원하는 클래스를 주입이 가능하다.

기본 제공되는 Annotation (built-in Annotation)

  • @Override - 메소드가 오버라이드 됐는지 검증한다. 만약 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류가 발생
  • @Deprecated - 메소드를 사용하지 말도록 유도한다. 만약 사용한다면 컴파일 경고 발생
  • @SuppressWarnings - 컴파일 경고를 무시하도록 한다.
  • @SafeVarargs - 제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시한다.
  • @FunctionalInterface - 람다 함수등을 위한 인터페이스를 지정한다. 메소드가 없거나 두개 이상 되면 컴파일 오류발생

Annotation 정의하는 방법

 

@Retention

Retention은 해당 애노테이션이 언제까지 유효한지를 정해줄 수 있는 옵션이다.

SOURCE, CLASS, RUNTIME 세가지 한다.

 

SOURCE

SOURCE는 compiler에 의해서 사라지는 애노테이션이다.

 

CLASS

CLASS는 compiler에 의해 class 파일에 저장은 되지만,  jvm에 의해 실행시에는 유지될 필요 없는 경우 사용한다.

즉, RUNTIME시에는 존재하지 않는다. (리플렉션을 이용해서 Annotation 정보를 가져올 수 없다.)

RUNTIME

jvm에 의해 class 파일이 실행될 시점인 RUNTIME에도 주석이 유효하도록 한다. (리플렉션을 이용해서 Annotation 정보를 가져올 수 있다.)

 

아래와 같이 SOURCE 일 때는 바이트 코드에서 해당 Annotation이 사라지지만 RUNTIME에서는 Annotation을 확인할 수 있다.



 

@Target

애노테이션이 부여될 위치를 지정할 수 있는 애노테이션이다.

MyAnnotation에 Target을 메소드로 만들어보았다.

위치를 메소드 범위로 주었기 때문에 Field에서는 사용할 수 없다고 경고 메시지를 보여주고 있다.

 

 

 

 

그 외 다양한 범위를 지정할 수 있다.

타입 대상
TYPE 클래스, 인터페이스, enum 선언시
CONTRUCTOR 생성자 선언시
PACKAGE 패키지 선언시
METHOD 메소드 선언시
FIELD 필드 선언시
LOCAL_VARIABLE 지역 변수 선언시
PARAMETER 매개 변수 선언시

 

@documented

문서에도 애노테이션 정보가 표현된다. javadoc 과 같이 도구에 의해 내가 작성한 내용이 문서화 될 수 있도록 한다.

 

intellij에서 javadoc 만드는 방법은 간단하다.

 

1. Tools 탭에서 Generate JavaDoc 클릭

 

 

2.

Locale : ko_KR

Other Command line arguments : -encoding UTF-8 -charset UTF-8 -docencoding UTF-8

작성 후 ok 클릭하면 JavaDoc이 생성된다.

 

 

@Documented 애노테이션을 안붙인 JavaDoc과 붙인 JavaDoc을 비교해보겠다.

 

@Documented 애노테이션 안붙인 JavaDoc

 

@Documented 애노테이션 붙인 JavaDoc

 

Annotation 프로세서

자바의 Annotation 프로세서는 컴파일 타임에 애노테이션 정보를 참고하여 코드를 분석하고 생성하는 등의 작업을 할 수 있는 기능이다. 대표적으로 롬복(lomboc) 라이브러리가 있다.

 

롬복(lomboc) 라이브러리를 사용해보겠다.

MyLombok.java 파일

 

컴파일 된 MyLombok.class 파일

 

 

ServiceLoader

인터페이스만 제공하고 해당 구현제는 모르지만 구현제를 지정하지 않고 Jar 파일만 바꿔끼면 동작하도록 만들 수 있다.

 

 

728x90
반응형
반응형

목표

자바의 열거형에 대해 학습하세요.

 

학습할 것

  • enum 정의하는 방법
  • enum이 제공하는 메소드 (values()와 valueOf())
  • java.lang.Enum
  • EnumMap
  • EnumSet

enum 이란?

enum 열거형이라고 부르며, 서로 관련 있는 상수들을 여러 개 정의할 때 사용한다.

  • 클래스처럼 보이게 하는 상수(상수 목록을 담을 수 있는 데이터 타입)
  • 서로 관련 있는 상수들을 모아 심볼릭한 명칭의 집합으로 정의한 것
  • 특정한 변수가 가질 수 있는 값을 제한할 수 있다.(타임-세이프티(Type-Safety)를 보장할 수 있다.)
  • 각각의 enum 타입들은 오로지 JVM 내에서 하나만 만들어진다. 
  • enum의 값은 'equals'를 함수를 사용하여 값을 비교하는 것보다 '=='를 사용해서 비교하는게 더 효과적이다.(NullpointerException을 피할 수 있다.)

enum이 만들어진 이유

타입을 판별하지(Type Check) 못해 Runtime 시 타입으로 인한 문제가 발생하는 것이다.

아래 예시를 보면서 차근차근 알아보겠다.

 

과일 객체에 사과와 바나나 상수를 생성하고, 회사 객체에 apple, google을 상수로 생성하였다.

과일 객체의 APPLE과 회사의 APPLE은 비교조차 안되어야 다른 개념인데 같은 int 타입이기 때문에 비교가 되어서 같은 값이 된다. 심지어 1로 같기 때문에 '과일 사과와 회사 사과가 같다고?'가 출력된다.

 

위와 같은 문제는 서로 다른 객체를 만들어줌으로써 해결이 가능하다.

 

똑똑한 intellij가 잘못된 비교라고 표시해주고 있다.

하지만 위와 같은 상황에서도 문제는 발생한다.

 

switch case문에서는 사용자 정의 타입이 들어갈 수 없다.

위와 같은 문제들을 해결하기 위해서 JDK1.5 버전 이상부터는 enum이라는 개념이 추가되었다.

enum 정의하는 방법

정의하는 방법은 아래와 같다.

enum이라는 키워드를 사용하여 열거체를 정의하면 된다.

보통 열거체는 대문자를 사용한다.

 

 

enum을 정의해 보았다면 사용해보겠다.

사용하는 방법은 아래와 같다.

 

위에서 사용하지 못했던 switch case문도 정상적으로 사용가능하다.

enum에 정의된 상수들은 사용자 정의 타입이 아니라 enum type의 객체이기 때문이다.

 

enum의 특징

1. 객체를 만들 수 없다.

enum의 생성자는 private로 강제화되어있어 외부에서 객체를 생성할 수 없다.

상수라는 건 다른 값으로 할당되면 안되기 때문에 private로 강제화 된 것 같다.

 

2. enum 또한 class 이기 때문에 생성자와 메소드를 추가할 수 있다.

 

생성자를 이용해서 요일의 한글을 표시해주고 한글 요일을 반환해주는 메소드를 생성해보았다.

 

3. 생성자가 호출될 때 모든 상수 하나당 각각의 인스턴스로 만들어진다.

생성자 호출 시 값을 출력해보았다.

 

 

MONDAY 상수를 생성하였지만 모든 상수의 인스턴스가 생성되어서 출력되는 것을 볼 수 있다.

enum이 제공하는 메소드 (values()와 valueOf())

values() 메소드는 enum 안에 선언된 모든 상수들을 배열로 반환한다.

valueOf() 메소드는 enum 안에 존재하는 상수를 가져올 때 사용한다.

enum에 존재하지 않는 상수를 가져오려고 한다면 에러가 발생한다.

 

 

enum ordinal() 메소드

상수가 정의된 순서를 반환한다.

ordinal 메소드는 enum 내부에서 사용하기 위해 만든 메소드이지 프로그래머가 이 메소드 사용하는 것은 안티패턴이다.

스프링에서 enum을 사용하게 되면 @Enumerated 애노테이션을 사용하는 경우가 발생하게 되는데, 이때 @Enumerated(EnumType.STRING)으로 해야지 @Enumerated(EnumType.ORDINAL)을 사용하게 되면 나중에 시스템이 유지 보수를 하면서 enum에 상수값들이 중간에도 더 추가될 수도 있는데, 그럴 때마다 순서가 바뀌게 되어 매우 큰 문제가 발생할 수 있다.

 

java.lang.Enum

enum 클래스는 java.lang.Enum 클래스를 상속 받도록 되어 있다.

사용자가 따로 Enum 클래스를 상속을 정의해 주지 않았지만 byte 코드를 열어보면 아래와 같이 java/lang/Enum을 상속받고 있는 것을 볼 수 있다. 그러기 때문에 다중 상속을 지원하지 않는 JAVA에서는 enum 클래스는 별도의 상속을 받을 수 없다.

 

EnumMap

EnumMap 클래스는 Map 구현체 중 Enum type 을 키로 사용하는 클래스입니다.

EnumMap은 Map 인터페이스에서 키를 특정 enum 타입만을 사용하도록 하는 구현체 입니다. enum 은 ordinal 이라는 순차적인 정수값을 가지고 있습니다.
EnumMap 순차적인 정수값 내부 데이터를 Array에 저장합니다.
그러면 우리가 많이 사용하는 HashMap 처럼 해시를 만들고 해시 충돌(Hash Collision)에 대응하는 작업자체가 필요 없게 됩니다.

HashMap 과 비교해봤을 때, EnumMap은 성능상의 이점을 노릴 수 있습니다.

 

EnumSet

EnumSet은 열거형을 위한 set 인터페이스 구현체이다. 

enum class를 set으로 사용하게 된다면 아래와 같이 HashSet을 사용하여서 만들어서 사용하게 되면 나중에 상수 값이 추가가 될 때마다 HashSet에도 추가를 해줘야 한다. 하지만 EnumSet을 사용하게 되면 그럴 필요가 없다.

추가적으로 ordinal 값의 순서대로 요소가 저장된다.

EnumSet 추가적인 사용법

 

EnumSet  HashSet 을 비교했을 때, 보통 전자가 훨씬 빠르다. 값을 예측 가능한 순서로 저장하여, 각각의 계산에단 하나의 비트만 검사하면 되기 때문이다.

HashSet 과는 달리 정확한 버킷을 찾기 위해 해시 코드를 연산할 필요가 없으며, 또한 비트 벡터(bitvector)의 특성으로 인해 EnumSet 은 매우 작고 메모리를 덜 사용하므로 더 효율적이다.

728x90
반응형
반응형

목표

자바의 예외 처리에 대해 학습하세요.

 

학습할 것

  • Exception과 Error의 차이
  • 예외클래스
  • 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
  • 자바가 제공하는 예외 계층 구조
  • RuntimeException과 RE가 아닌 것의 차이는?
  • 커스텀한 예외 만드는 방법

예외란? (Exception과 Error의 차이)

먼저 오류(Error)와 예외(Exception)의 개념을 정리하자

 

오류(Error)는 시스템에 비정상적인 상황이 생겼을 때 발생한다. 이는 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류이다. 따라서 개발자가 미리 예측하여 처리할 수 없기 때문에, 애플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 된다.

 

오류가 시스템 레벨에서 발생한다면, 예외(Exception)는 개발자가 구현한 로직에서 발생한다. 즉, 예외는 발생할 상황을 미리 예측하여 처리할 수 있다. 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따른 처리 방법을 명확히 알고 적용하는 것이 중요하다.

 

 

예외클래스

출처 - https://www.nextree.co.kr/p3239/

위 그림은 예외클래스 구조이다. 모든 예외클래스는 Throwable 클래스를 상속받고 있다.

 

Throwable을 상속받는 클래스는 Error와 Exception이 있다. Error는 시스템 레벨의 심각한 수준의 에러이기 때문에 시스템에 변화를 주어 문제를 처리해야 하는 경우가 일반적이고, Exception은 개발자가 로직을 추가하여 처리할 수 있다.

 

Exception은 수많은 자식 클래스를 가지고 있다. 그 중 RuntimeException을 주목해야 한다.

RuntimeException은 CheckedException과 UncheckedException을 구분하는 기준이다.

Exception의 자식 클래스 중 RuntimeException을 제외한 모든 클래스는 CheckedException이며, RuntimeException과 그의 자식 클래스들을 UncheckedException이라 부른다.

 

  Checked Exception Unchecked Exception
처리여부 반드시 예외를 처리해야 함 명시적인 처리를 강제하지 않음
확인시점 컴파일 단계 실행단계
예외발생 시 트랜잭션 처리 roll-back 하지 않음 roll-back 함
대표 예외 Exception의 상속받는 하위 클래스 중 Runtime Exception을 제외한 모믄 예외
ex) IOException,
     SQLException
RuntimeException 하위 예외
ex) NullPointerException,
     IllealArgumentException,    
     SystemException,
     IndexOutOfBoundException 

Checked Exception과 Unchecked Exception의 가장 명확한 구분 기준은 '꼭 처리를 해야 하느냐'이다.

Checked Exception이 발생할 가능성이 있는 메소드라면 반드시 로직을 try/catch로 감싸거나 throw로 던져서 처리해야 한다. 반면 Unchcked Exception은 명시적인 예외처리를 하지 않아도 된다. 이 예외는 피할 수 있지만 개발자가 부주의해서 발생하는 경우가 대부분이고, 미리 예측하지 못했던 상황에서 발생하는 예외가 아니기 때문에 굳이 로직으로 처리를 할 필요가 없도록 만들어져 있다.

 

자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

자바는 프로그램 실행중에 발생할 수 있는 예외 처리문을 제공한다.

 

자바 예외 처리 방법

  • 메소드 내에서 직접 처리하는 방법
  • 예외가 발생한 메소드를 호출한 곳으로 예외 객체를 넘겨주는 방법
  • 사용자 정의 예외를 생성하여 처리하는 방법 

try, catch

기본적으로 try-catch 문에서 예외가 발생한 경우와 발생하지 않았을 때의 흐름이 다르다.

위와 같이 예외가 발생하지 않았을 경우 catch 문 블록은 실행되지 않는다.

 

 

위와 같이 일부러 1/0 연산을 이용해서 에러를 발생시킨 경우 에러 발생 시 catch 블록을 실행시키는 걸 확인할 수 있다.

catch블록은 예외가 발생하면 발생한 예외에 해당하는 클래스의 인스턴스가 만들어진다.

예외가 발생한 문장이 try블럭에 포함되어 있다면, 이 예외를 처리할 수 있는 catch블럭이 있는지 찾게된다.

 

finally

 

finally 블럭은 try 블럭 코드의 완료 방식과 상관 없이 try 블럭이 일부만 실행되더라도 finally 블럭이 실행됩니다.

중간에 catch 블럭으로 빠지더라도 finally 블럭이 실행됩니다.

throw

 

throw는 특정 시점에 예외를 던져서 호출한 곳에 예외를 알리는 것입니다.

 

throws

 

이 메소드에서 예외 처리를 하지 않고 호출하는 메소드로 예외를 전파시키고 싶다면 사용할 수 있는 것이 바로 throws입니다. doCheckedException() 메소드에서 Exception() 메소드는 Checked Exception이기 때문에 try catch 문으로 예외 처리를 해주어야 하지만 throws를 통해서 상위 메소드에게 예외 처리를 전파시킨 경우입니다. 그러기 때문에 processException() 메소드에서 예외처리를 해줘야한다고 IDE에서 경고하고 있습니다.

 

위와 같이 상위 메소드로 예외를 전파시킨 걸 확인할 수 있습니다.  

 

try-with-resources

리소스를 사용하고 닫아야 할 경우 finally 문에서 close()를 이용해서 자원을 해제합니다. 자원을 해제하지 않으면 메모리 누수가 발생할 수 있기 때문입니다. 하지만 위와 같이 사용할 경우 문제점이 몇가지 있었습니다.

  • 자원 처리를 위해 InputStream 객체를 상단에 null로 선언이 필요하다.
  • 개발자는 잊지말고 finally 에서 자원해제를 해줘야 한다.
  • is.close() 메소드는 Checked Exception을 던지고 있기 때문에 예외 처리가 필요하다.

위와 같은 문제를 해결하기 위해서 java 7 이상에서는 try-with-resource 문법을 통해서 해결하였습니다. 

 

try 키워드 뒤에 괄호 안에 자원 해제가 필요한 객체를 넣어 줌으써 자동으로 자원을 해제할 수 있습니다. 

보다 훨씬 코드 가독성도 좋아졌습니다.

 

커스텀한 예외 만드는 방법

기존의 정의된 예외 클래스 외에 필요에 따라 개발자가 새로운 예외 클래스를 정희하여 사용할 수 있습니다.

커스텀한 Checked Exception 예외를 만들고 싶다면 Exception을 상속 받아서 만들고, Unchecked Exception 예외를 만들고 싶다면 RuntimeException을 상속 받아서 생성합니다.

 

기존의 예외 클래스는 주로 Exception을 상속받아서 Checked Exception으로 작성하는 경우가 많았다고 한다. 요즘은 예외처리를 선택적으로 할수 있도록 RuntimeException을 상속받아서 작성하는 쪽으로 바뀌어가고 있다고 한다. Checked Exception은 반드시 예외처리를 해주어야 하기 때문에 불필요한 경우에도 try-catch문을 넣어 코드가 복잡해지기 때문이다.

 

 

 

 

참조

- www.nextree.co.kr/p3239/

 

Java 예외(Exception) 처리에 대한 작은 생각

일상생활에서도 기본적인 것은 고민하지 않고 습관처럼 사용하는 경우가 있다. 초급 개발자인 나에게 ‘예외(Exception)’이 바로 그런 것이었다. 처음 JAVA수업 때 강사님께 "왜 로직을 try문으로

www.nextree.co.kr

- yadon079.github.io/2021/java%20study%20halle/week-09

 

9주차 과제: 예외 처리. :: 개발자 한선우

해당 글을 백기선 님의 자바 스터디 9주차 과제를 공부하고 공유하기 위해서 작성되었습니다.

yadon079.github.io

 

728x90
반응형
반응형

목표

자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

 

학습할 것

 

  • JVM이란 무엇인가
  • 컴파일 하는 방법
  • 실행하는 방법
  • 바이트코드란 무엇인가
  • JIT 컴파일러란 무엇이며 어떻게 동작하는지
  • JVM 구성 요소
  • JDK와 JRE의 차이

 

 

 

 

 


JVM이란 무엇인가

JVM이란 JAVA Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다.

JVM 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다.

그리고 JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해준다.

 

JVM 구성

출처 - https://jeongjin984.github.io/posts/JVM/

Class Loader 

   - Runtime 시점에 class를 로딩하게 해주며 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드한다.

   - jar파일 내 저장된 클래스들을 JVM위에 탑재하고 사용하지 않는 클래스들은 메모리에서 삭제한다.

 

Runtime Data Areas

   - JVM이 프로그램을 수행하기 위해 OS로 부터 별도로 할당받은 메로리 공간

   - PC Register : CPU가 Instruction을 수행하는 동안 필요한 정보를 저장

   - JVM Stack : Thread가 시작될 때 생성되며 Method와 Method 정보 저장

   - Native Method Stack : Java 이외의 언어로 작성된 native 코드를 위한 Stack

   - Method Area : 모든 쓰레드가 공유하는 메모리 영역(클래스, 인터페이스, 메소드, 필드 static 변수등의 바이트 코드 등을 보관)

   - Heap : 런타임시 동적으로 할당하여 사용하는 영역 class를 통해 instance를 생성하면 Heap에 저장됨

 

Execution Engine

   - Load된 Class의 ByteCode를 실행하는 Runtime Module

   - Class Loader를 통해 JVM 내의 Runtime Data Areas에 배치된 바이트 코드는 Execution Engine에 의해 실행된다.

 

Garbage Collector

   - 자바는 메모리 관리를 사용자가 아닌 JVM이 알아서 해준다.

   - GC(Garbage Collector)는 더이상 참조되지 않는 메모리를 정리해준다.

 

컴파일 하는 방법, 실행하는 방법

컴파일 한다는 것은 .java 파일을 .class 파일로 만드는 것을 의미한다.

JDK (Java Development Kit) 자바 개발 도구를 설치하면 bin 폴더 안에 javac라는 java compiler가 포함되어 있다.

이 명령을 사용해서 .class 파일을 만든다.

 

 cmd 창에서 해당 java 파일이 있는 곳으로 이동 후 javac 파일.java 명령을 실행하면 파일.class 파일이 생성된다.

다음으로 java 파일 명령을 실행시키면 class 파일이 실행된다.

 

.class 파일을 자바 바이트 코드라고 부른다. 자바 바이트 코드는 클래스 로더에 의해서 JVM 내로 로드 되고, 실행 엔진에 의해 기계어로 해석되어 메모리 상(Runtime Data Area)에 배치된다.

 

바이트코드란 무엇인가

자바 문법으로 작성한 .java  파일은 사람이 이해할 수 있는 언어로 작성했기 때문에 컴퓨터는 이해할 수 없다.

그렇기 때문에 번역을 통해 컴퓨터가 이해할 수 있는 형태로 만들어 줘야한다.

 

컴퓨터가 이해할 수 있는 형태로 번역하는 것은 JVM이 담당한다.

그럼 우리는 JVM이 이해할 수 있는 형태로 번역을 해서 전해줘야한다.

이때 이 JVM이 이해할 수 있는 형태가 바이트코드이다.

 

위에서 보았듯이 javac 파일.java 명령어를 이용해서 .class 파일을 생성하는데 이때 이 .class 파일이 바이트 코드이다.

 

JIT 컴파일러란 무엇이며 어떻게 동작하는가

JIT 컴파일러는 Just In Time 컴파일러로 바이트코드를 기계어로 번역하여 실행하는 것을 뜻한다. 

실행엔진에는 Interpreter와 JIT(Just-In-Time) Compiler가 있다. Interpreter는 바이트 코드를 할줄씩 읽기 때문에 느린 단점이 있다. 이러한 단점을 보완하기 위해서 JIT Compiler가 나왔다. 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일 하고 더이상 인터프리팅 하지 않고 해당 코드를 직접 실행하는 것이다. JIT Compiler에 의해 해석된 코드는 캐시에 보관하기 때문에 한 번 컴파일 된 후에는 빠르게 수행하는 장점이 있다.

하지만 인터프리팅 방식보다는 훨씬 오래 걸리므로 한번만 실행하면 되는 코드는 인터프리팅하는것이 유리하다.

 

JDK 와 JRE의 차이

자바 세가지 에디션 

  1. Java SE(Standard Edition)
Java vm과 표준 api 등을 정리한 가장 표준적인 버전이다. PC나 서버 등에서 동작하는 애플리케이션을 개발 및 실행하는 경우에 사용한다.
  2. Java EE(Enterprise Edition)
웹 서비스나 서버 간 통신, 메일 송신 등 서버 애플리케이션에 필요한 기능이 많이 포함되어 있다.
  3. Java ME(Micro Edition)
가전제품과 휴대전화 등의 임베디드 시스템용의 애플리케이션을 개발하기 위한 에디션이다. Java SE에 비해 사용할 수 있는 기능이 한정되어 있지만 필요한 리소스(CPU나 메모리 등)가 적게 들어 임베디드 시스템 등에서도 잘 동작한다. 

또한 자바는 실행 환경 (JRE) 및 개발 환경 (JDK)의 두가지로 나누어져 있다.

 

JDK(Java Development Kit) : 자바 개발자 도구

   - 자바 애플리케이션의 개발 환경이다. 실행 환경뿐만 아니라 소스 파일의 컴파일러 및 디버거 등 자바 애플리케이션을 개발하기 위한 도구가 포함되어 있다.

JRE(Java Runtime Environment) : 자바 실행 환경

   - 자바 애플리케이션의 실행 환경이다. 이미 컴파일된 자바 애플리케이션의 모듈(JAR 파일과 클래스 파일 등)을 이용하여 실행할 수 있다.

 

JAR 파일 - 자바 프로젝트 압축 파일

 

정리하자면 자바 언어로 프로그램을 개발하기 위해서는 JDK가 필요하고 자바 언어로 작성된 프로그램을 실행하기 위해서는 JRE가 필요하다. JDK에는 JRE가 포함되어 있다.

 

 

 

 

 

출저

- blog.naver.com/hsm622/222138523668

 

1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

# 목표 :: 자바 소스 파일 (.java)을 JVM 으로 실행하는 과정 이해하기. # 학습할 것 : JVM 이란 무...

blog.naver.com

- jeongjin984.github.io/posts/JVM/

 

JVM

JVM JVM이란 JAVA Virtial Machine의 약자로 Java Byte Code를 OS에 맞게 해석해주는 역할을 하는 가상머신

jeongjin984.github.io

- github.com/league3236/startJava/blob/master/live_study/week1.md

 

league3236/startJava

java back-end study 입니다. 국내에서 python, node.js 보단 spring 위주의 공부가 좀더 이점이 많을 것 같아 계속하여 스터디하려고합니다. - league3236/startJava

github.com

- asfirstalways.tistory.com/158

 

#자바가상머신, JVM(Java Virtual Machine)이란 무엇인가?

#JVM이란? JVM이란 JAVA Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다 (가상머신이란 프로그램의 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이다.) JV

asfirstalways.tistory.com

 

728x90
반응형
반응형

목표

자바의 인터페이스에 대해 학습하세요.

 

학습할 것

 

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

 

 

 


인터페이스 정의하는 방법

인터페이스는 어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 그 객체를 반드시 인터페이스의 메소드를 구현해야 한다.  

 

특징 

  • 인터페이스의 모든 메소드는 추상 메소드로 간주된다.
  • 인터페이스는 고용 API를 정의하기 때문에 암시적으로 public 이므로 생략하는 것이 일반적이다.
  • 필드는 앞에 public static final이 생략되어있다. 
  • 인터페이스는 인스턴스화 할 수 없으므로 생성자가 필요없다.
  • 인터페이스는 중첩될 수 있다.
  • 키워드는 interface 사용한다.
  • implements 키워드로 인터페이스를 구현할 수 있다.

Animal이라는 인터페이스를 생성하였다.

interface 키워드를 사용하였고, getType()메소드에서 에러가 발생했다. 인터페이스에서는 기본적으로 구현 로직을 만들 수 없기 때문에 에러가 발생하였다.

하지만 java8 이후부터 인터페이스에서도 유연함을 추구하기 위해서 default method와 static method가 추가되었다.

두 메소드에 대해서는 아래에서 살펴보겠다. 

인터페이스 구현하는 방법

 

강아지 클래스 생성

상속은 확장하는 의미로 사용하였다면 인터페이스는 구현하는 의미이기 때문에 implements를 사용한다.

 Animal에 선언한 getName() 메소드는 추상 메소드이기 때문에 구현체인 Dog 클래스에서는 강제로 구현해 주어야 한다.

 

AnimalFuc 이라는 새로운 inferface

다중 인터페이스를 구현할 수도 있다. 마찬가지로 강제적으로 두 개의 인터페이스의 메소드을 구현해 줘야 한다.

 

 

익명 구현 객체

구현 클래스를 만들어 사용하는 것이 일반적이지만 일회성의 구현 객체를 만들기 위해서 클래스를 생성하는 것 또한 비효율적이기 때문에 구현 객체를 만들 수 있는 방법 또한 제공하고 있다. 이것을 "익명 구현 객체"라고 한다.

 

인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

다형성을 이용해서 자식 클래스 인스턴스가 부모 클래스 타입으로 참조가 가능하듯이 인터페이스에서도 해당 인터페이스 타입을 참조할 수 있다.

 

고양이 클래스 생성

 

 

결과 값

다형성을 이용해서 printName 메소드에 Animal 타입으로 파라미터를 받음으로서 Cat, Dog 객체의 이름을 출력할 수 있다.

 

인터페이스 상속

인터페이스는 다른 인터페이스를 상속 받아서 확장할 수 있다.

 

위에서 다중 인터페이스 구현에 사용되었던 AnimalFuc 인터페이스를 Animal 인터페이스가 상속 받도록 수정하였습니다.

 

Cat 클래스에서는 이제 AnimalFuc에 있는 sound() 메소드도 구현해 주어야 되기 때문에 에러가 발생합니다.

클래스에서는 불가능했던 다중 상속이 인터페이스에서는 가능합니다. (인터페이스로 부터 상속만 가능합니다. 클래스는 불가능합니다.)

하지만 상위 인터페이스에 있는 메소드 중에서 메서드 명과 파라미터 형식은 같지만 리턴 타입이 다른 메소드가 존재하다면 상속이 불가합니다. 규칙에 어긋나기 때문입니다.

 

인터페이스의 기본 메소드 (Default Method), 자바 8

인터페이스는 기능에 대한 선언만 가능하기 때문에, 실제 코드를 구현한 로직은 포함될 수 없다고 위에서 말씀드렸습니다. 하지만 자바8에서 Default Method를 통해서 이러한 규칙을 벗어날 수 있도록 수정하였습니다.

메소드 선언시에 default를 명시하게 되면 인터페이스 내부에서 로직을 구현할 수가 있습니다.

 

접근제어자에서 사용하는 default와 같은 키워드이지만, 접근제어자는 아무것도 명시하지 않은 접근제어자를 default라 하면 인터페이스 default method는 default 키워드를 명시해줘야 합니다.

getType()이라는 메소드를 default로 선언해 줌으로써 interface 메소드 안에 구현 로직을 넣을 수 있게 되었습니다.

getType()을 사용하기 위해서는 해당 인터페이스 구현체를 인스턴스 만들어서 호출할 수 있습니다.

 

무슨 이유로 자바8에서 default method가 생긴걸까?

 

이유는 하위 호환성에 있다.

기존에 존재하던 인터페이스를 이용하여서 구현해서 사용하고 있던 클래스가 있다고 생각해 보자

인터페이스를 보완하는 과정에서 추가적으로 추상 메소드를 생성하게 된다면 구현하고 있던 클래스들은 강제로 구현해 줘야 하기 때문에 오류가 발생할 것이다. 이러한 이유로 호환성을 유지하기 위해서 default method가 생겨난 것이다.

 

 

인터페이스의 static 메소드, 자바 8

인스터스 생성과 상관없이 인터페이스 타입으로 호출하는 메소드이다.

static 키워드를 사용하고, 접근제어자는 항상 public이며 생략 할 수 있다.

  

static mothod 생성

 

 

 

 

인터페이스의 private 메소드, 자바 9

java8의 default method와 static method는 여전히 불편하게 만든다.

단지 특정 기능을 처리하는 내부 method일 뿐인데도 외부에 공개되는 public method로 만들어야하기 때문이다.

자바8에서 기본 메소드 사용이 가능해졌기 때문에 로직을 분리하기 위해서 사용할 수 있습니다.

 

인터페이스 private 메소드 특징

  • private 메소드 이기 때문에 인터페이스에서 구현이 되어 있어야하고, 추상 메소드일 수 없습니다.
  • 구현체에서 구현할 수 없고, 자식 인터페이스에서도 상속이 불가능 합니다.
  • static 메소드도 private 가능합니다.

 

 

참조

- www.notion.so/4b0cf3f6ff7549adb2951e27519fc0e6

 

인터페이스

목표

www.notion.so

- blog.baesangwoo.dev/posts/java-livestudy-8week/

 

[Live Study] 8주차 과제: 인터페이스

이 스터디는 백기선님께서 Github와 유튜브로 진행하시는 스터디 입니다.

blog.baesangwoo.dev

- dev-coco.tistory.com/13

 

온라인 자바 스터디 #8 - 인터페이스

목표 자바의 인터페이스에 대해 학습하세요. 학습할 것 (필수) 인터페이스 정의하는 방법 인터페이스 구현하는 방법 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법 인터페이스 상속 인터

dev-coco.tistory.com

 

728x90
반응형
반응형

 

예전부터 우리아이행복 주택청약 상품을 이용하였는데 청년 우대형 주택청약종합저축을 알게되었다.

 

좋은 상품을 놓칠 수 없어서 우리은행 앱을 통해서 전환을 시도하는데 타기관 인증? 이러한 메시지가 출력되었다.

 

우리은행에 문의해본 결과

 

1. 홈택스와 정부24 앱에 모두 등록되어야 한다.

2. 아이폰은 여러? 설정? 문제로 이러한 경우가 생길 수 있다.

3. 매장 방문..

 

나는 가입 안내 문구를 대충 읽고 홈택스에만 등록을 하였는데.. (죄송합니다..) 안내 문구에 홈택스와 정부24 앱에 모두 등록되어 있어야 한다고 안내되어 있다..

 

정말 죄송하다고 생각하고 얼른 정부24 앱을 설치하고 공동 인증서를 등록한 후 재시도  실패... (똑같은 타 기관 인증? 메시지 출력)

 

연동되는데 시간이 조금 필요한가..? 시간이 조금 흐른 뒤 재시도.. 실패.. (똑같은 타 기관 인증? 메시지 출력)

 

나는 분명 홈택스와 정부24에 공동 인증서를 등록했음에도 불구하고.. 

 

혹시나 해서 홈택스 web으로 접근 후 공동 인증서로 로그인하는데 무슨 일이지..? 공동 인증서가 등록이 안 되어있다고 한다.. (앱에서는 잘 등록되어서 로그인해서 잘 사용했는데도 불구하고.. )

아아!! 이래서 우리은행에서 접근을 못했구나.. 이제는 될 것 같은 분위기~

 

재시도 성공!!

 

매장 방문을 하려면 서류도 준비하고 여러 가지 해야 할 일이 많았을 텐데 집에서 혼자 해결한 게 뿌듯하고 나와 같은 문제를 겪고 있을 분들이 이 글을 보고 도움이 되었으면 하는 마음에서 공유하고자 글로 남깁니다.

 

 

결론 : 홈택스 모바일 앱에서 공동 인증서를 등록했음에도 불구하고 같은 문제 발생 시 web에서 한 번 접근 시도해보자.

 

728x90
반응형
반응형

목표

자바의 패키지에 대해 학습하세요.

 

학습할 것

 

  • package 키워드
  • import 키워드
  • 클래스패스
  • CLASSPATH 환경변수
  • -classpath 옵션
  • 접근지시자

 

 


package 키워드

자바에서 패키지란 클래스를 구분짓는 클래스들의 모음이다.

패키지를 사용하는 가장 큰 이유는 클래스명의 고유성을 보장하기 위해서이다. 만약 서로 다른 개발자가 이름이 같은 클래스를 생성했다고 가정할 때 서로 다른 패키지를 사용함으로써 충돌을 피할 수 있다. 

 

명명 규칙

  • 회사 이름이나 혹은 도메인(웹 사이트주소)등은 유니크하기 때문에 사이트명으로 많이 구분한다.
  • 웹사이트 주소를 반대로 기재한 모양으로 패키지 이름을 부여합니다.
  • 명칭 소문자 사용
  • 소스 파일들을 각각의 그룹으로 구분하기 위해 점(.)으로 구분
  • 패키지 이름으로 소스가 들어가는 폴더가 자동으로 만들어 집니다.

패키지 선언

package 패키지명;

 

패키지 선언문은 반드시 소스파일에서 첫 번째 문장이어야 한다.

 

 

import 키워드

외부 패키지의 클래스를 불러 사용하고자 할 경우 원래는 클래스명 앞에 패키지를 명시해야 한다. 이 번거로움을 import 키워드를 이용해서 패키지 명을 생략할 수 있다.

 

import 키워들 사용하지 않고 PackageOne이라는 객체를 생성해 보았다.

 

import 키워드를 사용해서 PackageOne 객체를 생성해 보았다.

 

위의 코드를 비교해 보았을 때 import 키워드를 사용하지 않고 외부 클래스를 얼마든지 사용할 수 있지만 코드 가독성에서는 import 키워드를 사용한 쪽이 더 낫다고 생각한다. 

 

static import

자바 클래스에서 static 메소드는 클래스에 대한 인스턴스 생성없이 메소드를 사용할 수 있다.

static 메소드를 static import를 사용해서 클래스명 없이 바로 사용할 수 있다.

 

 

만약 같은 클래스에 같은 이름의 static 메소드가 있다면 어떻게 될까?

 

똑똑한 intellij가 알려주고 있다. 그렇다 해당 클래스에 같은 이름의 static 메소드가 있다면 해당 클래스에 있는 static 메소드를 실행이 된다.

 

 

클래스패스(classpath)

클래스를 찾기위한 경로이다.

 

JVM이 프로그램을 실행할 때, 클래스 파일을 찾는데 기준이 되는 파일 경로를 말하는 것이다.

  1. 소스 코드(.java)를 컴파일하면 소스 코드가 바이트 코드(.class)로 변환된다.
  2. java runtime으로 이 .class 파일에 포함된 명령을 실행하려면 먼저 이 파일을 찾을 수 있어서 한다. 이때 .class 파일을 찾을 때 classpath에 지정된 경로를 사용된다.
  3. classpath는 .class 파일이 포함된 디렉토리와 파일을 콜론으로 구분한 목록이다.
  4. java runtime은 이 classpath에 지정된 경로를 모두 검색해서 특정 클래스에 대한 코드가 포함된 .class 파일을 찾는다.
  5. 찾으려는 클래스 코드가 포함된 .class 파일을 찾으면 첫 번째로 찾을 파일을 사용한다.

 

classpath 지정할 수 있는 방법 두가지

  • 환경 변수 CLASSPATH를 사용하는 방법
  • java runtime에 -classpath 플래그를 사용하는 방법

 

CLASSPATH 환경변수

환경변수는 운영체제에 지정하는 변수로 자바 가상머신과 같은 애플리케이션들은 환경변수의 값을 참고해서 동작게 된다.

자바는 클래스 패스로 환경변수 CLASSPATH를 사용하는데 이 값을 지정하면 실행할 때마다 -classpath 옵션을 사용하지 않아도 되기 때문에 편리하다.

하지만 운영체제를 변경하면 클래스 패스가 사라지기 때문에 이식성면에서 불리할 수 있다.

 

시스템 속성-> 환경 변수에서 설정할 수 있다.

 

 

접근지시자

아무나 함부로 접근하지 못하도록 접근의 허용 범위를 제한하는 용도이다.

클래스, 메소드, 변수에 모두 사용 가능하다.

 

(허용 범위가 큼) public > default > protected > private (허용 범위가 작음)

 

  클래스내부 동일패키지 상속받은클래스 이외의 영역
private o x x x
default o o x x
protected o o o x
public o o o o

접근제어 지시자 표이다. 표와 같이 접근제어 지시자를 이용해서 해당 클래스나 메서드들을 접근할 수 있는 범위를 제한할 수 있다.

 

 

 

 

 

 

 

참조

codedragon.tistory.com/228

 

패키지이름(Package Name) 명명규칙, 패키지 명명 방법

패키지이름(Package Name) ·         애플리케이션을 구분하는 고유한 값 ·         여러분이 만든 앱이 디바이스에 설치되었을 때 다른 앱들과 구분하는 역할을 하므로 유일무이해야 합니

codedragon.tistory.com

effectivesquid.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4classpath%EB%9E%80

 

자바 클래스패스(classpath)란?

클래스패스란(Class Path)란?? 클래스패스란 말 그대로 클래스를 찾기위한 경로이다. 자바에서 클래스패스의 의미도 똑같다. 즉, JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 기준이 되는 파

effectivesquid.tistory.com

opentutorials.org/course/1223/5527

 

클래스 패스 - 생활코딩

본 수업에서는 IDE(eclipse, intellij)를 사용하지 않고 운영체제의 기본 에디터를 사용 한다. 클래스 패스 빈 디렉터리에 아래와 같이 코드를 작성한다. 필자는 프로젝트 디렉토리에 /srcbin 이라는 디

opentutorials.org

 

728x90
반응형

+ Recent posts