목록Languages (11)
공부하는 스누피
람다란? 람다식(또는 람다)은 추상 메서드를 하나만 가진 인터페이스의 인스턴스이다. 자바 8부터 등장했으며, 기존 익명 클래스와 비슷한 역할(함수형 프로그래밍)을 하지만 훨씬 간결하다. // 익명 클래스 Collection.sort(arr, new Comparator(){ ... }); // 람다식 Collection.sort(arr, (o1, o2)->{...}); 익명클래스 vs 람다 람다 익명 클래스 인스턴스에 접근할 수 있는가? X O this 키워드 바깥 인스턴스 익명클래스 인스턴스 자신 => 따라서 익명 클래스는 함수형 인터페이스가 아닌 타입의 인스턴스를 만들 때 사용하는 것이 좋다. 주의할 점 타입을 쓰지 않았을 때 IDE에서 에러가 났을 때를 제외하고, 람다의 모든 매개변수 타입은 생략한다..
와일드 카드 와일드 카드는 제네릭 코드에서 물음표(?)로 표기되어 있는 것을 말하며, 아직 알려지지 않은 타입을 나타냅니다. 1) Bounded Wildcards (한정적 와일드카드) Upper Bounded Wildcards (extends를 사용한 한정적 와일드카드) : 타입의 제한을 풀어줄 때 사용합니다. 제네릭 타입들을 상위 제네릭 타입으로 묶어주는 것이라고 할 수 있습니다. public static void process(List)에서는 List이나 List 등 모든 타입이 List의 하위 타입이기 때문에 어떤 타입의 List라도 타입을 보존한 채 출력할 수 있습니다. 단, Object에는 Object의 하위 타입을 넣을 수 있지만 List에는 null만 넣을 수 있습니다. List에 어떤 타입..
멤버 클래스(member class) / 중첩 클래스(nested class) 다른 클래스 안에 정의된 클래스. 자신을 감싼 outer class에서만 쓰여야 하고, 그 외에 쓰임새가 있다면 top-level 클래스로 만들어야 한다. (클래스 파일 하나 더 만들란 얘기다.) 종류: static 멤버 클래스, non-static 멤버 클래스, 익명 클래스, 지역 클래스 static 멤버 클래스를 제외한 나머지는 다 inner class에 해당한다. 정적 멤버 클래스 (static member class) 다른 클래스 안에 선언되고, outer 클래스의 private 멤버에도 접근할 수 있다. 바깥 인스턴스와 독립적으로 존재할 수 있다. 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 정적 멤버 클래스로..
equals 메서드는 Object 클래스에 정의되었지만, 객체 인스턴스 간 논리적 동치를 확인하기 위해 종종 재정의된다. 이 메서드를 재정의한다면 반드시 hashCode 메서드도 재정의해야 한다. hash를 사용하지 않는 클래스라도 Hash 기반의 자료구조의 요소일 경우 hashCode를 사용하게 되기 때문이다. Object 클래스에서는 equals 메서드를 단순 주소값 비교로만 사용한다. ==와 같은 역할을 한다고 보면 된다. Object를 상속받은 String같은 클래스의 경우 부모 클래스의 equals 메서드를 그대로 쓸 수는 없다. "hi"와 "hi"가 논리적으로는 같은 문자열인데 다른 String 인스턴스 변수에 들어 있으면 주소값을 비교해 다른 객체라는 결과가 나와버린다. 그래서 String뿐..
싱글턴이란? 싱글턴(Singleton)은 디자인 패턴 중 생성 패턴으로, 해당 클래스에서 생성되는 인스턴스가 단 하나임을 보장한다. 클래스에서 인스턴스가 하나임이 보장되면 인스턴스를 쉽게 통제할 수 있으며, 재사용이 쉽다. 하지만 mock이 불가능해 클라이언트를 테스트하기 어려워진다는 단점이 있다. mock은 인스턴스를 여러 개 만들 수 있어야 가능하기 때문이다. 예를 들어, 무상태 객체(stateless object)나 시스템 컴포넌트에서 싱글턴 패턴을 사용한다. 싱글턴 만드는 방식 싱글턴 만드는 방식은 크게 두 가지가 있으나 둘 다 생성자를 private으로 숨긴다. private Contructor(){ ... 생성자를 숨긴다 ... } 1) public static final 멤버 변수에 인스턴스..
정적 팩터리 메서드란? 팩터리 메서드는 디자인 패턴 중 생성 패턴의 한 종류로, 생성자로 직접 객체 인스턴스를 생성하는 대신 메서드가 객체를 생성해 반환값으로 넘긴다. 클라이언트는 팩터리가 건네주는 객체가 원하는 클래스의 하위 클래스이기만 한다면 어느 클래스의 인스턴스인지 알 필요가 없게 한다. 장점 1. 생성자보다 더 구체적인 이름을 가질 수 있다. => 메서드 호출 시 직관적으로 기능을 짐작할 수 있다. 2. 메서드가 호출될 때마다 인스턴스를 생성하지 않아도 된다. => 생성자는 호출될 때마다 인스턴스를 생성해서 인스턴스를 재활용하기 어려울 뿐더러 불변 클래스에 적용할 수 없다. => 이 특징은 싱글톤을 구현할 때 적용된다. 한 싱글톤 클래스당 하나의 인스턴스만을 보장하기 때문이다. => 인스턴스를 ..
Encapsulation Class 안에 데이터와 기능을 담아 정의하고, 필요한 기능만 공개한다. 이때 중요한 데이터는 Access Modifier로 숨길 수 있다. public한 데이터를 최소화시키면 캡슐화가 잘 되어 있다고 할 수 있다. Inheritance 기존에 존재하는 객체의 속성과 기능을 상속받아 새로운 객체를 정의하는 것. 이를 통해 클래스를 재사용할 수 있다. Polymorphism 같은 타입 또는 같은 기능을 호출해서 다양한 효과를 가져오는 것을 의미한다. 대표적으로 overriding과 overloading을 예로 들 수 있는데, overriding은 같은 기능을 재정의 해서 클래스에 따라 다양한 효과를 가져올 수 있게 하였고, overloading은 같은 이름의 메서드에 파라미터에 따..
자바에서 문자열은 String 객체를 클래스로 명시해야 한다. 정수나 실수, 그리고 문자(char)도 primitive type에 포함되는데 왜 문자열은 primitive type에 포함되지 않는지부터 알아보자. 자바에서 primitive type은 공간을 효율적으로 쓰게 해 준다. 데이터 타입별로 값의 크기가 일정하기 때문이다. int형은 -2^32 ~ 2^32-1의 범위 안에서만 표현 가능하고, char형은 16비트에서만 표현할 수 있게 정해 둔다. 이렇게 값의 크기에 제한을 두면 메모리 상에 저장할 공간을 지정할 때 훨씬 쉬워진다. 더 이상 값의 크기가 변경되지 않으니 Stack 영역에 벽돌처럼 차곡차곡 쌓을 수 있을 것이다 (데이터를 효율적으로 보관할 수 있다). 하지만 크기가 변화무쌍한 데이터 ..