Java
-
Spring AOP(Aspect Oriented Programming)이란?백수의 개발/스프링 2019. 12. 31. 18:52
AOP(Aspect Oriented Programming)이란?AOP를 관점 지향 프로그래밍이라고 한다. 관점 지향은 어떤 로직에 대해 핵심 기능과 공통 기능을 나누어서 보고, 그 관점을 기준으로 모듈화를 진행하는 것이다.즉, 공통 기능을 핵심 기능과 분리해 놓고, 공통 기능 중에서 핵심 기능에 적용하고자 하는 부분에 적용하는 것이다. 간단하게 보면 일반적인 핵심 비즈니스 로직은 핵심 기능으로 본다면 로깅, 트랜잭션, 데이터베이스 연결, 파일 입출력 등과 같은 일련의 핵심 로직을 위한 부가적인 기능들을 공통 기능으로 분리한다고 볼 수 있다. AOP 주요 용어Aspect : 공통 기능(모듈화 된 기능)Target : Aspect(부가 기능)를 부여할 대상 (클래스, 메서드 .. ) Advice : 실질적인..
-
Item 27. 비검사 경고를 제거하라백수의 개발/이펙티브 자바 2019. 10. 15. 12:19
비검사 경고 제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게된다. 비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 변환 경고 등이다. 대부분의 비검사 경고는 쉽게 제거할 수 있다. 아래의 코드를 살펴보자. Set exaltation = new HashSet(); 이를 컴파일하면 컴파일러는 무엇이 잘못됐는지 친절히 설명해준다. warning: [unchecked] unchecked conversion Set exaltation = new HashSet(); ^ required: Set found: HashSet 아래처럼 컴파일러가 알려준 대로 수정하면 경고가 사라진다. Set exaltation = new HashSet(); 이와 달리 제거하기 훨씬 어..
-
Item 26. 로 타입은 사용하지 말라백수의 개발/이펙티브 자바 2019. 10. 14. 12:32
제네릭 타입 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다. 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭 타입이라 한다. 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 예컨데 List를 선언할 때 List은 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입이다. 여기서 String이 정규 타입 매개변수 E에 해당하는 실제 타입 매개변수다. 그러나, 로 타입은 List와 같이 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말한다. 제네릭이 도래하기 전 코드와의 호환성을 위해 남겨둔 것이다. 로 타입의 문제 private final Collection stamps= ...; stamps.add(new Coin(...)); ..
-
Item 25. 톱레벨 클래스는 한 파일에 하나만 담으라백수의 개발/이펙티브 자바 2019. 10. 13. 12:09
다중 톱레벨 클래스 정의 소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 컴파일을 하는데 아무런 문제는 없다. 그러나 이러한 방식은 아무런 득이 없을 뿐더러 심각한 위험을 감수해야하는 행위이다. 이는 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문이다. 간단한 예를 보자. public class Main { public static void main(String[] args) { System.out.println(Utensil.NAME + Dessert.NAME); } } // Utensil.java class Utensil { static final String NAME = "pan"; } class Dessert {..
-
Item 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라백수의 개발/이펙티브 자바 2019. 10. 11. 20:15
태그 달린 클래스 class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드는 모양이 원(CIRCLE)일 때만 쓰인다. double radius; // 원용 생성자 Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } // 사각형용 생성자 Figure(double length, double width) { shape = Shape.RECTANGLE; this.length = length; thi..
-
Item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라백수의 개발/이펙티브 자바 2019. 10. 8. 12:00
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉, 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다. 따라서 인터페이스는 오직 이 용도로만 사용해야 한다. 이 지침에 맞지 않는 예로 상수 인터페이스라는 것이 있다. 이는 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다. 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)..
-
Item 20. 추상 클래스보다는 인터페이스를 우선하라백수의 개발/이펙티브 자바 2019. 10. 6. 12:07
추상 클래스와 인터페이스 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스 두가지가 있다. 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 것이다. 그러나 인터페이스는 어떤 클래스를 상속했든 같은 타팁으로 취급된다. 그 결과 기존 클래스에 새로운 인터페이스를 구현하기 편하다. 인터페이스의 장점 1. (*)믹스인(mixin) 정의에 안성맞춤이다. 믹스인이란? 클래스가 자신의 본래타입에 추가하여 구현할 수 있는 타입 2. 계층구조가 없는 타입 프레임워크를 만들 수 있다. 가수(Singer), 작곡가(Songwriter), 작곡가겸 가수(SingerSongwriter) 예시를 통해 인터페이스의 두번째 장점에 대해 살펴보자. 만약..
-
Item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라백수의 개발/이펙티브 자바 2019. 10. 5. 12:03
상속을 위한 문서화 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 남겨야한다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수 있다. 이 때 호출하는 메서드가 재정의 가능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야 한다. 덧붙여 어떤 순서로 호출하는지, 각각의 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담아야 한다. * API 문서의 메서드 설명 끝에 "Implementation Requirements"라고 되어 있다면, 그 메서드의 내부 동작 방식을 설명하는 것이다. 아래는 java.util.AbstactCollection API문서의 remove 메서드이다. 해당 메서드의 기능에 대해 우선 이야기를 하고, implem..