생성자
생성자 : 객체를 생성할 때 호출하는 메서드 비슷한 것 (new 키워드와 함께 호출하는 것, 일반 멤버 변수의 초기화나 객체 생성 시 실행돼야 하는 작업 정리)
생성자 작성 규칙 : 메서드와 비슷하나 리턴 타입이 없고 이름은 클래스 이름과 동일
기본 생성자(default constructor) : 기본 생성자의 형태는 파라미터가 없고 구현부가 비어있는 형태(생성자 코드가 없으면 컴파일러가 기본 생성자 제공)
파라미터가 있는 생성자 : 생성자의 목적이 일반 멤버 변수의 초기화 -> 생성자 호출 시 값을 넘겨줘서 초기화 (주의! 파라미터가 있는 생성자를 만들면 기본 생성자는 추가되지 않는다.)
this : 참조 변수로써 객체 자신을 가리킴(참조 변수를 통해 객체의 멤버에 접근했던 것처럼 this를 이용해 자신의 멤버에 접근 가능)
this의 용도 : 로컬 변수와 멤버 변수의 이름이 동일할 경우 멤버 변수임을 명시적으로 나타냄, 명시적으로 멤버임을 나타낼 경우 사용
this() : 메서드와 마찬가지로 생성자도 오버로딩 가능(객체 생성 시 필요한 멤버변수만 초기화 진행 -> 생성자 별 코드의 중복 발생), 한 생성자에서 다른 생성자를 호출할 때 사용 (반드시 첫 줄에서만 호출이 가능)
자바 예외 종류와 예외처리 방법
예외 처리(exception handling)란 예외 발생 시 프로그램의 비 정상 종료를 막고 정상적인 실행 상태를 유지하는 것(예외의 감지 및 예외 발생 시 동작할 코드 작성 필요)
checked exception - 예외에 대한 대처 코드가 없으면 컴파일이 진행되지 않음
unchecked exception(RuntimeException의 하위 클래스) - 예외에 대한 대처 코드가 없더라도 컴파일은 진행됨
try 블록에서 예외가 발생하면 JVM이 해당 Exception 클래스의 객체 생성 후 던짐(throw new XXException())
던져진 exception을 처리할 수 있는 catch 블록에서 받은 후 처리(적당한 catch 블록을 만나지 못하면 예외처리는 실패)
다중 catch 문장 작성 순서 유의사항
1. JVM이 던진 예외는 catch문장을 찾을 때는 다형성이 적용됨
2. 상위 타입의 예외가 먼저 선언되는 경우 뒤에 등장하는 catch블록은 동작할 기회가 없음(Unreachable catch block for Exception)
3. 상속 관계가 없는 경우는 무관
4. 상속 관계에서는 작은 범위(자식)에서 큰 범위(조상)순으로 정의
자주 나오는 Exception
ArithmeticException : int i = 10 / 0;
NullPointerException : Data d = null; System.out.println(d.toString());
NegativeArraySizeException : array[-1]
ArrayIndexOutOfBoundException : 배열의 범위를 초과했을 경우
Overriding, Overriding
메서드 오버로딩(overloading) : 동일한 기능을 수행하는 메서드의 추가 작성
메서드 오버로딩의 장점 : 기억해야 할 메서드가 감소하고 중복 코드에 대한 효율적 관리 가능
메서드 오버로딩 방법 : 메서드 이름은 동일, 파라미터의 개수 또는 순서, 타입이 달라야 할 것(파라미터가 같으면 중복 선언 오류), 리턴 타입은 의미 없음
메서드 오버라이딩(overriding) : 조상 클래스에 정의된 메서드를 자식 클래스에서 적합하게 수정하는 것
메서드 오버라이딩의 조건 : 1. 메서드 이름이 같아야 한다 2. 매개 변수의 개수, 타입, 순서가 같아야 한다 3. 리턴 타입이 같아야 한다 4. 접근 제한자는 부모보다 범위가 넓거나 같아야 한다 5. 조상보다 더 큰 예외를 던질 수 없다
Singleton 디자인 패턴
외부에서 생성자에 접근 금지 -> 생성자의 접근 제한자를 private로 설정
내부에서는 private에 접근 가능하므로 직접 객체 생성 -> 멤버 변수이므로 private 설정
외부에서 private member에 접근 가능한 getter 생성 -> setter는 불필요
객체 없이 외부에서 접근할 수 있도록 getter와 변수에 static 추가
외부에서는 언제나 getter를 통해서 객체를 참조하므로 하나의 객체 재사용
Serializable
객체 직렬화(Serialization) - 객체를 저장하거나 네트워크로 전송하기 위해 연속적인 데이터로 변환하는 것, 반대의 경우는 역 직렬화(deserialization)
직렬화되기 위한 조건
1. Serializable 인터페이스를 구현할 것
2. 클래스의 모든 멤버가 Serializable 인터페이스를 구현해야 함
3. 직렬화에서 제외하려는 멤버는 transient 선언
serialVersionUID : 클래스의 변경 여부를 파악하기 위한 유일 키
직렬화 할 때의 UID와 역 직렬화 할 때의 UID가 다를 경우 예외 발생
직렬화되는 객체에 UID가 설정되지 않았을 경우 컴파일러가 자동 생성 (멤버 변경으로 인한 컴파일 시마다 변경 -> InvalidClassException 초래)
직렬화되는 객체에 대해 serialVersionUID 설정 권장
Comparable과 Comparator
Comparator의 활용 : 객체가 Comparable을 구현하고 있지 않거나 사용자 정의 알고리즘으로 정렬하려는 경우
java.lang.Comparable<T>
int compareTo(T other)
자신과 인자로 전달받는 타 원소와 비교하여 정수 리턴
음수 결과 : 타 원소가 크다
0 결과 : 둘이 같다
양수 결과 : 자신이 크다
java.util.Comparator<T>
int compare(T o1, T o2)
비교 대상의 두 원소가 아닌 별도의 도우미 역할
두 원소(o1, o2)를 비교하여 정수 리턴
음수 결과 : o2 원소가 크다
0 결과 : 둘이 같다
양수 결과 : o1 원소가 크다
'개발 > Java' 카테고리의 다른 글
[Java] 자바 BufferedWriter를 이용한 int형 출력 (0) | 2021.11.27 |
---|---|
[Java] 자바 가상 머신 JVM(Java Virtual Machine)이란? (0) | 2021.11.01 |
[Java] 자바 컬렉션 시간복잡도 (Collection Time Complexity) (0) | 2021.10.30 |
[Java] 자바 String, StringBuffer, StringBuilder 차이 (0) | 2021.10.24 |