독학/자바

[혼공학습단 10기] 자바 week3

최연재 2023. 7. 19. 16:35

미션

기본미션 : 혼공 용어 노트에 용어 추가 등 노트 활용하고 공유하기

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

해당 코드는 박싱한 객체의 내부값을 비교하려는 코드이다. 하지만 == 연산자는 내부의 값이 아닌 포장 객체의 참조를 비교한다. 박싱된 값이 -128~127 범위라면 ==로 바로 내부값을 비교할 수 있기 때문에 obj1 == obj2는 내부의 값을 바로 비교해서 true가 나온다.하지만 300은 해당 범위에 속하지 않기 때문에 obj3==obj4의 결과로 false가 나온다.  


Chapter 10 예외 처리

1. 예외 클래스

📌 예외와 예외 클래스

- 예외

  • 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류
  • 예외 처리를 통해 정상 실행 상태가 유지되도록 할 수 있다.
  • 예외의 종류 : 일반 예외와 실행 예외
  • 자바에서 예외를 클래스로 관리함. 

- 일반 예외 (컴파일러 체크 예외)

  • 프로그램 실행 시 예외가 발생할 가능성이 높아서 컴파일 과정에서 해당 예외 처리 코드가 있는지 검사 
  • 예외 처리 코드가 없다면 컴파일 오류
  • RuntimeException의 하위 클래스가 아니면 일반 예외 클래스

- 실행 예외 (컴파일러 넌 체크 예외)

  • 실행 시 예측할 수 없이 갑자기 발생 -> 컴파일 과정에서 예외 처리 코드 유무 검사 x
  • RuntimeException의 하위 클래스이면 실행 예외 클래스

 

📌실행 예외

- NullPointerException : 객체가 없는 상태에서 객체를 사용했을 때

- ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과했을 때

- NumberFormatException : 숫자로 변환될 수 없는 문자가 포함되어 있는 문자열을 숫자로 변환하려고 할 때

- ClassCastException : 상위 클래스&하위 클래스, 구현클래스&인터페이스 관계가 아닌 클래스를 다른 타입으로 변환하려고 할 때

 

2. 예외 처리

📌 예외 처리 코드

- try-catch-finally 블록

try {
	// 예외 발생 가능 코드
} catch (예외클래스 e) {
	// 예외 처리
} finally {
	// 항상 실행되는 코드
}
  • try 블록에는 예외 발생 가능 코드가 위치
  • try 블록의 코드에서 에러가 발생하면 catch 블록으로 바로 이동하여 예외 처리 코드를 실행
  • finally 블록은 생략 가능하며, 예외 발생 가능 여부와 상관없이 실행됨. try, catch 블록에서 return 문을 쓰더라도 항상 실행됨

 

📌 예외 종류에 따른 처리 코드

- 다중 catch : try 블록 내에서 발생할 수 있는 예외별로 예외 처리 코드를 작성

- catch 순서

  • 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다.
  • catch문은 위에서부터 검색됨
  • 상위 예외 클래스가 하위 예외 클래스 위에 있다면 하위 예외는 상위 예외를 상속하기 때문에 상위 예외 타입도 될수 있음.

 

📌 예외 떠넘기기

- try-catch문으로 예외를 처리하지 않고 매소드를 호출한 곳으로 예외를 떠넘길 수 있음.

- throws 키워드

리턴타입 메소드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
}
리턴타입 메소드명(매개벼수, ...) throws Exception {
}
  • 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘김.
  • throws 키워드가 붙어있는 메소드는 반드시 try 블록 내에서 호출되어야 하고, 예외를 처리해야 함.

 

 

 


Chapter 11 기본 API 클래스

1. java.lang 패키지

📍API

  • API : Application Programming Interface, 라이브러리라고 부르기도 함
  • 프로그램 개발에 자주 사용되는 클래스 및 인터페이스

 

📌 자바 API 도큐먼트

