본문 바로가기

Dev-/Java

자바 논리연산자 &, |와 &&, ||의 차이 많은 자바개발자들이 아래와 같이 논리연산자를 무의식적으로 2개씩 사용한다.if (A && B) { ... } if (A || B) { ... } 사실 아래와 같이 하나만 사용해도 된다.if (A & B) { ... } if (A | B) { ... } 두개의 차이는 무엇일까..? A라는 앞의 조건을 검사 한 후,최종 결과가 B와는 상관이 없을 때, 그럼에도 B를 판별(&, |)해보느냐, 스킵해주냐(&&, ||)의 차이다. 별거 아니지만 소소하게 불필요한 코드를 줄일 수 있다.뭐가 더 좋은건 아니라고 한다.(cf. 자바스크립트도 동일한 것으로 알고 있다.) 아래 참고/** null --> Student의 name에 null을 집어넣었다. */ Student student = new Student(1, nu..
logger 변수 private static final 선언이유? 보통 아래와 같이 무의식적으로 logger를 선언한다.private static final Logger logger = LoggerFactory.getLogger(ThisClass.class); 스택오버플로우를 보면, - private: 다른 클래스에서 가로채 사용하지 못하도록- static: 인스턴스당 하나만 필요하므로, 또한 직렬화를 피하기 위해- final: 변경될 일이 없으므로 라고 되어있는데, 영어라서 자세한 이유는 모르겠지만, 여러가지 이유로 static은 제외할 것을 권장한다고 한다.따라서 아래와 같이 선언하면 될 것 같다.private final Logger logger = LoggerFactory.getLogger(getClass()); 참고:https://stackoverflow.com..
얕은 복사 List l1 = new ArrayList(); l1.add(1); l1.add(1); l1.add(1); /** * 얕은 복사(주소값 복사) * ---> 이제부터 l1, l2는 한 몸처럼 취급 */ List l2 = l1; l2.add(1); l2.add(1); l2.add(1); l2.add(1); l2.add(1); System.out.println("l1의 사이즈: " + l1.size()); System.out.println("l2의 사이즈: " + l2.size()); System.out.println("------------------------"); System.out.println("l1: " + l1); System.out.println("l2: " + l2); 출력결과 직관적으로 생각..
싱글톤 객체 성능 향상 --> LazyHolder 사용 public class Singleton { private static Singleton test = new Singleton(); public static Singleton getInstance() { return test; } private Singleton() { } }--> 필요없는 메모리 낭비 발생 public class Singleton { private static class LazyHolder { public static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return LazyHolder.INSTANCE; } private Singleton() { } }--> 최초 1번 호..
DB에 저장된 DATE, DATETIME 타입의 시간부분이 나오지 않을 때.. (TimeStamp) MySQL에는 잘 저장되었고, 년, 월, 일 부분은 잘 가져오는데..java에서 계속 시간(hh:mm:ss)부분은 받지 못해 모든 데이터가 12:00:00으로 표시되어서 한참 헤멨습니다. 처음에는 jstl fmt 형식을 잘못 지정한 줄 알고..계속 관련해서 찾아보다가 아예 자바에서부터 못받더군요. rs.getDate(1); 처럼 java.util.Date타입으로 받은 것이 잘못이었습니다. 위 타입을 확장한 java.sql.Timestamp타입이 존재하는데이걸로 받아야 시간까지 잘 받아옵니다. 결국 jdbc로 받을 때,rs.getTimestamp(1); 로 VO에 넣어야 시간까지 잘 저장할 수 있습니다. Date를 확장한 개념이라, VO의 필드는 Date로 해도 괜찮은 듯 합니다.
@SuppressWarning란? 생에 첫 (실제)프로젝트의 소스 분석을 시작했습니다.신입 주제에 딱 하루 출근하고,, 4일동안 예비군중이라 다음주가 좀 걱정되기도 하네요. 소스에 처음보는 @SuppressWarning이라는 어노테이션이 있어 간단히 남깁니다. 기본적으로 컴파일러의 경고수준은 최대로 켜져 있습니다. 생각해보면 이는 당연한 것이고, 사용해야 하는 입장에서 봤을 때불필요한 컴파일 경고를 최대한 없앨수록 프로그래머에 대에 높은 신뢰도를 가질 수 있습니다. 바로 이럴 때 @SuppressWarning가 사용됩니다. 특히 제네릭을 사용할때 unchecked ~~ 와 같은 컴파일 경고 메세지가 많이 발생하는데,이를 그대로 둔다면 컴파일 시 ClassCastException이 발생하기 때문에코딩시 해당 부분을 없애기 위해 많은 노력을..
컬렉션 프레임워크란 개발을 하다보면, 다수의 객체를 저장해두고 필요할 때마다 꺼내서 사용하는 경우가 많습니다. 배열을 사용하는 것이 가장 단순해보이지만,, 배열의 문제점은1. 생성을 했다면 크기가 고정적이다.2. 특정 인덱스의 자료가 삭제되었을때, 확인이 불편하다. 이를 해결하기 위해 널리 알려져 있는 자료구조를 바탕으로 객체를 효율적으로 추가, 삭제, 검색할 수 있도록 만들어놓은 인터페이스, 클래스들을 컬렉션 프레임워크라고 총칭합니다. 자바로 개발을 할때 자주 보이는 아래와 같은 것들이죠. - List: 순서 유지 / 증복 저장 O- ArrayList: 객체 삭제시 앞당겨짐- Vector: 멀티스레드에서 안전하게- LinkedList: 빈번한 객체 +/-가 있을때- Set: 순서 유지 / 중복 저장 X (Iterator ..
제네릭이란 자바 API 도큐먼트를 보면 거의 대부분이 꺽쇠괄호()가 포함되어있습니다. 이 꺽쇠괄호는 제네릭 표현인데, 제네릭이 무엇인지 알아보겠습니다. 제네릭은 클래스, 인터페이스, 메서드를 정의할 때 특정 멤버의 타입을 파라미터로 지정할 수 있도록 하는 것을 말합니다. 우선 제네릭을 사용하지 않았을 때를 살펴보겠습니다. Object 타입, 따라서 모든 타입을 담을 수 있는 Box라는 클래스에 여러 타입의 객체를 담아보겠습니다. [Box.java] [Main.java] Main 클래스를 보시면 주석처리된 부분과 같이 다소 불필요해 보이는 타입변환이 일어나는 것을 확인할 수 있습니다. 제네릭을 사용해보겠습니다. 제네릭 멤버를 만들 땐, 해당 멤버명 옆에 를 사용해 파라미터로 지정할 타입을 정해줍니다. [Generic..