본문 바로가기

Java12

Item57. 지역변수의 범위를 최소화하라. 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 오늘은 그럼 지역변수의 범위를 줄이는 방법에 대해 알아보자. 1. 처음 쓰일 때 선언하기 미리 선언해두면 변수를 실제로 사용하는 시점에 타입과 초깃값이 기억이 나지 않을 수 있다. 지역변수의 범위는 선언된 지점부터 그 지점을 포함한 블록이 끝날 때까지 이므로, 실제 사용하는 블록 바깥에 선언된 변수는 그 블록이 끝난 뒤까지 살아 있게 된다. 2. 선언과 동시에 초기화하기 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미루기. ✅ 예외 : try-catch 변수를 초기화 하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초기화하기. (그렇지 않으면 예외가 블록을 넘어 메서드.. 2022. 7. 3.
Item61. 박싱된 기본 타입보다는 기본 타입을 사용하라. 자바의 데이터 타입은 int, double, boolean 같은 기본타입과 이에 대응하는 Integer, Double, Boolean 같은 박싱된 기본 타입이 있다. 기본타입과 박싱된 기본타입에는 크게 세가지의 차이가 있다. 기본타입과 박싱된 기본타입의 차이 1. 박싱된 기본 타입은 값 뿐만아니라 식별성 이라는 속성도 갖는다. 2. 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다. 3. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 이 세가지 차이 때문에 주의하지 않고 사용하면 문제가 발생할 수 있다. Integer 값을 오름차순으로 정렬하는 예시를 보자. (첫 번째 원소가 두 번째 원소보다 작으면 음수, 같으면 0, 크면 양수를 반환한다.) Compara.. 2022. 7. 3.
Item47. 반환 타입으로는 스트림보다 컬랙션이 낫다. 원소 시퀀스, 일련의 원소를 반환하는 메서드는 많다. 그 중 stream 을 사용해 원소를 반환할 수 있다는 얘기가 있겠지만, stream 은 반복(iteration)을 지원하지 않는다! 그래서 stream 과 반복을 알맞게 조합해야 좋은 코드가 나온다. 그런데❗❗ stream 인터페이스는 Iterable 인터페이스가 정의한 추상 메서드를 전부 포함하며, Iterable 인터페이스가 정의한 방식대로 동작한다!! 그럼에도 for-each 로 stream 을 반복할 수 없는 이유는 Stream 이 Iterable을 확장하지 않아서이다..! 자바 타입 추론의 한계로 컴파일되지 않는 예시 for (ProcessHandle ph : ProcessHandle.allProcesses() :: iterator) { ^.. 2022. 6. 29.
Item40. @Override 애너테이션을 일관되게 사용하라. @Override 메서드 선언에만 달 수 있으며, 이 어노테이션이 달렸다는 것은 상위 타입의 메서드를 재정의 했음을 뜻한다. 아래 예제 코드에서 문제점❗❗ public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * first + second; } public static .. 2022. 6. 13.
Item34. int 상수 대신 열거 타입을 사용하라. 자바에서 열거 타입이 생기기 전까지는 정수 상수를 열거하는 방법을 사용하였다. public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; 🚫 위와 같은 방식의 단점 타입 안전 보장 X 컴파일러가 이해하는 값은 정수이므로 ORANGE_NAVEL 을 건네야 하는 곳에 APPLE_FUJI를 보내고 동등연산자로 비교하.. 2022. 6. 5.
Item31. 한정적 와일드카드를 사용해 API 유연성을 높이라. 일단 와일드카드가 뭐지??? 내가 알고있는 와일드카드는 비장의카드, 좋은카드.. 모 이런의미뿐… 허허;; 와일드카드 제네릭 코드에서 물음표(?) 로 표기되어 있는것으로, 아직 알려지지 않은 타입을 뜻한다. 그럼 제네릭은 뭐지…? 분명.. 많이 들어는봤지만 알아볼 생각을… 지금하면되지..!!!! 제네릭(Generic) 데이터의 타입을 일반화하는것을 의미한다. 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법! 아래와 같이 자바에서 제네릭은 클래스와 메소드에만 다음과 같은 방법으로 선언할 수 있다. T는 타입변수 라고 하며, 임의의 참조형 타입을 의미한다. class MyArray { T element; void setElement(T element) { this.element .. 2022. 6. 4.
Item25. 톱레벨 클래스는 한 파일에 하나만 담으라. 소스파일 하나에 톱레벨 클래스를 여러개 선언하더라도 자바 컴파일러는 불평하지 않는다. 근데 왜 하나만 담으라고 하지?? 👀 아무런 득이 없는데 SOLID 의 원칙 중 SRP 원칙을 위배하면서 까지 할 이유가 없다. 또한, 심각한 문제가 있다! * SRP 단일 책임 원칙(Single responsibility principle) : 하나의 클래스는 하나의 책임만 가져야 한다. 어떤 심각한 문제?? public class Main { public static void main(String[] args) { System.out.println (Utensil.NAME + Dessert.NAME ); // pancake } } // Utensil.java 에 정의된 두 클래스 class Utensil { stat.. 2022. 5. 24.
SOLID 좋은 객체지향 설계의 5가지 원칙 SOLID 클린코드로 유명한 로버트 마틴이라는 사람이 “좋은 객체지향 설계의 5가지 원칙” 이라고 구지 만들어놓음.... SRP : 단일 책임 원칙(Single responsibility principle) 하나의 클래스는 하나의 책임만 가져야 한다. 코드 수정을 해야하는데 파급 효과가 적다면?? 단일 책임 원칙을 잘 따른것! OCP : 개방-폐쇄 원칙(Open/closed principle) 막 뭐라 정의는 못하겠다.. 내가 이해한건 그냥 로미오와 줄리엣 대역!! 로미오가 아프면 대역이 대신할 수 있는게 개방-폐쇄 원칙 지킨거다..! 로미오인 주연에 의존하지말고 대역인 인터페이스를 이용해라 뭐 그런 의미인듯 예를들어 만약에 PM이 이번 기능은 A로 하기로했어 그렇게해! 라고 했는데 내가 보기엔 아무리생.. 2022. 5. 19.
다형성, 오버라이딩, 오버로딩 다형성(Polymorphism) 객체 지향 프로그래밍에서 가장 중요한 개념이라 할 수 있다는데 그래서 뭐지??? ➡️ 같은 자료형에 여러 객체를 대입하여 다양한 결과 도출!! 쉽게말해서 이름 그대로 여러가지 형태를 가질 수 있다는 의미이다. 이러한 다형성의 대표적인 방법은 오버라이딩과 오버로딩이 있다. 그래서 오버라이딩과 오버로딩은 뭔데?? 오버라이딩(Overriding) 상속을 받아 부모클래스의 메서드를 재정의!! 부모클래스와 메서드가 동일하지만, 구현내용을 다르게 재정의하여 사용할 수 있다. 오버로딩(Overloading) 메서드를 생성할때 매개변수의 타입과 개수를 다르게하여 같은 이름의 메서드를 여러개 생성할 수 있는것. void Apple(int a){} void Apple(int a, int b.. 2022. 5. 19.
SNMP GETBULK, SUBTREE 시간 성능 Test Switch 하드웨어 정보관리 Agent 개발을 어느 정도 마무리하고 기존에 GetBulk로 각각의 OID에서 데이터를 가져오던 것을 성능개선을 위해 Test 해보았습니다. 💡 기존방식 (GETBULK로 24개씩 데이터 받기) 예를 들어 24 포트짜리의 Switch라고 가정하였을 때, 하나의 OID 1.3.6.1.2.1.2.2.1.2에 대하여 각 24개의 포트 데이터를 GetBulk를 사용하여 한번에 24개를 가져왔습니다. JAVA 코드단에서 작성된 코드 사이사이에 시간을 측정하여 확인해본 결과 1개의 OID에 대하여 24개의 데이터를 조회해오는데 0.1~0.2초 의 시간이 걸렸으며, 원하는 데이터 정보가 들어있는 총 14개의 OID에 대하여 24*14 = 336 개의 데이터를 조회하는 데는 1.3~1... 2020. 9. 16.