Exception 상속하여 throws new하고 예외 객체 직접 생성↪ '왜 발생했어' 에 대한 메시지를 보여주기 위해서, 출력하기 위해서.
사용자는 이를 보고 뭐가 문젠지 알 수 있다.
특정 상황에서만 유용.
🤔 설계도 안에 실제 객체가 있어도 되는 건가요?
↳ 클래스 안에 클래스 = 설계도 안에 세부설계도
: 멤버로써 클래스
"스마트폰의 기본 앱"
: 마치 메소드 내 지역변수.
"조립식 가구를 만들 때 사용하는 임시 공구"
큰 회사가 컨벤션 한 거 가져다 쓰는 경우 많음
"동기화"? : 사용되고 있는 시점이면 기다려 - 멀티스레드에서 중요
그러다보니 속도가 좀 느릴 수 있다
stringbuilder: 동기화 x - 덜 안전, 더 빠름
stringbuffer: 동기화 o - 더 안전, 더 느림
그렇다고 멀티스레드에서 동기화 x 아예 안 쓰는 건 아님 - 때에 따라서
.
object 메소드 중 clone() 역시 주소값이기 때문에 ~해줘야 함
exception의 toString
equalsIgnoreCase() : 종종 사용 : 대소문자 구분 안하고 같니 비교
일반 객체는 불변 객체가 아니라서 append 해주면 값이 변하지만 string은 concat 해줘도 안 바뀐다는~ assign해줘야 한다는~
대체로는 string값을 원하기 때문에 조작은 이 둘로 할 수 있지만 결국 뽑아내려고 함 : 그래서 toString 사용하여 이를 return하도록 구현
문자열 조작을 많이 해야 하면 이 둘을 사용하는 것이 더 효과적일 거다~
string 객체는 계속 만들어지니깐
다행히 println은 내부적으로 stringbuilder 이용
문자열의 변경이 빈번하게 발생할 때
기존의 데이터에 변화를 줄 수 있어 더 효율적
커피 머신 구현해보기?
deprecated: "웬만하면 쓰지마~ 언제 사라질지 몰라~"
물론 이미 사용되기 있기 때문에 진짜로 없애지는 못하겠지만 구버전이라는 뜻
버전이 올라가면서 "컬렉션 프레임워크" : 인터페이스 표준화
초창기에는 신경을 쓰지 못하지만 이런 건 이렇게 만들어주면 좋겠다 해서 추가되는 것들
리팩토링: 더 좋은 코드 만들기
캘린더가 교체하게끔
직접 new GregorianCalendar() 식으로 생성하지는 않는다
필요한 값들은 get() 이용하면 된다
캘린더는 또 필드로 상수인 애들이 많다
또 타입이 다 int임
상수값 이용하면 값 쉽게 얻어낼 수 있다
int값이니 속도가 빠르겠고 사용자에게도 의미가 와닿을 것
api문서 보며 "저 객체는 이렇게 설계했구나" 하고 공부하기
cf. 월 데이터가 1~12가 아니라 0~11로 들어 있어서 항상 +1해서 출력, 값을 넣을 땐 -1
달력 활용해보기~~
import문이 무엇인지를 알아보자
"날짜 객체를 얻어온다"
오늘 날짜를 추상화했다
날짜 객체를 가지고 오늘 정보에 맞는 걸 꺼내온다
원하는 날짜 생성하고 추상화된 인스턴스를 이용하여 또 원하는 정보 얻어오기
"날짜가 추상화되어있다."
나중에 [컬렉션]을 배우게 될텐데(배열처럼 쓰는데
ArrayList list = new ArrayList();
list.add(new String("abc")); // 오브젝트
list.add(new Book("java"));
list.add(new Pen());
int[] iarr = new int[4]; // 숫자 int값만 들어갈 수 있다.
// 배열도 오브젝트 배열로 만들면 여러가지 넣을 수 있긴 함
Object[] objArr = new Object[5];
objArr[0] = "abc";
objArr[1] = new Pen();
ArrayList list2 = new ArrayList();
list2.add("test");
list2.add("abc");
list2.add("book");
// 하지만 이런 경우가 별로 없다,,! 정리를 잘하는 건 타입끼리 모아 넣는 것임
// 단점: 그런데도 Object 타입으로 넣다보면 데이터를 사용하기 위해 매번 형변환을 해줘야 함 : object로는 쓸 수 없기 때문에
((String)list2.get(0)).toUpperCase();
"처음부터 타입이 정해지면 편하겠구나"
↳ 제네릭
ArrayList
.
.
아무거나 담을 수 있는 박스가 있었다. (Box 클래스)
여기다 Pen을 쓰려 하면 형변환 해줘야 함.
public class GenericBox<타입 아무거나> {
I item; // I type 아이템 하나 만듬
// setter getter 추가
public I getItem() {
return item;
}
public void setItem(I item) {
this.item = item;
}
public static void main(String[] args) {
// 생성할 때 타입 바꿔준다.
GenericBox<String> genericBox = new GenericBox<String>();
genericBox.setItem("abc");
// 이건 안됨
// genericBox.setItem(new Pen());
genericBox.getItem().toUpperCase();
컬렉션들이 이 제네릭을 가장 잘 쓰고 있음. (여러개 담고 있으니까?)
같은 박스인데 여기에 컵을 넣으면 컵박스되고 펜넣으면 펜박스가 됨
컬렉션 만들 때 제네릭 같이 만들어주면 이렇게 잘 쓸 수 있다
우리도 우리가 만든 객체에 제네릭 만들어서 설계할 수 있다.
오브젝트 타입일 때.
오브젝트가 빠져나올 테니까 형변환을 해줘야 하는 게 귀찮아서 처음부터 박스 타입을 정해주고 싶은데~ 또 박스에 그럼 펜만 담아야 됨. 그럼 펜 담는 애 컵 담는 애 또 따로 다 만들어줘야 하니까 제네릭 등장: 박스 만들 때 정의 당시 타입을 지정해주지 않는다. 요기에 쓴 것을 요기에 타입처럼 쓰고, 어떤 타입을 넣을지는 안 정해진 박스임
생성할 때 박스의 타입을 정해줘서 생성하는 거임
생성되는 시점에 타입이 다 "스트링"으로 바뀌는 것
또 컵 박스를 만들 수도 있고, 인형 박스를 만들 수도 있다.
자료구조들이 데이터를 담는데 이 때 타입이 중요하니까 많이 쓰는 거임(컬렉션)
메소드 정의할 때도 ~가 들어오게 할 거야~ 하고 제네릭 쓸 수 있다
(ppt 예제 췍)
arraylist는 연속적인 게 아니라 여기저기, "노드"로 존재
시작노드 가리키고
뒷 노드를 가리키고
...
그 방식에는 약간씩 차이가 있음

기본타입을 박싱해주는게 오토박싱 - 컴파일러가
오토언박싱 - 이것도 컴파일러가
integerArrayList.add(1);
실제로 primitive type이 들어간 거 아님, 알아서 넣어 줄거다
코드: 그냥 3을 넣으면 integer로 인식되기 때문에 값이 3인 거 지우고 싶으면
System.out.println(integerArrayList.remove(Integer.valueOf(3)));
배열 이용하고 있던 애들 ArrayList로 바꿔보기