개발공부/Java(38)
-
Blocking and Non-blocking I/O
Blocking and Non-blocking I/O NIO는 데이터들을 보관할 클래스들을 정의하고, 데이터를 블록들 내에서 처리하는 방식으로써 low-level 최적화의 이점을 가집니다. I/O란 컴퓨터와 세상을, 하나의 프로그램과 컴퓨터를 연결해주는 인터페이스 입니다. 대부분의 I/O가 실제로 운영체제에 내장되어 있는 것은 컴퓨터 시스템에 매우 중요한 요소입니다. 모든 I/O는 1 byte들을 하나씩 Stream으로 읽어야했습니다. 이는 객체를 byte로 변환하거나, 반대로 byte를 객체로 변환해주는 기능을 했습니다. NIO는 I/O와 동일한 역할과 목적을 가지지만, Stream과 달리 block I/O라는 메타포를 사용합니다. 나중에도 나오겠지만, block I/O는 stream I/O보다 효율적..
2022.06.04 -
[Java] Java Compiler가 어떻게 동작하는지?
Compile이란 소스코드가 컴퓨터가 인지할 수 있는 기계 언어로 번역해주는 과정을 말합니다. Javac Java에선 javac 컴파일러가 첫번째로 소스코드를 바이트 코드로 컴파일 시켜줍니다. 그런 다음 JVM이 바이트 코드를 해석하고 실행시킵니다. 그 과정에서 syntax error(자바 문법 오류)도 발견합니다. Javac 작동원리 소스코드가 컴파일 되면 Java 바이트코드를 생성하고 자동적으로 메모리에 .class 파일로 저장됩니다. 이 파일은 기반되는 OS 위에서, JVM에 의해 해석 및 실행됩니다. 참고자료 baeldung - How compilers Work sciencetecheasy - What is Java Compiler
2022.05.16 -
[Java 9] Modularity(모듈화)
Java 9 Modularity 자세한 코드는 baeldung를 참고했습니다. Java 9버전에 새로운 기능 Modularity가 있습니다. 한 프로젝트 안에 독립적인 모듈을 여러 개 유지하면서 필요한 모듈 API를 구동함으로써 메모리를 효율적으로 사용할 수 있습니다. 또한 개별 모듈은 캡슐화을 가지면서도 서로 공유될 수 있는 접근성을 보장해줍니다. 사용할 수 있는 환경은, 프로젝트 내 여러 애플리케이션 서버를 가지는 경우 필요한 모듈만 따로 구동하되 모듈끼리 의존성을 가지는 부분은 연동이 필요할 때 사용하면 좋다고 생각합니다. 간단한 module 설정파일은 아래와 같습니다. 프로젝트 구조: //module-info.java (hello.modules) module hello.modules { expor..
2022.04.26 -
Arrays.sort(), Comparable, Comparator
Arrays.sort(), Comparable, Comparator Sort Java에서 Collections나 Arrays를 정렬하기 위해 sort() 를 사용합니다. Sorting 알고리즘은 퀵 정렬을 채택해 시간복잡도는 O(nlong(n)) 입니다. 타입이 객체거나 2차원 배열을 사용해서 sorting해줄 땐 Comparator를 파라미터에 추가해줘야 합니다. Comparable compareTo() 메서드만 가지고 있는 인터페이스 입니다. Integer, Long, Date 등의 타입클래스는 Comparable를 상속해 compareTo()가 오버라이딩 되어 있습니다. 만일 내가 클래스를 따로 만들어 Comparable를 상속하고, compareTo()를 오버라이딩 한다면 Sort할 때 오버라이딩..
2022.04.13 -
[Effective-Java] 아이템 85 자바 직렬화의 대안을 찾으라
아이템 85 자바 직렬화의 대안을 찾으라 Java에 처음으로 직렬화가 도입되었을 때 어렵지 않게 *분산객체를 만들 수 있다는 것은 매력적이었지만, 보이지 않는 생성자, API와 구현 사이의 모호해진 경계, 잠재적인 정확성 문제, 성능, 보안, 유지보수성 등 그 대가가 컸습니다. 실제로 *2016년 샌프란시스코 시영 교통국이 랜섬웨어 공격을 받아 무인발급기가 이틀간 마비되어 무료로 메트로를 타는 사태를 겪기도 했습니다. ObjectInputStream의 readObject 메서드를 호출하면서 객체 그래프가 역직렬화되는데, readObject 메서드는 (Serializable) 인터페이스를 구현했다면, 클래스패스 안의 거의 모든 타입의 객체를 만들어낼 수 있는 마법 같은 생성자입니다. 따라서 클래스패스 안의..
2022.03.20 -
[Effective-java] 아이템 78 - 공유 중인 가변 데이터는 동기화에 사용하라
아이템 78 공유 중인 가변 데이터는 동기화에 사용하라 단일 스레드보다 동시성 프로그래밍은 어렵습니다. 하지만 멀티코어 프로세서의 힘을 제대로 활용하려면 반드시 내 것으로 만들어야하는 기술이기도 합니다. synchronized 해당 메서드는 해당 스레드나 블록을 한 스레드씩 수행하도록 보장합니다. 한 객체가 일관된 상태를 가지고 생성되고, 이 객체에 접근하는 메서드는 그 객체에 락을 겁니다. 락을 건 메서드는 객체의 상태를 확인하고 필요하면 수정합니다. 즉, 객체를 하나의 일관된 상태에서 다른 일관된 상태로 변화시킵니다. 동기화를 제대로 사용한다면 어떤 메서드도 이 객체의 상태가 일관되지 않는 순간을 볼 수 없을 것입니다. 또다른 중요한 기능은 동시성을 사용하지 않으면 한 스레드가 만든 변화를 다른 스레..
2022.03.09