본문 바로가기

개발 공부/Java58

이펙티브 자바 아이템 27 - 비검사 경고를 제거하라 - 핵심 정리 아이템 27 - 비검사 경고를 제거하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 컴파일러가 컴파일 할 때 에러 와 경고 두가지로 나누어진다. 에러 는 컴파일이 실패하는 것이고, 경고 는 컴파일에 실패하지는 않지만 권장하지 않고, 위험성이 있을 때 나타난다. 경고 는 컴파일러시 경고 메세지 를 출력할 수 있다. 이 경고 중에서도 비검사 (unchecked) 란 컴파일러가 타입 안정성을 확인하는데 필요한 정보가 충분치 않을 때 발생하는 경고이다. public class SetExample { public static void main(String[] args) { Set names = new HashSet(); Set strings = .. 2022. 12. 8.
이펙티브 자바 아이템 26 - 로 타입은 사용하지 말라 - 완벽 공략 아이템 26 - 로 타입은 사용하지 말라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. Generic DAO 만들기 public interface Entity { Long getId(); } public class Account implements Entity { private Long id; private String username; public Account(Long id, String username) { this.id = id; this.username = username; } @Override public Long getId() { return this.id; } public String getUsername() { return.. 2022. 12. 7.
이펙티브 자바 아이템 26 - 로 타입은 사용하지 말라 - 핵심 정리 아이템 26 - 로 타입은 사용하지 말라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 제네릭은 자바 5 버전 부터 들어온 기능이다. public class GenericBasic { public static void main(String[] args) { // Generic 사용하기 전 List numbers = new ArrayList(); numbers.add(10); numbers.add("whiteship"); for (Object number: numbers) { System.out.println((Integer)number); // 오류 발생 } } } 제네릭이 도입되기 전에는 위와같이 List 를 타입없이 정의를 했다. 이렇.. 2022. 12. 7.
이펙티브 자바 아이템 25 - 톱 레벨 클래스는 한 파일에 하나만 담으라 - 핵심 정리 아이템 25 - 톱 레벨 클래스는 한 파일에 하나만 담으라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 톱 레벨 클래스는 파일에 정의되어 있는 가장 바깥 클래스를 의미한다. // 코드 25-1 두 클래스가 한 파일(Utensil.java)에 정의되었다. - 따라 하지 말 것! (150쪽) class Utensil { static final String NAME = "pan"; } class Dessert { static final String NAME = "cake"; } 이렇게 같은 파일에 클래스가 2개가 있어도 컴파일 할 때는 문제가 없다. 그러나 이렇게하면 안된다. 한 파일에는 톱 레벨 클래스 하나만 유지해야한다. 한 파일에 톱 레.. 2022. 12. 2.
이펙티브 자바 아이템 24 - 멤버 클래스는 되도록 static 으로 만들라 - 완벽 공략 아이템 24 - 멤버 클래스는 되도록 static 으로 만들라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 어댑터 패턴 어댑터 패턴은 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꾸는 패턴이다. public class MySet extends AbstractSet { @Override public Iterator iterator() { return new MyIterator(); } @Override public int size() { return 0; } private class MyIterator implements Iterator { @Override public boolean hasNext() { return fals.. 2022. 12. 2.
이펙티브 자바 아이템 24 - 멤버 클래스는 되도록 static 으로 만들라 - 핵심 정리 아이템 24 - 멤버 클래스는 되도록 static 으로 만들라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 멤버 클래스란 클래스를 구성하는 요소이다. 클래스를 구성하는 요소에는 필드, 메서드들 이 있다. 클래스도 이것과 같은 급으로 정의가 되어있다면 멤버 클래스 이다. 멤버는 클래스의 구성요소를 의미한다. 중첩 클래스는 어느 한 클래스의 내부 어딘가에 또다른 클래스가 정의되어 있다면 중첩 클래스 이다. 모든 중첩 클래스는 멤버 클래스라고 생각되기 쉽지만 그건 아니다. 변수를 예로들면 변수가 정의된 위치에 따라 멤버 변수, 로컬 변수 등으로 나뉜다. 어떠한 scope 이 메서드에 포함되어 있으면 로컬 변수 라고 부른다. scope 이 클래.. 2022. 12. 2.
이펙티브 자바 아이템 23 - 태그 달린 클래스보다는 클래스 계층 구조를 활용하라 - 핵심 정리 아이템 23 - 태그 달린 클래스보다는 클래스 계층 구조를 활용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 태그달린 클래스란 그 클래스가 가지고 있는 필드 중 일부가 그 클래스의 구체적인 타입을 나타내는 것을 말한다. class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드는 모양이 원(CIRCLE)일 때만 쓰인다. double radius; // 원용 생성자 Figure(double rad.. 2022. 11. 30.
이펙티브 자바 아이템 22 - 인터페이스는 타입을 정의하는 용도로만 사용하라 - 핵심 정리 아이템 22 - 인터페이스는 타입을 정의하는 용도로만 사용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 (J/K) static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // 전자 질량 (kg) static final double ELECTRON_MASS = 9.109_383_56e-31; } 위와 같이 인터페이스를 상수를 정의하는 용도 로 사용하는 경우가 있다. publ.. 2022. 11. 30.
이펙티브 자바 아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라 - 완벽 공략 아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. ConcurrentModificationException ConcurrentModificationException 은 컬렉션을 다룰 때 주로 발생하는 예외이다. 컬렉션을 순회하다 어떤 엘리먼트를 삭제하고 싶을 때 주로 발생할 수 있다. ConcurrentModificationException 는 컬렉션에 국한된 예외는 아니다. ConcurrentModificationException 은 현재 객체의 상태가 바뀌면 안되는 것을 수정 할 때 발생하는 예외이다. 어떤 스레드에서 컬렉션을 순회하는 도중에 다른 스레드가 해당 컬렉션을 변경하려고.. 2022. 11. 29.
이펙티브 자바 아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라 - 핵심 정리 아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 인터페이스에 디폴트 메서드를 추가하면 다소 위험한 상황이 벌어질 수도 있다. 인터페이스에 디폴트 메서드를 추가하는 것은 해당 인터페이스를 구현한 모든 클래스에 해당 기능을 강제적으로 삽입하는 것을 의미한다. 이로인해 예기치못한 문제가 발생할 수 있다. public interface Collection extends Iterable { // -- 중간 생략 -- default boolean removeIf(Predicate 2022. 11. 29.
이펙티브 자바 아이템 20 - 추상 클래스보다 인터페이스를 우선하라 - 완벽 공략 아이템 20 - 추상 클래스보다 인터페이스를 우선하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 템플릿 메서드 패턴 템플릿 메서드 패턴은 상속을 사용하는 대표적인 디자인 패턴 중 하나이다. 알고리즘의 구조를 서브 클래스가 확장할 수 있도록 템플릿으로 제공하는 방법이다. 상속을 사용해 템플릿 메서드의 일부분을 확장할 수 있다. public abstract class FileProcessor { private String path; public FileProcessor(String path) { this.path = path; } public final int process() { try(BufferedReader reader = new .. 2022. 11. 29.
이펙티브 자바 아이템 20 - 추상 클래스보다 인터페이스를 우선하라 - 핵심 정리 아이템 20 - 추상 클래스보다 인터페이스를 우선하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 추상 클래스와 인터페이스는 자주 비교가 된다. 보통 인터페이스는 타입을 정의 할 때 사용되고 추상 클래스는 인터페이스의 구현체를 일부 기본적으로 제공 할 때 사용한다. 추상 클래스를 상속해 기능을 제공하기보다는 인터페이스를 우선적으로 사용해야한다. 하나의 추상 클래스만 상속 받을 수 있기 때문에 제약이 심해진다. 추상 클래스를 상속받아야 하는 클래스가 다른 클래스를 상속 받았을 수도 있고 여러 클래스가 동일한 클래스를 상속받아야 하는데 둘 간의 계층 구조가 만들어진 경우 추상 클래스 상속이 어려워진다. 인터페이스의 장점 자바 8부터 인터페이.. 2022. 11. 28.