반응형

Method

    static method와 Override hiding 대한 정리

    static 메소드를 자기고 있는 클래스를 상속받은 자식 클래스에서 그 static 메소드를 override 할 수 있을까? 안될거 알지만 한번 확인해보고 싶었다. 먼저 static method를 가지고 있는 Parent을 만들었다. 123456789101112/** * 부모 클래스 */static class Parent { public static void getData() { System.out.println("부모 getData"); } public void method() { System.out.println("부모 method"); }}Colored by Color Scriptercs 그리고 이를 상속하는 Child 클래스를 만들어보자.123456789101112/** * 자식 클래스 */sta..

    Java8 함수형 인터페이스 만들어서 사용하기

    Java8 함수형 인터페이스 만들어서 사용하기 함수형 인터페이스 사용 -> 정의한 함수형 인터페이스를 람다식을 이용하여 사용할 수 있다. 12345678910111213141516171819// 함수형 인터페이스 선언 // 함수형 인터페이스를 만들고자 할 경우에는 @FunctionalInterface 애노테이션을 붙혀야 한다. @FunctionalInterfacepublic interface WedulInterface { public void print(int x);} public static void main(String args[]) { WedulInterface wedul = new WedulInterface() { @Override public void print(int x) { System.ou..

    자바 8에서 java.util.function 패키지에 추가된 기본 함수형 인터페이스 정리

    자바 8에서 java.util.function 패키지에 추가된 기본 함수형 인터페이스 정리 Function => T를 입력으로 R을 출력하여 반환 1234567891011121314151617public class Java8Test { public static void main(String args[]) { Function mapStrToInt = new Function() { public Integer apply(String str) { if (str == "wedul") { return 1; } return 2; } }; List testData = Arrays.asList("wedul","dd","babo"); testData.stream().map(mapStrToInt).forEach(System..

    Java8 인터페이스 default Method (디폴트 메소드)

    인터페이스의 디폴트 메서드 Java8에서 추가된 람다식을 제외하고도 편리한 기능이 추가되었다. 그 중 하나가 인터페이스의 default 메소드이다. Java8에서는 interface에 default 키워드를 통해 메서드를 구현할 수 있다. 또, 이를 구현하는 클래스는interface의 메서드를 @Override 할 수 있다. Default 매서드 구현 방법은 다음과 같다. 123456789101112131415161718192021222324252627282930// getName이라는 default 메소드 선언public interface WedulInterface { default String getName() { return "wedul"; }} // getName이 없는 DTO 클래스 생성publ..

    메서드- 규칙 43 null 대신 빈 배열이나 컬렉션을 반환하라.

    다음과 같은 상황을 보자. getData()를 통해 Babo 클래스를 담고 있는 List를 반환받고 그 반환된 List를 통해서 어떤 행위를 Main 메서드에서 실행한다고 가정해보자. 123456789101112131415161718192021package effective42; import java.util.List; public class Main { public static void main(String args[]) { System.out.println(getData().contains(new Babo())); } public static List getData() { return null; } static class Babo { int a; int getA() { return a; } }}Col..

    메서드- 규칙 40 메서드 시그니처는 신중하게 설계하라.

    메서드를 설계할 때 주의해야 할 부분과 좋은 개선 방안에 대한 이야기를 살펴보겠다. 1. 메서드 이름을 신중하게 고르라. - 개발을 진행하면서 어려운 부분중에 네이밍 규칙이 꼽히는 것 같다. 메서드뿐만 아니라 변수를 선언을 할 때에도, 이름을 지어야하는데 쉽지 않은 것 같다. - 일관성을 유지해야하고, 일반적인 이름을 사용하지 않아서 혼돈을 격을 수 있는경우를 피해야한다. 2. 편의 메서드(convenience method)를 제공하는데 너무 열 올리지 마라. - 자주 사용하는 메서드를 정의하기 위해서 우리는 CommonUtil등에 정의를 하여 공통으로 사용할 수 있도록 하는경우가 많다. - 하지만 이는 유지보수, 테스트와 같은 여러 측면에서 번거로움이 생길 수 있기에 그럴지 모르겠다면 빼버려라. 3. ..

    메서드- 규칙 39 필요하다면 방어적 복사본을 만들라.

    포인터를 사용하지 않아 잘못된 메모리 접근으로 다른 메모리 영역에 데이터를 건드려서 beffer overrun(오버플로우)등의 오류는 자바에서는 발생하지 않는다. 하지만 아무리 안전한 언어를 사용한다고 해도, 스스로 노력하지 않는 경우, 클래스의 클라이언트가 불변식(invariant)을 깨버릴 수 있기 때문에, 조금 더 방어적인 프로그래밍을 해야 한다. 예를 통해서 확인해보자. 결재정보를 담고 있는 BillTimeObj라는 클래스는 결재 날짜 정보를 가지고 있는 Date 클래스를 생성자를 통해서 전달받는다. BillTimeObj 클래스는 final로 선언되어 있어서 변경되지 않을 것 같아 보이지만 생성자로 전달되는 Date 객체가 변경이 가능하기 때문에 이는 불변식이 깨져버린다. 1234567891011..

    제네릭 - 규칙 27 가능하면 제네릭 메서드로 만들 것

    클래스를 제네릭 하는 것도 많은 혜택을 볼 수 있지만 (규칙 26) 메소드를 제네렉 자료형으로 사용하는 것 또한 많은 혜택을 볼 수 있다. row type으로 사용하였을 경우에는 형안전성 문제때문에 다음과 같은 오류가 발생한다는 것을 저번에 규칙에서 확인을 했었다. 이런 문제를 형인자를 메서드에 추가로 선언하여 메서드를 구현하면 형안정성을 보장받을 수 있다. 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙27 인용.

    클래스와 인터페이스 - 규칙 21 전략을 표현하고 싶을 때는 함수 객체를 사용하라.

    호출 대상에 대해 어떠한 작업을 수행하는 것을 전략 패턴이라고 한다. 12345class StringCompare { public int compare (String s1, String s2) { return s1.length() - s2.length(); }}Colored by Color Scriptercs 두 개의 문자열을 받아서 비교하는 클래스를 사용할 수 있는 전략 패턴이다. 비교가 필요할 경우 매번 StringCompare 클래스를 생성하지 말고, 싱글톤 패턴을 정의하여 가져다가 사용하면 더욱 편리하다. 하지만 이 StringCompare 클래스의 경우 객체를 메서드에 전달하기 위해서는 인자의 자료형이 String이어야 한다. 따라서 Compareator 인터페이스를 정의 하여 이를 String..

    Java Reflection 설명 및 사용법

    자바는 Reflection이라는 언어의 특징이다. 리플렉션은 자가 프로그램이 자기 자신을 조사하거나, “introspect”하는 것을 실행하거나, 프로그램의 내부 프로퍼티의 조작을 허락하는 것을 말한다. 예를 들어 멤버변수의 이름을 취득하여 조작할 수 있다. 123456789try { Class c = Class.forName(args[0]); Method m[] = c.getDeclaredMethods(); for (int i = 0; i

반응형