자바 공부

· Algorithm
- 알고리즘 분류 : 구현 - 사용 언어 : JAVA - 문제 요점 모든 달은 28일까지 있다고 가정. 일(Day), 월(Month)가 범위를 벗어나는 것에 대한 계산 필요 (효율성 테스트가 없어 생각나는대로 작성한 코드이니 참고용으로 봐주시면 감사하겠습니다.) 소스 설명은 주석을 참고해주세요. import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException{ String today = "2022.05.19"; String[]..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 90. 직렬화된 인스턴스 대신 직렬화 프록시 사용을 검토하라 Serializable을 구현하면, 언어의 정상 메커니즘인 생성자 이외의 방법으로 인스턴스를 생성할 수 있다. 버그와 보안 문제가 일어날 가능성이 커진다는 뜻이지만, 이 위험을 크게 줄여줄 기법이 있는데 이를 ‘직렬화 프록시 패턴’ 이라고 한다. 직렬화 프록시 패턴 바깥 클래스의 논리적 상태를 정밀하게 표현하는 중첩 클래스를 설계해 private static으로 선언한다. 이 중첩 클래스가 바로 바깥 클래스의 직렬화 프록시이다. 중첩 클래스의 생성자는 단 하나여야 하며, 바깥 클래스를 매개변수로 받아야 한다. 이 생성자는 단순히 인수로 넘어온 인..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 89. 인스턴스 수를 통제해야 한다면 readResolve 보다는 열거 타입을 사용하라 ex 1) 생성자 호출을 막은 싱글턴 패턴 예시 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { ... } } 이 클래스는 바깥에서 생성자를 호출하지 못하게 막는 방식(private)으로 인스턴스가 오직 하나만 만들어짐을 보장했다. 아이템 3에서 이야기했듯 이 클래스는 선언에 implements Serializable을 추가하는 순간 싱글턴이..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 88. readObject 메서드는 방어적으로 작성하라 ex 1) 방어적 복사를 사용하는 불변 클래스 예시 public final class Period { private final Date start; private final Date end; /** * @param start 시작 시각 * @param end 종료 시각; 시작 시각보다 뒤여야 한다. * @throws IllegalArgumentException 시작 시각이 종료 시각보다 늦을 때 발생한다. * @throws NullPointerException start나 end가 null이면 발생한다. */ public Period(Date star..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 87. 커스텀 직렬화 형태를 고려해보라 클래스가 Serializable을 구현하고 기본 직렬화 형태를 사용한다면 다음 릴리스 때 버리려 한 현재의 구현에 발이 묶이게 된다. 먼저 고민해보고 괜찮다고 판단될 때만 기본 직렬화 형태를 사용하라. 기본 직렬화 형태는 유연성, 성능, 정확성 측면에서 신중히 고민한 후 합당할 때만 사용해야 한다. 객체의 물리적 표현과 논리적 내용이 같다면 기본 직렬화 형태라도 무방하다. 예로, 성명을 간략히 표현한 클래스(이름, 성, 중간이름), 3개의 멤버로 구성된 클래스의 경우 기본 직렬화 형태를 사용해도 무방하다. 기본 직렬화 형태가 적합하다고 결정했더라도 불변식 보장과 보안..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 86. Serializable을 구현할지는 신중히 결정하라 어떤 클래스의 인스턴스를 직렬화할 수 있게 하려면 클래스 선언에 implements Serializable만 덧붙이면 된다. Serializable을 구현하면 릴리스한 뒤에는 수정하기 어렵다. 클래스가 Serializable을 구현하면 직렬화된 바이트 스트림 인코딩도 하나의 공개 API가 되며, 이 클래스가 널리 퍼지는 경우 그 직렬화 형태도 영원히 지원해야 한다. 커스텀 직렬화 형태를 설계하지 않고 자바의 기본 방식을 사용하면 직렬화 형태는 최소 적용 당시 클래스의 내부 구현 방식에 묶인다. 즉, 기본 직렬화 형태에서는 클래스의 private과 ..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 85. 자바 직렬화의 대안을 찾으라 직렬화 객체 직렬화 : 자바가 객체를 바이트 스트림으로 인코딩(직렬화)하고, 그 바이트 스트림으로부터 다시 객체를 재구성(역직렬화)하는 매커니즘이다. 직렬화된 객체는 다른 VM에 전송하거나 디스크에 저장한 후 필요할 때 역직렬화하여 사용할 수 있다. 자바의 직렬화 자바의 직렬화는 위험하다. (보이지 않는 생성자, API와 구현 사이의 모호해진 경계, 잠재적인 정확성 문제, 성능, 보안, 유지보수성 등) 직렬화의 근본적인 문제는 공격 범위가 너무 넓고 지속적으로 더욱 넓어져 방어하기 어렵다는 것이다. ObjectInputStream의 readObject 메서드를 호출하면서..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 84. 프로그램의 동작을 스레드 스케줄러에 기대지 말라 여러 스레드가 실행 중이면 OS의 스레드 스케줄러가 어떤 스레드를 얼마나 오래 실행할 지 정한다. 운영체제마다 구체적인 스케줄링 정책은 다를 수 있기 때문에, 이 정책에 의존하면 안된다. 정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램이라면 다른 플랫폼에 이식하기 어렵다. 좋은 프로그램을 만드는 Tip 실행 가능한 스레드의 평균 수를 프로세서 수보다 지나치게 많아지지 않도록 하는 것이다. 실행 준비가 된 스레드들은 맡은 작업을 완료할 때까지 계속 실행되도록 하자. 이러면 스레드 스케줄링 정책이 다르더라도 크게 지장받지 않는다. 실행 가능한 ..
멍목
'자바 공부' 태그의 글 목록