내부 클래스 inner class
내부클래스의 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
-> B는 객체생성 없이 A의 멤버를 사용가능
- 코드의 복잡성을 줄일 수 있다.(캡슐화)
-> 내부클래스에 있는 클래스(B)의 외부접근(C)에 제한이 생긴다.
- 내부 클래스의 종류와 유효범위(scope)는 변수와 동일class A { //외부클래스 ... class B { //내부클래스 ... //B에서는 객체생성 없이도 A의 멤버 접근가능 } }
내부 클래스의 제어자와 접근성
- 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일
- 내부 클래스에서는 외부 클래스의 private멤버도 접근가능하다.
- static클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없다.
- 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다.
private int outerIv = 0;
static int outerCv = 0;
class InstanceInner {
int iiv = outerIv;
int iiv2 = outerCv;
static class StaticInner {
//static 클래스는 외부 클래스의 인스턴스 멤버에 접근x
//int siv = outerIv;
static int scv = outerCv;
}
void Method() {
int lv = 0;
final int LV = 0; //JDK1.8부터 final 생략 가능
class LocalInner {
int lv = outerIv;
int liv2 = outerCv;
//외부 클래스의 지역변수는 fanal이 붙은 변수(상수)만 접근 가능하다.
//int liv3 = lv;
int liv4 = LV
}
}
}
new 조상클래스 이름() {
//멤버 선언
}
new 구현 인터페이스 이름() {
//멤버 선언
}
Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (Exception2 e2) {
// Exception2가 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (ExceptionN eN) {
// ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
}
printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
checked 예외 : 컴파일러가 예외 처리 여부를 체크(예외 처리 필수)
unchecked 예외 : 컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택)
메서드에 예외 선언하기
- 예외를 처리하는 방법 : try-catch문, 예외 선언하기, 은폐하기
- 메서드 호출시 발생가능한 예외를 호출하는 쪽에 알리는것
finally 블럭
- 예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (Exception2 e2) {
// Exception2가 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} finally {
// 예외의 발생여부에 관계없이 항상 수행되어야하는 문장들을 넣는다.
// finally 블럭은 try-catch문의 맨 마지막에 위치해야한다.
}
class MyException extends Exception {
MyException(String msg) {
super(msg);
}
}
예외 되던지기 exception re-throwing
- 예외를 처리한 후에 다시 예외를 발생시키는 것
- 호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것
연결된 예외 chained exception
- 한 예외가 다른 예외를 발생시킬 수 있다.
- 예외 A가 예외 B를 발생시키면 A는 B의 원인 예외
-> 어떤 예외를 다른 예외로 감싸는 것
-> 세부적인 예외를 포괄적인 예외로 감쌀 때 사용
-> checked 예외를 unchecked예외로 변경하려 할 때
Object클래스
- 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.
- notify(), wait() 등은 쓰레드와 관련된 메서드이다.
equals (Object obj)
- 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false.
equals (Object obj)의 오버라이딩
- 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩 해야한다.
class Person {
long id;
public boolean equals(Object obj) {
if(obj instanceof Person)
return id == ((Person)obj).id;
else {
return false;
}
Person(long id) {
this.id = id;
}
}
}
hashCode()
- 객체의 해시코드(hash code)를 반환하는 메서드
- Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
- equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 한다.
-->equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문
toString(), toString()의 오버라이딩
- toString() : 객체를 문자열(String)으로 변환하기 위한 메서드
⛔ 9-4~6 hashCode(), toString()예제 다시 ⛔
String 클래스
- String클래스 = 데이터(char[]) + 메서드(문자열 관련)
- 내용을 변경할 수 없는 불변(immutable) 클래스
- 덧셈 연산자(+)를 이용한 문자열 결합은 성능이 떨어짐.
--> 문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용
문자열의 비교
- String str = "abc"와 String str = new String("abc");의 비교
String str1 = "abc"; //문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc"; //문자열 리터럴 "abc"의 주소가 str2에 저장됨
String str3 = new String("abc"); //새로운 String 인스턴스를 생성
String str4 = new String("abc"); ////새로운 String 인스턴스를 생성
문자열 리터럴
- 문자열 리터럴은 프로그램 실행시 자동으로 생성된다.(constant pool에 저장)
- 같은 내용의 문자열 리터럴은 하나만 만들어진다.
빈 문자열("", empty string)
- 내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열
- 크기가 0인 배열을 생성하는 것은 어느 타입이나 가능
String str = ""; //str을 빈 문자열로 초기화
char[] chArr = new char[0]; //길이가 0인 char배열
int[] iArr = {}; //길이가 0인 int배열
String 생성자
⛔ String 클래스의 생성자와 메서드 훑기 ⛔
join()
- 여러 문자열 사이에 구분자를 넣어서 결합한다.
String animals = "dog, cat, bear";
String[] arr = animals.split(","); //문자열을 ','로 나눠서 배열에 저장
String str = String.join("-", arr); //배열의 문자열을 '-'로 구분해서 결합
System.out.println(str); 'dog-cat-bear'
⛔ StringBuffer 클래스의 생성자와 메서드 훑기 ⛔
StringBuilder(StringBuffer와 매우 유사)
- StringBuffer는 동기화 되어있다. 멀티 쓰레드에 안전
- 멀티쓰레드 프로그램이 아닌 경우, 동기하는 불필요한 성능저하
-->StringBuffer대신 StrinfBuilder를 사용하면 성능 향상
Math 클래스
- 수학 관련 static 메서드의 집합
- 반올림 방법 : round(), rint(), even()
래퍼wrapper 클래스
- 8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스
Number 클래스
- 모든 숫자 래퍼 클래스의 조상
문자열을 숫자로 변환하기
int a = new Integer("100").intValue();
int b = Integer.parseInt("100");
int c = Integer.valueOf("100");
int --(autoboxing)--> Integer
Integer --(unboxing)--> intint i = 5; Integer iObj = new Integer(7); int sum = i + iObj; //error. JDK1.5이전에는 불가
Calendar cal = Calendar.getInstance(); //현재 날짜와 시간으로 셋팅됨
int thisYear = cal.get(Calendar.YEAR); //올해가 몇년인지 알아낸다.
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); //이 달의 마지막 날- add()는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향o)Calendar date = Calendar.getInstance();
date.clear(); //모든 필드를 초기화
date.set(2020, 7, 31); //2020년 8월 31일로 설정
date.add(Caalendar.DATE, 1); //날짜(DATE)에 1을 더한다 -> 9월1일
date.add(Calendar.MONTH, -8); //월(MONTH)에서 8을 뺀다 -> 2019년 1월1일- roll()은 특정필드의 값을 증가 또는 감소(다른 필드에 영향x)date.set(2020, 7, 31); //2020년 8월 31일로 설정
// add()와 달리 roll()은 다른 필드에 영향을 미치지 않는다.
date.roll(Calendar.DATE, 1); //날짜(DATE)에 1을 더한다 -> 8월1일
date.roll(Calendar.MONTH, -8); //월(MONTH)에서 8을 뺀다 -> 2020년 1월1일