- 우리가 원하는 API를 쉽게 찾아 이용할 수 있도록 도와주는 HTML 페이지

 

📌 Object 클래스

- 자바의 모든 클래스는 Object 클래스의 자식이거나 자손클래스 (암시적으로 상속하게 됨)

- Object는 자바의 최상위 부모 클래스

- 객체 비교 : equals()

Object obj1 = new Object();
Object obj2 = new Object();

boolean result = obj1.equals(obj2);
  • 두 객체를 동등 비교
  • 논리적으로 동등할 때(==객체가 저장하고 있는 데이터가 같음) true, 동등하지 않을 때 false를 반환
  • 보통 직접 사용되지 않고 하위 클래스에서 재정의해서 사용 
  • equals()를 재정의할 때는 매개값이기준 객체와 동일한타입의 객체인지 먼저 확인해야함. 

- 객체 해시코드 : hashCode()

  • 객체의 메모리 번지를이용해서 해시코드를 만듦 -> 객체마다 다른 값
  • 논리적 동등비교 시 오버라이딩할 필요가 있음.

- 객체 문자 정보 : toString()

  • 객체의 문자 정보를 리턴
  • 객체의 문자 정보 : '클래스명@16진수해시코드'

 

📌 System 클래스

: 운영체제의 일부 기능을 이용할 수 있음.

- 프로그램 종료 : exit()

System.exit(0);
  • 강제적으로 JVM 종료
  • 종료 상태값이 0이면 정상 종료

- 현재 시간 읽기

long time = System.currentTimeMillis(); // 밀리세컨드 단위
long time = System.nanoTime(); // 나노세컨드 단위

 

📌 Class 클래스

- Class 객체 얻기 : 클래스로부터 얻거나 객체로부터 얻기

// 클래스로부터 얻기
Class clazz = 클래스명.class;
Class clazz = Class.forName("패키지...클래스명")

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

- 클래스 경로를 활용해서 리소스 절대 경로 얻기 : 클래스를 기준으로 한 상대경로 이용

String srcPath = clazz.getResource("상대경로").getPath();

 

📌 String 클래스

- String 생성자

  • 자바의 문자열은 java.lang 패키지의 String 클래스의 인스턴스로 관리됨
  • 파일의 내용을 읽거나 네트워크를 통해 받은 데이터는보통 byte[] 배열이기 때문에 이를 문자열로 변환
// 배열 전체를 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 메소드

  • charAt() : 매개값으로 주어진 인덱스의 문자를 리턴
  • equals() : 문자열 비교 ⭐
  • getBytes() : 문자열을 바이트 배열로 변환
  • indexOf() : 매개값으로 주어진 문자열이 시작되는 인덱스 리턴
  • length() : 문자열길이를 리턴
  • replace() : 첫 번째 매개값인 문자열을 찾아 두 번째 매개값인 문자열로 대치한 새로운 문자열을 생성하고 리턴
  • substring() : 주어진 인덱스에서 문자열 추출, 매개값이 하나라면 시작인덱스~ 문자열 끝까지, 매개값이 두 개라면 시작인덱스 ~ 끝인덱스 사이에서 추출
  • toLowerCase() : 문자열을 모두 소문자로 바꾼 새로운 문자열 생성 후 리턴
  • toUpperCase() : 문자열을 모두 대문자로 바꾼 새로운 문자열 생성 후 리턴
  • trim() : 문자열 앞뒤 공백을 제거한 새로운 문자열 생성 후 리턴
  • valueOf() : 기본타입의값을 문자열로 변환

⭐ 문자열 비교 시 ==를 사용하면 예상과 다른 결과가 나올수 있음

: == 는 각 변수에 저장된 번지를 비교하므로 문자열만을 비교할 때 적합하지 않음

 

📌 Wrapper 클래스

- 자바는 기본 타입의 값을 갖는 포장 객체를 생성할 수 있음.

