//////
Search

220928

클래스와 클래스 변수

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) : 프로그램 실행 중 몇몇 상황에서 발생할 수 있는 예외. 예외 처리를 하지 않더라도 프로그램 실행 자체는 가능하나, 예외 상황 발생시 바로 프로그램이 정지함.