본문 바로가기
728x90

전체 글249

Java 프로그래밍 면접 이렇게 준비한다:노엘마크엄(정원천) 밤 산책을 주로 하는데 자주 서점을 들린다. 알라딘 중고 서점 갔다가 오늘은 뭐라도 사야지 하다가..도저히 살책이 없어서..그나마 카테고리가 끌리는 내용의 책을 사왔다. 지금 안 사실인데..4판까지 나온거 같은데..나는 초판본을 샀다보다..2016년2월...하아-,.-어쩐지.. 어쩐지 가비지 컬렉터 얘기도 너무 예전얘기고..좀 걸러서 들어야 하는 내용이 있었는데.. 내용은 쏘쏘..였다..이미 좀 알고있는 얘기가 많아서 일까.. 한권에 책에 많은 내용을 담고 싶어서 일까.. 초판말고 최근에 나온거도 있는거 같은데 그건 내용을 모르겠어서.. 내용은 쉽고 재밌어서 읽히긴 잘 읽힌다..완전 신입때 읽어보면 좋을듯 하다. 다루는 질문이 많아, 읽다가 궁금한 부분 키워드 얻기 좋은 책인거 같다. 개인적인 점수는 6.. 2023. 2. 15.
[이펙티브자바]item 31.한정적 와일드카드를 사용해 API 유연성을 높이라. 우선 읽고 가자. 불변성(무공변성, invariant) 상속 관계에 상관없이 자신의 타입만 허용하는 것을 뜻한다. Kotlin 에서는 따로 지정해주지 않으면 기본적으로 모든 Generic Class 는 무공변이다. Java 에서의 와 같다. 공변성(covariant) 자기 자신과 자식 객체를 허용한다. Java 에서의 와 같다. Kotlin 에서는 out 키워드를 사용해서 이를 표시한다. 반공변성(contravariant) 공변성의 반대 - 자기 자신과 부모 객체만 허용한다. Java 에서의 와 같다. Kotlin 에서는 in 키워드를 사용해서 표현한다. 매개변수화 타입은 불공변이다 즉 서로 다른 타입 Type1과 Type2가 있을때 List은 List의 하위 타입도 상위 타입도 아니다 ex) List은.. 2023. 2. 15.
왜 private인 필드가 변하지 않도록 하기 위해 final 키워드를 선언해야 하는가?(by.리플렉션) 접근자 메서드가 없는 final 지시자로 선언한 클래스가 있고 모든 필드가 private 라면 클래스가 변하지 않는다고 생각하는 경향이 있다. 하지만 그렇지 않다. 리플렉션 API 를 이용해서 필드가 보이는지와 상관없이 모든 필드에 접근하고 변경할 수 있다. 또한 final 지시자는 해당 필드가 절대 수정되지 못하도록 JVM 에게 알려준다. 덕분에 외부에서 접근할 수 없게 제대로 설정된 것처럼 보이지만 실제로는 외부에서 접근할 수 있는 방법이 몇 가지 있다. 예를 들어 스프링의 IoC 컨테이너 같은 경우 @Autowired 어노테이션이 선언된 privatate 필드는 컨테이너가 실행 도중 초기화될 때 설정될 수 있다. 아래코드는 리플렉션을 이용해 필드를 변경한 코드이다. @Test void mutateB.. 2023. 2. 14.
메서드 변수에 사용하는 static 키워드 정적 메서드와 정적 변수는 클래스 내부에 정의하지만 인스턴스에 속하지 않는다. 이는 모든 인스턴스에 공통으로 적용되는 사항이므로 대게 특정 인스턴스보다는 클래스 이름을 통해 정적 메서드와 정적 변수에 접근한다. @Test void staticVariableAccess() { assertThat(7).isEqualTo(ExampleClass.EXAMPLE_VALUE); ExampleClass c1 = new ExampleClass(); ExampleClass c2 = new ExampleClass(); c1.EXAMPLE_VALUE = 13; // 가능은 하지만 추천하지 않음. assertThat(13).isEqualTo(ExampleClass.EXAMPLE_VALUE); assertThat(c2.EXAM.. 2023. 2. 14.
final 키워드는 객체 참조에 어떤 영향을 미치는가? 객체를 선언하는 final 키워드는 원시 타입에 선언하는 final 키워드와 동일한 역할을 한다. 변수 정의에서 지정된 값처럼 일단 할당이 되고 나면 메모리 위치가 변경되지 않는다. 원시 타입과 객체의 변수 정의와 메모리 할당은 전혀 다른 형태로 이루어진다. 객체 참조는 변경할 수 없어도 객체 내부의 값들은 개별 값들이 final 이 아니라면 변경할 수 있다. @Test void finalReferenceChanges() { final int i = 42; //i = 43 error final List list = new ArrayList(); //list = new ArrayList(); error assertThat(0).isEqualTo(list.size()); list.add("adding a n.. 2023. 2. 14.
Comparable 과 Comparator 인터페이스의 차이는 무엇인가? 두 인터페이스 모두 public 접근 변경자로 선언하기 때문에 모든 용도로 자료를 담을 수 있다. Comparable 인터페이스는 자연스러운 순서로 정렬할 때 사용하고, Comparator 는 원하는 대로 정렬 순서를 지정하고 싶은 곳에 사용한다. 배열을 정렬할 때는 일반적으로 Array나 Collectio 클래스에 내장된 라이브러리를 이용한다. Array와 Collection 클래스는 몇 가지 오버로딩된 정렬 메서드가 있다.크게 배열을 매개변수로 받는 메서드와 배열을 Comparator 객체를 매개변수로 받는 서드의 두 가지로 분류된다. 그리고 각각의 원시타입 과 참조타입에 관한 객체를 오버로드 한다. Comparator 객체가 없는 구현체는 타입을 자연스런 순서로 정렬한다. @Test void sor.. 2023. 2. 14.
스터디, 온라인스터디, 캠스터디 같이 하실분? 오프라인은 귀찮아서 하루하루 꾸준히 공부해야하는데 모각코 느낌나면서 좋은곳 발견함. 구루미 라는 사이트 인데. 캠스터디 싸이트 이다. 나는 평일은 2-3시간 주말은 6-8시간 공부를 목표로 하고있다. https://gooroomee.com/%EA%BE%B8%EC%A4%80%ED%95%A8%EC%9D%B4-%EC%84%B1%EA%B3%B5%EC%9D%84-%EC%9D%B4%EB%A3%AC%EB%8B%A4# 구루미캠스터디(Gooroomee) 함께해서 재미있는 공부! 구루미캠스터디 gooroomee.com 그냥 자기 공부하고싶은 날 아무때나 와서 캠 켜놓고 그냥 공부하면된다. 개인적으로 해보니깐, 나는 차이가 좀 난다 50% 쯤이랄까, 휴대폰도 잘 안만지고. 타이머 켜서는 공부에만 오로지 집중하려한다. 나에게.. 2023. 2. 14.
[이펙티브자바]item 30.이왕이면 제네릭 메서드로 만들라. 매개변수화 타입을 받는 정적 유틸리티 메서드 한정적 와일드 카드 타입(아이템31)을 사용하여 더 유연하게 개선할 수 있다. 제네릭 싱글턴 팩터리 제네릭은 런타임에 타입 정보가 소거(아이템28)되므로 하나의 객체를 어떤 타입으로든 매개변수화할 수 있다. 재귀적 타입 한정 자기 자신이 들어간 표현식을 사용하여 타입 매개변수의 허용 범위를 한정한다. 2023. 2. 14.
[이펙티브자바]item 29.이왕이면 제네릭 타입으로 만들라. 배열을 사용하는 코드를 제네릭으로 만들때 해결 책 두가지가 있다. 첫번째 방법은 제네릭 배열 대신에 Object 배열을 생성한 뒤에 제네릭 배열로 형변환 하는것. 형변환을 배열 생성시 한 번만 한다. 가독성이 좋다. 힙 오염이 발생할 수 있다(아이템31) 두번째 방법은 elements 필드의 타입을 E[] 에서 Object[]로 바꾸는 것이다. 제네릭 배열 대신에 Object 배열을 사용하고, 배열이 반환한 원소를 E로 형변환 하는것. 원소를 꺼낼때 마다 형변환을 해주어야 한다. 필요에 따라 한정적 타입 매개변수를 이용해서 제약조건을 추가하자. E extends Number> 같은.. 2023. 2. 13.
728x90