[ 5 ] 클래스와 객체 1
생성자의 역할 : 클래스를 만들 때 멤버 변수나 상수를 초기화 함
자바 컴파일러는 생성자가 하나도 없는 경우에만 디폴트 생성자를 제공
클래스에서 일부러 디폴트 생성자를 제공하지 않기도 한다.
매개변수가 있는 생성자를 사용하면 코드가 간결하고 사용하기도 편리함
기본 자료형을 사용하듯이 클래스 자료형 변수를 선언해서 사용하면 편리함
정보 은닉 : 클래스 내부에서 사용할 변수나 메서드를 private 으로 선언에서 외부의 접근을 막는 것
[ 6 ] 클래스와 객체 2
this를 사용하여 생성자를 호출하는 코드 이전에 다른 코드를 넣을 수 없다. ->클래스 생성이 완료되지 않은 시점일 수 있음
클래스내에서 this를 사용하면 자신의 주소 값을 반환할 수 있다.
static 변수는 프로그램이 실행되어 메모리에 올라갔을 때 딱 한 번 메모리 공간이 할당된다. -> 모든 인스턴스가 공유
클래스 메서드와 클래스 변수는 인스턴스가 생성되지 않아도 사용할 수 있다.
인스턴스는 클래스에 메모리를 차지한 상태를 의미함
클래스 매서드 내부에서 지역 변수와 클래스 변수는 사용할 수 있지만, 인스턴스 변수는 사용 불가
지역 변수가 생성되는 메모리를 스택이라고 한다.
지역 변수 : 스택 / 멤버 변수 : 힙 / static 변수 : 데이터 영역
싱글톤 패턴에서는 생성자를 반드시 명시적으로 만들고 그 접근 제어자를 private으로 지정해야 한다.
[ 7 ] 배열과 ArrayList
System.arraycopy() 메서드를 통해 배열을 복사할 수 있다.
주소 값만 복사하는 것은 얕은 복사
[ 8 ] 상속과 다형성
상위 클래스에 작성한 변수나 메서드 중 하위 클래스에서 사용할 수 있도록 한 예약어는 protected 이다.
상위 클래스를 상속받은 하위 클래스가 생성될 때는 반드시 생위 클래스의 생성자가 먼저 호출된다.
상위 클래스의 주소를 가지고 있는 예약어가 super이다.
상속에서 상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정됌.
클래스를 생성하여 인스턴스가 만들어지면 멤버 변수는 힙 메모리에 위치한다.
메서드는 인스턴스가 달라도 같은 로직을 수행한다.
자바의 모든 메서드는 가상 메서드이다.
가상 메서드는 상속하는 클래스 내에서 같은 시그니처의 함수로 오버라이딩 될 수 있는 함수 또는 메소드이다.
상속은 IS-A 관계에서 사용하는 게 효율적이다.
HAS-A 관계에서는 멤버 변수로 사용하는 게 효율적이다.
상속은 "일반적인 클래스"와 "구체적인 클래스"의 관계에서 구현하는 게 효율적이다.
자바는 다중 상속을 지원하지 않는다.
상위 클래스로 형 변환된 인스턴스의 원래 자료형을 확인하는 예약어가 instanceof 이다.
[ 9 ] 추상 클래스
자바에서 추상 메서드는 abstract 예약어를 사용하여 선언만 하는 메서드이다.
추상 클래스를 상속받은 클래스는 추상 클래스가 가진 메소드를 상속받는다.
추상 클래스를 상속받은 클래스는 구현되지 않은 추상 메서드를 모두 구현해야 구체적인 클래스가 된다.
추상 클래스는 인스턴스로 생성할 수 없다. 모든 메서드가 구현되지 않았기 때문이다.
추상 클래스에서 구현하는 메서드는 하위 클래스에서도 구현 내용을 공유할 메서드를 구현한다.
탬플릿 메서드의 역할은 메서드 실행 순서와 시나리오를 정의하는 것이다.
탬플릿 메서드는 final 예약어를 사용해서 선언해야 한다.
여러 파일에서 공유해야 하는 상수 값은 public static final로 선언하는 게 효율적이다.
[ 10 ] 인터페이스
인터페이스는 추상 메서드와 상수로만 이루어져 있다.
인터페이스 변수와 메서드는 컴파일 시 모두 상수와 추상 메서드로 자동 변환된다.
자바 8부터 인터페이스의 활용성을 위해 디폴트 메서드와 정적 메서드 기능을 제공한다.
자바 9부터 인터페이스에 private 메서드를 구현할 수 있다.
private 메서드는 인터페이스를 구현한 클래스에서 사용 및 재정의가 불가능하다.
인터페이스는 한 클래스가 여러 인터페이스를 구현할 수 있다.
인터페이스 간에도 상속이 가능하고 여러 개를 동시에 상속받을 수 있다.
[ 11 ] 기본 클래스
Object는 최상위 클래스이고 컴파일 과정에서 extends Object가 자동으로 쓰인다.
자바에서는 인스턴스를 힙 메모리에 생성하여 관리할 때 해시 알고리즘을 사용한다.
프로그램에서 사용되는 상수값을 저장하는 공간을 "상수 풀" 이라고 한다.
모르는 클래스의 정보를 사용할 경우에 Class 클래스를 활용한다.
Class 클래스를 사용하면 더 복잡하고 예외 처리도 해야한다. 코드가 복잡해지고 속도도 느려진다.
[ 12 ] 컬렉션 프레임워크
어떤 값이 하나의 참조 자료형이 아닌 여러 참조형을 사용할 수 있도록 하는 프로그래밍은 제네릭 프로그래밍이다.
제네릭 프로그램은 참조 자료형이 변환될 때 검증을 컴파일러가 하기에 안정적이다.
제네릭에서는 여러 참조 자료형을 사용하는 부분을 Object가 아닌 하나의 문자로 표현한다.
static 변수의 자료형이나 static 메서드 내부 변수의 자료형으로 T를 사용할 수 없다. -> 인스턴스 생성이 필요하기 때문
컬렉션 프레임워크의 전체 구조는 Collection 인터페이스와 Map 인터페이스 기반으로 이루어져 있다.
멀티스레드 환경이 아닌 경우에는 ArrayList 사용이 권장된다.
Vector의 모든 메서드는 호출될 때 마다 잠금과 해제가 일어나서 수행 속도가 느리다.
링크드 리스트의 각 요소는 요소의 자료와 다음 요소의 주소를 저장하는 부분으로 구현된다.
사용하는 자료의 변동이 많은 경우에는 링크드 리스트, 그렇지 않은 경우는 배열을 사용하는 것이 효과적이다.
순서가 없는 Set 인터페이스 경우 Iterator를 사용한다.
HashSet은 중복을 허용하지 않고, 순서와 상관없이 출력된다.
Tree로 시작하는 클래스는 결과 출력 시 결과 값이 정렬된다.
Comparable, Comparator 인터페이스는 특정 기준을 통해 정렬 할 수 있도록 해주는 인터페이스이다.
멀티스레드 환경이 아니라면 HashTable 보다는 HashMap을 사용하는 것이 낫다.
[ 13 ] 내부 클래스, 람다식, 스트림
내부 클래스 사용 이유 : 외부 클래스와 밀접한 관계 + 그 밖의 다른 클래스와 협력 관계가 없음
인스턴스 내부 클래스에 정적 변수 선언이 불가능하다.
람다식은 함수 이름이 없는 익명 함수를 만드는 것이다.
람다식 문법에서는 매개변수 자료형을 생략할 수 있고 매개변수가 한개인 경우에는 괄호도 생략할 수 있다.
람다식은 한개의 메서드만 선언할 수 있다. -> @FunctionalInterface 어노테이션 사용 하기도 함
여러 자료의 처리에 대한 기능을 구현해 놓은 클래스가 스트림
스트림의 단계 : 스트림 생성 -> 중간 연산 -> 최종 연산
중간 연산 : filter, map / 최종 연산 : forEach, count ,sum, reduce
한 번 생성하고 사용한 스트림은 재사용할 수 없다.
스트림의 reduce(초기값, 수행 할 연산)
[ 14 ] 예외 처리
Throwable 클래스에는 Error와 Exception 두 가지가 있다.