본문 바로가기

Java

(20)
10. Exceptions ( 예외 처리 ) - Effective Java 3th 예외처리는 적절하게 사용하면 가독성, 안정성이 올라가지만, 적절하게 사용하지 않으면 오히려 잘못된 길로 가게 된다. Item 69. 예외 상황을 위해서만 예외처리를 하여라. // Horrible abuse of exceptions. Don't ever do this! try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexOutOfBoundsException e) { } 위의 코드는 결국 range 범위를 넘어가면 exception을 발생시킬 것이다. 하지만 이 코드는 결국 아래와 같다. for (Mountain m : range) m.climb(); Exception은 이름 그대로, 예외 상황을 위해서만 사용되어야지 원래 control ..
Jaxb 하면서 있었던 이슈 Getter랑 변수랑 둘다 XmlAttribute로 인식해서 중복 https://codeday.me/ko/qa/20190428/403414.html java – 같은 이름을 가지는 Jaxb 객체 - 코드 로그 동일한 이름의 2 개의 다른 jaxb 객체를 비 정렬 화하는 것이 가능하게되는 것처럼 보입니다. Bar 클래스가 있습니다 … public abstract Bar { private @XmlElement String val; } .. 두 가지 구현 (생성자 등 생략) : @XmlRootElement(name="bar") public class BarA extends Bar { } @XmlRootElement(name="bar") public class Bar codeday.me https://coded..
디자인패턴8-전략 패턴/스트래티지 패턴(Strategy Pattern) 제목만 보면? 전략 패턴? 뭔가 전략이 자주 바뀌는 즉, 특정 행위가 바뀌는 상황에서 쓰면 좋은 패턴인 것 같다. 일을 하는 방식, 비즈니스 규칙, 문제를 해결하려는 알고리즘을 쉽게 바꿔주기 위한 규칙인 것 같다 요구 사항 여러가지 로봇이 있는데 각자 공격 방식과 이동 방식이 다르다. 이를 모델링 해달라! 기존의 나였다면? 나름 부모 클래스를 만들어서 move(), attack() 함수를 정의하고 구체적인 구현은 자식 클래스에게 맡겼을 것이다. 나의 개발 완벽하니? Atom과 TaekwonV는 move() 방식이 같은데 코드가 중복! ( 나중에 걷는 방식이 구체화되고 수정해야 된다면 2번 수정! ) 새로운 로봇을 구현하는데 move()나 attack() 방식이 같은 경우도 중복 발생! Atom을 걷는 방..
Java8 람다(Lambda) 제대로 쓰기 람다 왜 알아야되나? Java8 이상 버전을 사용하더라도 람다를 몰라도 된다. 하지만 이는 좋은 장비를 사놓고 좋은 기능을 쓰지 않는 것과 비슷하다. 아래의 예제를 먼저 살펴보자. 특정 조건을 만족하는 주문을 보여주는 프로그램이다. 처음에는 특정 가격보다 비싼 주문을 보여달라고 했다. 하지만 고객이 이름으로도 조회를 해달라고 한다면? 계속 해당 코드에 메소드를 추가하고 수정해야 한다. 동적 파라미터화 말그대로 파라미터로 어떤 행위를 전달하는 것이다. 위의 예제에 적용해보면 특정 조건을 만족하는지에 대해 체크 해주는 행위를 파라미터로 넘기는 것이다. ( 마치 전략 디자인 패턴과 같다. ) 아까 작성한 함수를 조금 리팩토링 해보자. 파라미터로 특정 조건을 체크해주는 행위를 받았다. 그럼 아래와 같이 coll..
디자인패턴7 - Proxy pattern(프록시 패턴) Proxy 뜻? proxy를 번역을 해보면 대리인,대리(권)이라 나온다. 대리로 무언가를 해줘야 할 때 필요한 패턴인 것 같다. 즉, 비즈니스 코드에 트랜잭션, 로깅, 인가처리 등과 같은 부가기능을 적용해야 할 때 쓰는 패턴이다. Proxy 패턴 예제 testService findAll() 이전과 이후에 어떤 기능을 적용하고 싶을 때 아래와 같이 코드를 작성하면 된다. 데코레이터 패턴과 유사하나, 데코레이터 패턴은 상속 없이 새로운 기능을 추가하기 위해 래핑하는 것이다.
디자인 패턴6 - 옵저버 패턴(Observer pattern) 옵저버 패턴(Observer pattern)뜻을 보면 뭔가 변화가 발생하면 어떠한 행위를 해야할 때 쓰는 패턴 같아 보인다.즉, 한 객체의 변화에 따라 다른 객체의 상태도 연동되도록 1:다 객체 의존관계를 구성할 때 사용된다.데이터 변경이 일어나면 어떠한 행위가 일어나야 한다.만약에 생각없이 코딩을 한 경우 아래와 같이 짤 것이다.onChanged() { // 변경이 일어난 경우class1.function();class2.function();....}이렇게 되면 1. class1의 function()이 변경된 경우 해당 클래스까지 수정해야 되므로 OCP에 위반된다.2. 변경이 일어난 경우 어떠한 행위를 추가해야 한다면??? 해당 클래스 전체가 바뀌어 버린다..... ( 말도 안되는 재사용성... )pub..
디자인 패턴5 - 컴포지트 패턴 ( Composite pattern ) 디자인패턴5 - 컴포지트 패턴 (Composite pattern )이것도 단어 뜻을 그대로 살펴보면 composite(복합물) 패턴? 또 뭔가 조합을 하는 패턴인 것 같다.사용자(클라이언트)가 어떠한 조합으로 생성 된 클래스를 동일하게 사용할 때 쓰는 패턴이다.말만 보면 항상 와닿지 않는다.public class Keyboard { private int price; private int power; public Keyboard(int power, int price) { this.power = power; this.price = price; } public int getPrice() { return price; } public int getPower() { return power; }}public clas..
디자인 패턴4 - 템플릿 메소드 패턴이란(Template method pattern) 템플릿 메소드 패턴이란?이것도 뜻만 살펴 보면템플릿? 뭔가 양식을 정해놓고메소드? 함수를 이용하는패턴일까 싶다.어떤 작업을 처리하는 방식은 서브 클래스로 빼두어서 구조는 바뀌지 않고 특정 수행하는 내역을 바꾸는 패턴이라고 한다. 템플릿 메소드 패턴 예제자동차 시동에 관한 것을 예제로 들겠다.1. 모터가 돌고2.불이 들어오고3. 등등등이 상황에서 현대차와 BMW 자동차를 구현해야 한다면?아무 생각 없이 구현한다면현대차 클래스에 boot() { .// 1,2,3 동작 } BMW차 클래스에 boot() {.// 1,2,3 동작 }이런식을 할 것이다.이렇게 구현이 되면 중복된 코드가 발생한다! 하지만 1번과 같이 구현체만 다르고 전체 동작 방식이 같다면자동차 클래스를 아래처럼 만들자.public void boo..
디자인 패턴2 - 어댑터 패턴(Adapter Pattern) 어댑터 패턴 (adapter pattern)이란?항상 110V, 220V 변환기로 비유를 많이 든다. 하지만 나는 정확히 와닿지가 않았다.좀더 코드단의 예로 들면, 프로젝트에서 검색엔진 A를 사용하고 있었다. A의 search()함수와 이를 이용하여 분석하는 비즈니스 코드가 있을 것이다.하지만, 검색엔진 B가 더 좋다고 판단되어 수정을 한다면? ( 표준화는 되어있지 않을 것이기 때문에 A,B의 사용방법이나 함수는 무조건 다를 것이다 )어댑터 패턴 예제1음악 파일과 음악 재생기로 예제를 살펴보자.interface MediaPlayer { void play(String filename);}interface MediaPackage { void playFile(String filename);}class MP3 ..
디자인 패턴 1 - 파사드 패턴(facade pattern) Facade란?건물의 외간이란 뜻이다.Facade Pattern다른 인터페이스들을 통합하여 단순화 시킬 때 사용하는 패턴이다.아래는 컴퓨터가 켜질 때 필요한 동작들을 하나의 인터페이스에 정의한 예제이다./* Complex parts */ class CPU { public void freeze() { ... } public void jump(long position) { ... } public void execute() { ... } } class Memory { public void load(long position, byte[] data) { ... } } class HardDrive { public byte[] read(long lba, int size) { ... } } /* Façade */ cl..