System.out.println 메소드는 현업에서 절대 쓰지 말아야 하는 이유
·
Java
자바를 처음 배울 시 가장 많이 사용했던 메소드 System.out.println()은 현업에서 사용하지 않는다. 그 이유를 정리해보자. 1. 로그 저장 불가 System.out.println() 은 로그가 표준 출력으로 출력된다. 즉, 파일로 저장되지 않고 휘발된다는 의미이다. 현업에서는 로그를 서버에 모으거나 파일로 저장하는 방법으로 문제가 발생했을 시 열어봐서 확인하는 용도로 사용한다. 표준 출력으로 한번 출력되고 어디에도 저장되지 않으면 로그의 제 역할을 할 수 없다. 로그된 데이터는 실제로 기록되어야 한다. 하지만 System.out.println() 만으로는 불가능하다. @slf4 log메소드를 사용하자. 2. 동기화 문제 System.out.println() 메소드 내부를 살펴보면 new L..
equals와 hashCode
·
Java
equals() - 동일성 equals는 객체 주소값을 비교한다. 이것을 동일성이라고 한다. 재정의 되지않은 상태에서는 주소값으로 비교하게 된다. 결과는 false - 동등성 메모리 주소는 다르지만 값이 같은 경우 동등성이라고 한다. 이것을 비교하기 위해 재정의 한다. 두 객체를 생성하고 동일한 값을 넣어준다면 둘은 각각 다른 객체이지만 동일한 값을 가지고 있다. 즉, 동등하다. hashCode() 객체의 해시 코드를 반환한다. 객체를 식별하는 하나의 정수값이라고도 한다. 객체의 필드들을 조합하여 해시 코드 생성하게 되는데 31이 홀수이자 소수여서 곱하여 만든다. hashCode 같은경우 객체의 해시 코드를 반환하는데 equals만 재정의 할 경우 hash값을 사용하는 hashset,map등에서 동등성이..
String Builder 와 String Buffer
·
Java
String str = "hell";str += "o";str += "!"; 이렇게 구하는 경우 당연히 우리는 str이 hello! 가 됨을 알고있다.그런데 String은 final로 선언된 불변객체라고 하였다.따라서 이 경우는 실제로hell  ,  hello   , hello!    이렇게 불변의 객체가 하나씩 생기게 되며, 이 중 참조할 내용이 없는 [ hell ], [ hello ] 두 개는 가비지 컬렉션의 대상이 된다.이는 당연히 자바의 메모리에 있어 좋지 않은 영향을 끼치게 될 것이다. String 이 불변인 이유??보안여러 참조 변수가 같은 String 객체를 참조하고 있다고 하더라도 안전하다.String 객체를 누가 조작할 수가 없기 때문이다.String 객체를 이리저리 전달할 때 원본 St..
HashSet 내부 구현
·
Java
예전 국비학원 프로젝트 진행 시 랜덤추천 서비스 기능을 만든적이 있다. 그 당시 자바 스터디를 하고 있었고 컬렉션에 순서를 보장 하지 않는 Set을 구현 하면 되겠다 생각해 사용했는데 시간이 지나 HashSet은 완전한 랜덤값이 아니라는 것을 알게 된것을 정리하는 시간 HashSet의 내부를 까보면 HashMap이 있다. 또 HashSet의 add메소드를 보면 map에 key에 객체를 넣고 value에 더미값(new Object)을 넣는다. 그 후에 key값을 hash메소드에 넣는다. 그 후 key를 해쉬코드로 변환해 h 에 저장 후 리턴한다. hashCode는 각 객체를 고유한 정수의 값으로 반환 해준다. HashSet과 HashMap은 hash값을 이용해 저장하고 관리한다. 저렇게 변환되어 저장되면 ..