본문 바로가기

Language

(93)
[Java] List 메모리관리 갑자기 사이드 프로젝트하다가 생각나서 정리했다. ArrayList 를 1천 ~ 2천건 , List
[Java] Functional api (Jdk8 Version up) 자바8에서 사용되는 Funtional api이다. 자바8에서 람다랑 스트림이 추가되었는데, 왜 추가되었을까? 함수형 프로그래밍을 받아들이기 위해서이다. 1.람다 표현식 람다의 핵심은 지울수있는건 모두 지우자 이다. 모든걸 컴파일러의 추론에 의지하고, 코드로 표현하는 건 다 없애서, 간결하게 만드는 것을 목표로한다. 인터페이스 내 추상메서드가 한개로 정의가 되어있다면, 간략하게 람다식으로 구현을 할수 있다. 이런식으로 interface에 대한 추상메서드가 한개 존재할때, 해당 식을 람다로 간략하게 표현할 수 있다. 그런데 만약에 인터페이스 내 추상메서드가 2개 이상이라면? 이러한 람다식을 사용할 수 없다. 추후 운영 관리를 하다가 만약에 다른 사람이 인터페이스에서 메서드를 한개 추가하면, 해당 기존에 사용..
[Effective Java] 3. 싱글톤 패턴 싱글턴이란 객체를 하나만 생성하는 것이다. 인터페이스를 구현한 싱글턴 객체가 아니라면 , mock을 사용하여 테스트 하기 어렵다. 내부 인스턴스를 static final로 두고, private 생성자로서 사용한다면, 내부 static 인스턴스가 초기화 될떄 딱 한번만 privatee 생성자가 돌고, 이 인자는 하나뿐임을 보장한다. 유일하게 인스턴스 get 부분만 public 인경우, instance를 하나만 가지고 있고 이를 return 하는 것을 보장할 수있다. (final) 장점 향후 확장성이 있다. 다른 인스턴스(새로운 인스턴스)가 필요하다면 언제든지 신규 메소드를 추가해서 사용할 수 있다 리플렉션 방어가 된다. setAccessible 를 사용해 private 생성자에 접근 할 수 있는데 이떄 i..
[Effective Java] 2.점층적 생성자 패턴 -> 빌더 패턴 자바 빈즈 패턴 - 생성자를 파라미터 없이 생성하고, setter를 사용해서 관리 하나의 객체를 생성하고 여러개의 메서드를 사용해야한다. 점층적 생성자 - 속성이 늘어날떄마다 생성자 인수를 하나씩 늘려서 사용 인자가 늘어날떄마다 추가 해줘야하는 값이 계속 늘어난다. 빌더 패턴 -빌더 패턴은 넘기는 매게 변수에 따라 자동으로 다른 객체를 생성할 수도 있고 메서드 체이닝으로 어떤 변수에 어떤값을 넣을지를 명시적으로 선언하여 확실하게 객체를 생성할 수있다. 빌더 생성비용때문에, 인자가 4개 이상부터 값어치를 하고, 인자가 많은 객체나 대부분의 인자가 선택적일때 사용하면 유용하다
[Effective Java] 1.생성자 대신 정적 팩토리 메소드를 사용 장점 1. 이름을 가질 수 있다. 2. 같은 파라미터를 가지는 생성자를 여러개 만들수 있다. 3.호출 할떄마다 인스턴스를 새로 생성하지 않아도된다. (미리 만들어놓은 객체를 반환할 수 있다.) 4. 리턴타입의 하위 타입 객체를 반환할 수 있다. 5.입력 매게 변수에 따라 매번 다른 타입의 클래스를 반환할 수 있다. 단점 -상속이 불가 -일반 메서드와 차이가 없기 때문에 찾는데 어려움이 있다 (명명 규칙 of,From, valueof 를 관례상 사용하긴 함)
[Java] 리플렉션, 인터페이스 리플렉션 class객체를 가져온다.생성자를 가져온다.메소드를 가져온다필드를 가져온다. 장점 -프로그램에서 임의의 클래스에 접근 할 수 있다. 생성자,메서드,필드를 조작할 수 있다. 컴파일 당시 존재하지 않던 클래스도 이용할 수 있다. 단점 컴파일 타임 타입 검사를 이용할 수 없다 코드가 지저분 해지고 장황해준다. 성능이 떨어진다. 일반 메서드 호출보다, 리플렉션을 이용한 메서드 호출이 훨씬 느리다. 즉, 속도가 느리고 컴파일 때 잡을수없고, 지저분 해져서 잘 안쓴다 인터페이스는 다중구현이 가능하고, 개발시간 단축(여러명이서할때, 인터페이스를 주고 해당 각자 별도로 구현가능) 인터페이스는 구현을 강제화 하기 때문에, 구현체들의 통일성을 맞출수도있다. 클래스간 결합도를 낮춘다. 단순히 인터페이스만 갈아끼우면 끝
equals와 hashcode차이 String은 new를 사용해서 새롭게 인스턴스를 만들고, 메모리에 올리기 때문에 다른 주소값을 참조하기에 == 연관시에 false가 리턴된다. 예를 들어서 String a. = "3" String b = "4" String c = new String("7") 이면 a == b 이지만 a !=c 이다. String 은 wrapper class이지만, 같은 내용에 대해서는 같은 주소를 바라보게 끔 한다 String constant pool에 등록되기 때문이고 다른 주소값을 보는 c와는 같지 않다는 것을 알 수 있다. hashcode는 해당 주소값을 hashFunction한 값을 출력한다. object에 있는 equals는 해시코드에 대한 비교를 하고 결과를 return한다. 만약에 사용자가 임의로 만든 o..
[Java] Hash 동작방식 해시, 쉽게말하면 많은 것들이 있지만 Hash 기반으로 동작하는 hashMap에 대해서 동작방식을 정리한다. Object클래스 기준, hashCode메서드에 대한 설명이다. 해당 메서드는 오브젝트의 해시코드 값을 리턴하고, 두 오브젝트가 equals를 통해 같다고 판별되면 hashcode또한 동일해야한다. equals메서드를 통해 다르다고 판별되더라도, hashcode가 꼭 달라야하는 것은 아니지만 hashCode가 다르면, 해시 테이블을 사용할때 성능상 이점이 나온다. HashMap은 기본적으로 bucket배열을 16으로 설정한다. bucket이란, HashTable에 데이터를 담는 공간을 의미한다. 이 용량은 설정해 놓은 LOAD_FACTOR기준에 다다르면 자동으로 2배씩 증가한다. 용량을 작게 설정..