예외처리
- 실행자체가 불가능한 컴파일 에러와 달리 실행 중 의도치 않는 결과가 나오는 것을 의미한다
try - catch - finally
- try문안에 예외 발생 가능성이 있는 실행문을 작성하고, catch문에서 예외 발생 시 작동시킬 실행문을 작성, finally에서 예외 발생 여부와 상관없이 무조건 실행할 코드를 작성한다
- 작성예시
try {
System.out.println("나누기 연산 시작!");
System.out.println(divide(6, 0));
} catch (ArithmeticException error) {
System.out.println("나누기 중 예외 발생" + error.getMessage());
System.out.println("나누기 중 예외 발생" + error.toString());
} finally {
System.out.println("나누기 연산 종료");
}
- ArithmeticException, ArrayIndexOutOfBoundsException, InputMismatchException, NullPointerException etc
- catch 여러개 이어서 쓰기 가능
catch(예외이름1 error){}catch(예외이름2 error){}
- catch문 하나에 예외 여러개 받는 것 가능
- catch(예외1 | 예외2 error)
- 예외 처리 구문이 비슷할 때
- 두 예외가 상속관계에 있지 않을 때
throws
- 의도적으로 예외를 발생시켜서 예외처리를 하는 방법이다
- 왜? 의도하지 않은 방식으로 동작하는 것을 방지하기 위해 특정 조건에서 일부로 예외를 발생시켜 작동을 막는것
ex) Scanner로 배열의 크기를 입력받고 있는 코드에서 음수값을 입력할 경우 IllegalArgumentException에러가 발생, 다만 0을 입력하는 경우에도 해당 에러를 발생시켜 던져주고 싶음
- 조건문안에 새로운 에러 객체를 생성해서 던져준다. 괄호안의 메시지는 catch문에서 e.toString(), e.getMessage로 접근가능
if (size <= 0) {
throw new IllegalArgumentException("배열의 크기는 1 이상이어야 합니다.");
}
Class
- OOP: 객체지향 프로그래밍, 객체간에 상호작용을 하도록 프로그램을 만드는 방식
- 캡슐화, 상속, 다형성 등의 특징을 가짐
- 클래스랑? 객체의 설계도, 사용자 정의 타입, 클래스 기반으로 객체를 생성할 수 있다
선언과 생성
- 선언: 접근제한자(생략가능) class 클래스명 {}의 형태로 선언
- 멤버로 필드(변수)와 메소드(함수)를 가질 수 있다.
- 생성: 클래스명(타입) 이름 = new 클래스명();으로 생성 new키워드 뒤에 붙는 것은 생성자, 생성자는 생략시 자동 생성되고 따로 값을 받아 필드 등을 초기화 할 수도 있다.
- 필드: 변수와 유사하게 선언, 초기화, 생성자 내부에서 값을 받아 초기화 가능, 접근제한자 사용가능, 이름이 같을 경우 클래스 필드는 this.필드명으로 분류표기 가능
- 메소드: 함수와 유사하게 작동, 접근제한자 리턴타입 함수명() {실행문}의 형태로 작성
접근제한자
- java의 접근 제한자는 4가지가 있다
- public: 같은 패키지와 외부 패키지 모두 접근가능(import필요)
- private: 같은 패키지와, 외부 패키지여도 상속한 클래스(자식)에서 사용가능
- default: 접근제어자 생략 시 default, 같은 패키지에서만 사용가능
- private: 같을 클래스 내에서만 사용가능
- 기본적으로 필드는 외부에서 곧바로 값을 변경하는 것을 막기 위해 private로 설정하고, public getter함수와 setter함수를 생성해서 값을 변경, 확인하도록 하는 것이 일반적이다
- intellij에서 자동생성 기능도 제공함
- getter는 return, setter는 void(매개변수O)
- getter & settter ex)
private int heigth;
public int getHeigth() {
return heigth;
}
public void setHeigth(int heigth) {
this.heigth = heigth;
}
static
- 특징1) 객체 당 생성이 아니라 클래스 당 1개만 생성(main 종료 시 까지 값이 유지된다고 이해하면 편함), 클래스 생성 시 메모리를 할당받음
- 특징2) 클래스 객체 생성 후 사용하지않고 클래스명.static멤버로 바로 사용가능
- 특징3) static메소드에서 non-static 멤버에 접근할 수 없다(당연함 그러면 static존재 의미가 없음;;) 반대 접근은 가능, this키워드도 사용할 수 없다
- 위와 같은 특징으로 인해 공유 목적으로 많이 사용된다. 예를 들어 생성된 객체의 숫자를 저장하는 등의 작업 가능
static double pi = 3.141592;
double circleArea = num1 * num1 * Calculator.pi;
final
- 한번만 초기화할 수 있다. readOnly속성을 가진다
- 상수 선언: 변하지 않는 값을 가지는 상수를 선언하기 위해 static과 final을 동시에 사용할 수 있다.(객체당 초기화도 불가 딱 한번만 가능!!)
- 대문자로 작성하는 것이 관례이다
public static final int MAX_VALUE = 10;
- final class: 상속 불가능
- final method: class상속은 가능, override불가능