혼공단 10기 - 자바

[혼공자] 3주차

아놀드금자 2023. 7. 23. 22:22
728x90

 

3주차 진도는 챕터10 ~ 11 

헉 벌써;;;

 


chpater 10. 예외처리 443p

 

10-1 예외 클래스

Exception(예외): 사람의 잘못된 조작 or 잘못된 코딩으로 발생하는 프로그램 오류

exception handling(예외처리)를 통해 정상실행상태를 유지하도록 함

 

 

😀 예외와 예외 클래스

자바는 예외를 클래스로 관리함. 모든 예외 클래스는 java.lang.Exception 클래스를 상속

일반 예외 (Exception) 실행 예외 (Runtime Exception)
컴파일러 체크 예외 컴파일러 넌 체크 예외
컴파일 과정에서 예외처리코드가 있는지 검사 실행 시 갑자기 발생하기 때문에 컴파일에서 검사X
java.lang.Exception 클래스 상속 java.lang.Exception 클래스 > RuntimeException 클래스 상속

 

 

😓 실행 예외

런타임예외는 자바 컴파일러가 체크하지 않기 때문에 개발자의 경험에 의해 예외처리코드 작성 필요

NullPointerExeption 객체가 없는데 객체를 사용하려 해서 예외가 발생
null 값을 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때
ArrayIndexOutOfBoundsException 배열에서 인덱스 범위를 초과할 경우 발생
NumberFormatException 숫자로 변환될 수 없는 문자 포함시 발생
ex) Interger.ParseInt(String s) 사용 시
ClassCastException 타입변환(casting)은 상위클래스-하위클래스 or 구현클래스-인터페이스 간 발생
이 밖의 경우 다른 타입으로 변환 불가능 -> ClassCastException
예방법: 타입 변환 전에 instanceof 연산자로 변환가능여부 확인

 

 

10-2 예외 처리

 

🤩 예외 처리 코드

try-catch-finally 블록

try{
	//예외발생가능코드
	//예외 발생시 멈추고 catch로 이동
    
} catch(예외클래스 e){
	//예외처리(예외발생시에만)
    
} finally {
	//항상실행, finally 블록은 없어도 됨
}

 

 

🥱 예외 종류에 따른 처리 코드 -> 다중catch

다양한 예외에 대해 각각 다른 처리방법

...
} catch(ArrayIndexOutOfBoundsException e){
	예외처리1
} catch(NumberFormatException e){
	예외처리2
}

 

다중catch의 주의점!

*하위 클래스 먼저 쓰기*

이유: 예외 발생 시 예외를 처리할 catch블록은 위에서부터 차례로 검색되기 때문

ex) (ArrayIndexOutOfBoundsException e)  그 다음 (Exception e) 사용

 

 

😏 예외 떠넘기기 - throws

throws는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘김

리턴타입 메소드이름(매개변수, ) throws 예외클래스1, 예외클래스2... {
}

리턴타입 메소드이름(매개변수, ) throws Exception {
}

 


Chapter 11. 기본 API 클래스 466p

 

11-1 java.lang 패키지

java.lang 패키지의 클래스와 인터페이스는 import 없이 사용 가능

 

자바 API 도큐먼트 - 자바 11버전

https://docs.oracle.com/en/java/javase/11/docs/api/index.html?overview-summary.html 

 

Overview (Java SE 11 & JDK 11 )

This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP

docs.oracle.com

 

 

🧡 Object 클래스 - 최상위 부모 클래스

자바의 모든 클래스는 Object 클래스의 자식이거나 자손클래스임

 

equals()

객체비교 매개타입 object -> 모든 객체가 매개값이 될 수 있음

비교하는 두 객체가 같은 타입인지 확인 필요(instanceof 활용)

ex) String 객체 비교시 번지비교X, 문자열비교O

-> String 클래스가 Object의 equals() 메소드를 재정의(오버라이딩) 했기 때문

 

hashCode()

객체를 식별하는 하나의 정수값, 메모리 번지를 이용하여 해시코드를 만든다

논리적 동등비교 시 hashCode() 오버라이딩 필요

 

toString()

객체를 문자열로 표현한 값 리턴

클래스이름@16진수해시코드

 

 

 