- 포장 객체가 포장하고 있는 기본타입 값은 외부에서 변경할 수 없음.

- 내부의 값을 변경하고 싶다면새로운 포장객체를 만들어야 함.

기본 타입 포장 클래스
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean

- 박싱과 언박싱

  • 박싱 : 기본 타입의 값을 포장 객체로 만드는과정
  • 언박싱 : 포장 객체에서 기본 타입의 값을 얻어내는 과정
  • 박싱은 포장 클래스의 생성자 매개값으로 기본타입의 값이나 문자열을 넘겨주면 됨.
  • 박싱 시 생성자를 이용하지 않고 포장 클래스마다 가지고 있는 정적 valueOf()  메소드를 사용할 수 있음.
  • 언박싱하기 위해서는 기본타입이름+Value()를 호출하면 됨.
// 박싱
Integer obj1 = new Integer("100");
Integer obj2 = Integer.valueOf("200");

// 언박싱
int value1 = obj1.intValue();

- 자동 박싱과 언박싱

  • 자동 박싱은 포장 클래스 타입에 기본값이 대입될때 발생
  • 자동 언박싱은 기본 타입에 포장 객체가 대입되는 경우와 연산에서 발생

- 문자열을 기본 타입 값으로 변환 : parse+기본타입명 으로 되어 있는 정적메소드 사용

- 포장 값 비교

  • 포장 객체의 내부 값 비교를 위해 ==, !=를 사용하지 않는 것이 좋다. (포장 객체의 참조를 비교함)
  • 박싱된 값이 아래 표 범위의 값이라면 ==, !=를 사용해도 값을 비교할 수 있지만, 그렇지 않다면 언박싱한 값을 가져와야 함.
타입 값의 범위
boolean true, false
char \u0000~\u007f
byte, short, int -128~127

 

📌 Math 클래스

- 절대값 : abs(int a), abs(double a)

- 올림값 : ceil(double a)

- 버림값 : floor(double a)

- 최댓값 : max(int a, int b), max(double a, double b)

- 최솟값 : min(int a, int b), min(double a, double b)

- 랜덤값 : random(),  0.0<=Math.random<1.0

- 가까운 정수의 실수값 : rint(double a) 

- 반올림값 : round(double a)

 

2. java.util 패키지

📌 Date 클래스

- 날짜를 표현하는 클래스

// 현재 시간의 Date 객체 생성
Date now = new Date();

// 원하는 날짜 형식의 문자열로 생성
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 mm월 dd일 hh시 mm분 ss초")

// 원하는 형식의 날짜 정보 얻기
String strNow = sdf.format(now);

 

📌 Calender 클래스

- 달력을 표현하는 클래스

- 추상 클래스이므로 new 연산자를 사용해서 인스턴스를 생성할 수 없음.

- Calender 클래스의 정적메소드인 getInstance() 메소드를 이용하면 Calender 하위 객체를 얻을 수 있음.

Calender now = Calender.getInstance();

int year = now.get(Calender.YEAR); // 연도를 리턴
int month = now.get(Calender.MONTH)+1; // 월을 리턴
int day = now.get(Calender.DAY_OF_MONTH); // 일을 리턴
String week = now.get(Calender.DAY_OF_WEEK); // 요일을 리턴
String amPm = now.get(Calender.AM_PM); // 오전, 오후 리턴
int hour = now.get(Calender.HOUR); // 시를 리턴
int minute = now.get(Calender.MINUTE); // 분을 리턴
int second = now.get(Calender.SECOND); // 초를 리턴

 

'독학 > 자바' 카테고리의 다른 글

[혼공학습단 10기] 자바 week6  (0) 2023.08.15
[혼공학습단 10기] 자바 week5  (0) 2023.08.08
[혼공학습단 10기] 자바 week4  (0) 2023.07.29
[혼공학습단 10기] 자바 week2  (0) 2023.07.16
[혼공학습단 10기] 자바 week1  (0) 2023.07.09