Backend/Java

· Backend/Java
Java 소스 코드의 실행 과정요약자바 파일(.java)은 javac(=java compiler)에 의해 바이트 코드(.class)로 컴파일된다.JVM의 클래스 로더(Class Loader)가 필요한 클래스들을 로드 및 링크하여 JVM 메모리(Runtime Data Area)에 올린다.Java는 런타임(컴파일 타임 X)에 클래스를 처음 참조할 때에는 해당 클래스를 로드하고 링크하는 동적 로드를 한다. 이 동적 로드를 수행하는 부분이 JVM의 클래스 로더이다.클래스 로더의 특징계층 구조 : 부트스트랩 클래스 로더 > Extension 클래스 로더 > System 클래스 로더 순위임 모델 : 클래스 로더끼리 로드를 위임하는 구조로 동작한다. (이전에 로드 된 클래스인지 확인하기 위해 클래스 로더 캐시를 확인..
· Backend/Java
Annotation 어노테이션은 사전적인 정의로 주석이라는 의미를 가집니다. 흔히 개발할 때 접할 수 있는 대표적인 어노테이션들로 @Override, @Deprecated 부터 시작해서 Spring에서는 @Service, @Controller등이 있습니다. JDK 1.5 버전 이상에서 사용 가능하며, 자바 소스 코드에 사이에 @ 기호를 앞에 붙여서 사용할 수 있습니다. 클래스, 필드, 메서드 및 기타 프로그램 요소의 선언부에 사용할 수 있으며, Java 8에 들어와서는 타입 매개변수에도 사용할 수 있게 되었습니다. (관련글 링크) 그렇다면, 왜 어노테이션을 사용할까? 1) 코드가 간결해진다. 개발을 하다보면 저같은 초보 개발자는 보일러 플레이트 코드를 마주하기 쉽습니다. 비슷한 동작을 필요로 하는 곳들마..
· Backend/Java
Annotation Java 8 부터 어노테이션을 1)타입 선언부에도 사용 가능하게, 2)중복해서 사용할 수 있게 바뀌었다. 타입 선언부 제네릭 타입 변수 타입 매개변수 타입 예외 타입 타입에 사용하기 위한 준비 사항 @Target 을 통해 해당 클래스가 어노테이션으로써 사용될 수 있는 곳을 정의할 수 있다. Java 8에 TYPE_PARAMETER와 TYPE_USE 두 가지 타입이 추가되었다. 1) ElementType.TYPE_PARAMETER 해당 클래스를Type Parameter에만 사용 가능해진다. Cf. 하나 이상의 타입 매개변수(Type Parameter)를 선언하고 있는 클래스 혹은 인터페이스를 제네릭 클래스(제네릭 인터페이스)라고 하며,이를 모두 제네릭 타입이라고 한다. 예시로, 어노테이..
· Backend/Java
Cf. Concurrent Software란? 동시에 여러 작업을 할 수 있는 소프트웨어를 의미합니다. Ex) 웹 브라우저로 유튜브를 보면서 키보드로 문서에 타이핑을 할 수 있는 SW Ex) 녹화를 하면서 코딩을 하고 워드에 적어둔 문서를 보거나 수정할 수 있는 SW Java에서 제공하는 Concurrent Programming 멀티 프로세싱과 멀티 스레딩으로 나뉩니다. Multi-Processing(ProcessBuilder) Multi-Thread Java Multi-Thread Programming Thread 상속 또는 Runnable 구현(Runnable이 함수형 인터페이스로 변경되었기 때문에 Lambda로 작성 가능합니다.) public class App { public static void ..
· Backend/Java
Cf. 기존에 Java에서 시간과 관련해 제공하던 API Date, GregorianCalendar, SimpleDateFormat 등이 있습니다. Date는 mutable한 특성(인스턴스 내부의 값 변경 가능)때문에 thread-safe하지 못하다는 단점이 있습니다. - 동시성 문제를 명확히 해결하지 않으면 중간에 값이 변경될 가능성이 있습니다. 또한 Date가 time까지 다루는 등 클래스명과 실제 처리하는 데이터가 다른 경우가 있습니다. 이 뿐만 아니라 타입 안정성이 없어 버그가 발생할 여지가 많습니다. 예를 들어, GregorianCalender를 통해 Calendar 인스턴스를 만들 때 '월'은 0부터 시작하는 것을 감안하여 입력해야 합니다. 이러한 특성을 두고 타입안정성이 없다고 합니다. 위와..
· Backend/Java
Optional이란? Optional은 오직 하나의 값을 가지고 있을 수도 없을 수도 있는 컨테이너라고 할 수 있습니다. Java 8 이전에는 제대로 된 값을 리턴할 수 없을 때 할 수 있는 방법은 두 가지 밖에 없었습니다. 단순히 null을 반환하거나 Exception를 반환하는 것이 전부였습니다. 이 때 null을 반환하는 경우에는 이를 참조하는 코드에서 또 다시 그 값이 null일 수도 있음에 유의해야 한다는 점에서 좋은 코드가 아니며, 에러(Exception)을 발생시키는 방법은 Stack Track을 출력하는 데에 새로운 리소스가 쓰여야 하므로 이 또한 좋은 방법은 아닙니다. Java 8부터는 Optional을 사용해 참조하는 코드에게 명시적으로 빈 값일 수 있음을 알려주고, 빈 값의 경우에 대..
· Backend/Java
람다식 특징 메서드에 인자로 전달하거나 그 자체로 리턴할 수 있다. 이를 다른 말로는 "함수를 first class object로 사용할 수 있다."고 한다. 람다식 조건 순수 함수(Pure function)여야 한다. - 함수 밖의 값을 변경하지 못한다. 고차 함수(Higher-Order function)여야 한다. - 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다. 인터페이스 Function의 메서드들과 관련(`compose()`, `andThen()` 등) Cf.함수 안에서 함수 밖의 Final이 아닌 변수를 참조하여 값을 변경하는 경우에는 순수 함수라고 볼 수 없다. Java가 기본적으로 제공하는 함수형 인터페이스 🌂 Function 하나의 매개변수를 가진다. R apply(T ..
· Backend/Java
Integer 클래스의 parseInt로 정수의 기수 변환을 할 수 있다. 이 메서드는 하나의 매개변수의 인자만 전달하여 단순하게 String 형태의 정수를 int 타입으로 변환할 때 많이 사용하게 되는데, 매개변수가 하나일 때는 변환된 10진수 정수가 나오고, 두 번째 매개변수로 기수를 전달할 경우 해당 String형태의 값이 해당 기수로 표현된 값임을 전달해주게 된다. 반환되는 값은 항상 10진수 값이다.두 번째 매개변수인 radix(기수)의 인자로는 10, 2, 8, 16가 들어갈 수 있다. Integer.parseInt(String str, int redix); Integer.parseInt(str, 2); Integer.parseInt(str, 8); Integer.parseInt(str, 16);
· Backend/Java
Integer 타입의 리스트를 int 타입 배열로 변환할 때는 (int[]) 등의 형태로 변환할 수 없다. 이 때는 아래와 같이 List에서 제공하는 stream을 통해 primitive type인 int 타입 배열로 변환할 수 있다. List list = Arrays.asList(1, 2, 3, 4, 5); int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
· Backend/Java
쉘 스크립트를 실행시키면서 파라미터를 넘기기 위해서는 'sh 스크립트명 파라미터'와 같이 실행시킬 쉘 스크립트 파일명 뒤에 띄우고 전달할 수 있다. 이를 자바에서 쉘 스크립트 실행하는 방법과 연동하면, Java가 제공하는 Runtime 클래스의 getRuntime() 메서드를 호출해 런타임 인스턴스를 반환받아, 여기에 exec() 메서드를 통해 쉘 실행 스크립트를 작성하면 된다. Process process = Runtime.getRuntime().exec("sh shellname.sh hello java"); 쉘을 아래와 같이 작성되어 있다고 전제한다. $ echo $1 $ echo $2 위의 내용을 바로 출력시켜 보려면 Process 인스턴스로부터 바로 InputStream을 받아 BuffredRea..
devYH
'Backend/Java' 카테고리의 글 목록