💜 System 클래스 - 운영체제의 일부 기능 이용가능

system 클래스의 모든 필드와 메소드는 정적필드와 정적메소드

 

exit()

프로그램 강제종료,  종료상태값은 일반적으로 0

System.exit(0);

 

currentTimeMillis(), nanoTime() 

현재시각 밀리세컨드, 나노세컨드 단위 long값 리턴

주로 실행소요시간 측정에 사용

 

 

 

💛 Class 클래스

getClass(), forName() - Class 객체 얻기

//클래스로부터 얻는 방법 -1
Class clazz = 클래스이름.class;

//클래스로부터 얻는 방법 -2
Class clazz = Class.forName("패키지.클래스이름");

//객체로부터 얻는 방법
Class clazz = 참조변수.getClass();

 

리소스 절대 경로 얻기

String path01 = clazz.getResource("photo1.jpg").getPath();

 

 

💚 String 클래스

String 생성자

//배열 전체를 String 객체로 생성
String str = new String(byte[] bytes);

//지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, String charsetName);

//배열의 offset 인덱스 위치부터 length만큼 String 객체로 생성
String str = new String(byte[] bytes, int offset, int length);

//지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, int offset, int length, String charsetName);

 

String 메소드

리턴타입 메소드이름(매개변수) 설명
char charAt() 특정 위치의 문자 리턴
byte[] getBytes() byte[]로 리턴
int indexOf(s) 문자열 내에서 s의 위치를 리턴
String replace(aa,bb) aa 부분을 bb로 바꿈
String substring(0,3) index 0~2 잘라낸 문자열 리턴
String toLowerCase() 소문자로 변환
String trim() 앞뒤 공백을 제거
String valueOf(int i) 기본 타입 값을 문자열로 리턴

 

 

 

💙 Wrapper(포장) 클래스

Boxing: 기본타입 값 -> 포장객체로 만들기 Integer.valueOf()

Unboxing: 포장객체 -> 기본타입 값 .intValue()

 

자동박싱: 포장 클래스 타입에 기본값이 대입될 경우

//int 타입 값을 Integer 클래스 변수에 대입
Integer obj = 100;

 

자동언박싱: 기본 타입에 포장 객체가 대입되는 경우, 연산

//Integer 객체를 int 타입 변수에 대입하거나
//Integer 객체와 int 값을 연산하는 경우
Integer obj = new Integer(200);
int value = obj;
int value = obj + 100;

 

문자열을 기본 타입 값으로 변환

int num = Integer.parseInt("1000");

 

포장 값 비교

포장 객체는 ==, != 연산자 사용 지양

이유: ==, != 연산자는 내부의 값 비교X, 포장 객체의 참조를 비교O

비교하려면... 직접 내부 값을 언박싱 하거나 equals() 메소드 사용

 

 

 

🖤 Math 클래스

int abs(-3) 절대값
double ceil(5.3) 올림값
double floor(5.3) 버림값
int max(12, 3) 최대값
double random() 랜덤값
double rint(2.1) 가까운 정수의 실수값
long round(3.6) 반올림값

 

 

11-2 java.util 패키지

 

🍉 Date 클래스

Date now = new Date();
String strNow1 = now.toString();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 mm분 ss초");
String strNow2 = sdf.format(now);

 

🍊 Calendar 클래스

추상클래스라서 new 연산자로 인스턴스 생성불가

Calendar now = Calendar.getInstance();

int year = now.get(Calendar.YEAR);
String week = now.get(Calendar.DAY_OF_WEEK);

 


필수과제 - 혼공 용어 노트에 용어 추가 등 노트 활용하고 공유하기 

 

 

선택과제 - p.512 문제 8번 풀고 풀이 과정 설명하기

Integer obj1 = 100;
Integer obj2 = 100;
Integer obj3 = 300;
Integer obj4 = 300;

System.out.println(obj1 == obj2);
System.out.println(obj3 == obj4);

// 실행결과 
// true
// false

포장객체에서 == 는 내부의 값을 비교하지 않고 포장객체의 참조를 비교함

바로 비교가능한 int 타입 값의 범위는 -128 ~ 127 이기 때문에 

위 코드에서 범위 내의 값(100)은 true, 초과값(300)은  false가 나옴

 

 

 

728x90