클래스와 클래스 변수
static
•
함수와, 인스턴스 변수(class내부, 메소드 외부에서 선언 된 변수)에 붙음
•
static 변수 = 클래스 변수 = 정적 변수 = 공용 변수
•
클래스 변수 : 객체를 생성하지 않고도 static이 붙은 해당 변수에는 접근이 가능하다는 의미.
class AccessWay {
// static 키워드 사용한 정적 변수(클래스 변수)
static int num = 0;
}
public class example1 {
public static void main(String[] args) {
// 객체 생성 안하고, class명으로 바로 변수에 접근.
System.out.println(AccessWay.num);
// 객체를 통한 접근 = 기존 방식
AccessWay access = new AccessWay();
System.out.println(access.num);
}
}
// 클래스 변수의 대표적인 다른 예
// Math.Pi -> Math 객체를 만들지 않아도 바로 사용가능.
Java
복사
•
static 키워드 : 메모리에 한 번 할당되어 프로그램이 종료될 때까지 모든 객체들이 공유하게 됨.
class InstCnt {
static int instNum = 0;
InstCnt() {
instNum++; //객체가 하나 생성될 때마다 1씩 증가
System.out.println("인스턴스 생성 : " + instNum);
}
static public void print() {
instNum++;
}
}
public class example2 {
public static void main(String[] args) {
InstCnt cnt1 = new InstCnt(); // static int instNum 이 0 -> 1 증가
InstCnt cnt2 = new InstCnt(); // static int instNum 이 1 -> 2 증가
InstCnt cnt3 = new InstCnt(); // static int instNum 이 2 -> 3 증가
}
}
// static 없는 그냥 int instNum 였다면..
// 객체 생성을 할 때마다 instNum 이 계속 0으로 초기화 되어서 값은 계속 1이 되었을 것.
Java
복사
•
static 키워드를 사용해 얻는 이점.
◦
수 많은 객체가 공유하는 내용을 하나의 변수로 다룰 수 있음 = 메모리 효율적
•
static 키워드를 사용하면 좋은 변수
◦
값의 참조가 목적인 변수
◦
값의 공유가 목적인 변수 ( 외부에서도 참조하면 public static! )
static 메소드
•
static 메소드에는 인스턴스 변수가 올 수 없음.
◦
static 메소드는 객체 생성 없이도 사용 할 수 있지만, 인스턴스 변수는 객체 생성이 필수적.
◦
즉, static 메소드를 사용 할때 객체가 생성되어 있으리란 보장이 없기 때문.
•
main 메소드에 public 키워드와 static 키워드가 붙는 이유.
◦
public : main 메소드의 호출 명령은 패키지 외부에서부터 시작되기 때문에, public 없이는 접근 불가.
◦
static : static 키워드를 사용해야 객체 생성에 관계없이 메소드 실행이 가능함.
예외처리
자바에서의 예외란?
•
예외 : 단순한 문법 오류가 아닌 실행 중간에 발생하는 ‘비정상 상황’
•
예외처리 : 예외가 발생했을 때, 실행을 계속 할 수 있도록 만드는 우회 경로.
•
자바의 기본 예외처리 방식 : 문제 지점 정보 출력 + 프로그램 종료.
•
예외를 발견하고 처리하는 주체 = JVM
예외 처리의 두 방식.
•
try catch (+finally) 방식
◦
try 에서 프로그램 실행, 예상되는 예외는 catch를 통해 예외 객체를 잡아서 예외 처리!
public class example4 {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
try {
// 실행문
System.out.print("a/b... a? ");
int n1 = kb.nextInt();
System.out.print("a/b... b? ");
int n2 = kb.nextInt();
System.out.printf("%d / %d = %d \n", n1, n2, n1 / n2);
} catch (ArithmeticException e) { // 예상오류 1 : 0 으로 나누는 오류.
e.printStackTrace();
System.out.println(e.getMessage());
} catch (InputMismatchException e) { // 예상오류 2 : 입력값이 잘못되는 오류
e.printStackTrace();
} catch (Exception e) { // 마지막 보루 : 혹시 모를 오류는 최상위 오류 객체로 잡기 (다형성 활용)
e.printStackTrace();
} finally {
System.out.println("무조건 실행"); // finally는 예외 발생 여부와 관계없이 무조건 실행.
}
System.out.println("Good bye~~!");
}
}
// 최상위 오류 객체인 Exception 은 가장 아래 catch에 작성하기.
// 위에 작성하면 Exception이 모든 오류를 잡아버려서, 아래 catch가 의미 없어짐.
Java
복사
•
throw 방식
◦
예외 처리를 해당 메소드를 호출한 메소드에게 “떠넘김”
◦
근본적 해결 방법이 아닌, 임시 방편.
◦
최종적으로 main 메소드에서도 throw 하면 에처 처리를 아예 포기하는 것이 됨 = 테스트 코드에서 간간히 사용.
예외 클래스의 구분
•
Object 클래스 : 예외 클래스를 포함한, 모든 클래스의 최고 상위 클래스
•
Error 클래스 : 기본적으로 개발자나 JVM이 시스템적으로 해결할 수 없는 문제. ex) out of memory error : 메모리 부족 문제 → 하드 웨어(ram)을 추가로 장착해야 함.
•
Exception 클래스 : 예외 처리를 통해서 해결 가능한 예외.
◦
Checked Exception : 개발자가 반드시 예외 처리를 해야하는 예외.
◦
Unchecked Exception(=Runtime Exception) : 프로그램 실행 중 몇몇 상황에서 발생할 수 있는 예외. 예외 처리를 하지 않더라도 프로그램 실행 자체는 가능하나, 예외 상황 발생시 바로 프로그램이 정지함.