클래스변수
static 변수와 static 메소드
static 변수 = 정적변수 = 클래스 변수 = 공용변수
ㄴ 특징
•
static 변수는 클래스 변수이다
•
객체를 생성하지 않고도 static자원에 접근이 가능하다.
•
인스턴스 변수는 하나의 클래스로부터 생성되었다해도 각기 다른 값을 유지하지만,
static멤버변수는 인스턴스에 관계없이 같은 값을 가진다 → 하나의 변수를 모든 인스턴스가 공유함. → 객체로 구분될 의미가 없음.
•
Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미
•
static 사용처→ 멤버변수, 메서드(함수), 초기화 블럭
메모리 영역
static 키워드를 통해 생성된 정적 멤버들은 heap 영역이 아닌 static 영역에 할당된다.
객체 생성시에 할당된 Heap 영역의 메모리는 Garbage Collector를 통해 수시로 관리받는 반면, static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만, Garbage Collector의 관리 영역 밖에 존재해 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 된다.
즉, static을 자주 사용하게 되면 시스템의 퍼포먼스에 악영향을 주게 된다.
클래스 변수의 접근 방법
•
클래스 내부 접근 : static 변수가 선언된 클래스 내에서는 이름만으로 직접 접근 가능
•
클래스 외부 접근 :
◦
private으로 선언되지 않으면 클래스 외부에서도 접근 가능
◦
접근 수준 지시자가 허용하는 범위에서 접근 가능
◦
클래스 또는 인스턴스의 이름을 통해 접근
어디에 쓸까?(공통의, 공유의)
•
인스턴스 별로 가지고 있을 필요가 없는 변수
◦
값의 참조가 목적인 변수
◦
값의 공유가 목적인 변수
→ static 변수 선언 하나로 인스턴스 변수에서 사용 가능
•
그 값이 외부에서도 참조하는 값이면 public으로 선언
→ 공용으로 사용되면 static을 사용하면된다.
static 메소드
•
인스턴스 생성이 없어도 호출이 가능한 static메소드
•
static메소드 내에서는인스턴트 멤버들을 직접 사용 할 수 없다.
→ 인스턴스 변수는 객체 생성 후 메모리에 할당이 된다. but static메소드는 객체 생성 없이 접근하기 때문에 static메소드에서 인스턴스 변수를 접근하면 인스턴스 변수는 메모리 할당이 되어있지 않은 영역에 접근하게 되버린다.
// 변경 전
class AAA {
int num = 0; // 인스턴스 변수
static void addNum(int n) {
num += n; // static 메소드 내에선 인스턴스 변수 사용 불가
}
}
// 변경 후
class AAA {
static int num = 0; // static변수를 붙여 클래스변수로 선언
static void addNum(int n) {
num += n; // 클래스 변수기 때문에 static 메소드 내에서 사용가능
}
}
Java
복사
(java.lang.)System.out.println(…); 의 정체는?
•
System 은 java.lang 패키지에 묶여 있는 클래스의 이름(첫글자가 대문자인걸로 추측가능)
•
java.lang은 컴파일러가 자동 삽입하기 때문에 생략가능
•
import java.lang.*이 되어야함
•
out은 클래스 System의 이름을 통해 접근하므로, 이는 System 클래스의 클래스 변수(static)임을 유추할 수 있다.
•
println은 out이 참조하는 인스턴스의 메소드
왜 처음 시작할때 public static main(String[] args)?
•
인스턴스 생성과 관계없이 제일 먼저 호출되어야 하기 때문에 static
•
main 메소드의 호출 명령은 외부로부터 시작되는 명령이기 때문에 public
클래스변수는 다 static?
예외처리(Exception Handling)
예외처리란?
•
컴파일이 정상적으로 되더라도 프로그램이 실행될 때 에러가 발생 될 수 있음
에러가 발생하더라도 프로그래머가 이에 대한 적절한 코드를 미리 작성해 놓음으로써 프로그램의 비정상적인 종료를 막을 수 있는 것
ex) Scanner(System.in)에서 키보드로 입력받기 때문에 nextInt 함수에 문자나 문자열이 담길수 있고 이 경우 예외처리를 하지 않으면 비정상적으로 프로그램이 종료된다.
try catch(finaly)
여러 종류의 예욀르 처리하기 위해 하나 이상의 catch블럭이 올 수 있다.
try문에서 코드 실행중 예외가 발생하고 그 예외의 종류와 일치하는 catch블럭만 수행, 예외가 없을 경우 다시 try catch문 아래 실행
throws
•
메서드가 호출 시 발생가능한 예외를 호출하는 쪽에 알리는 것이다.
•
public static void md1() throws IOExcpetion{}
main 함수에 throws 를 사용한 경우
main함수에서 예외처리가 발생하면 try-catch문 없어서 비정상종료된다. 그리고 JVM에게 예외를 맡기게 된다.
printStackTrace() , getMessage()
예외 클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨 있다.
→ getMessage() 와 printStackTrace() 로 해당 정보를 얻을 수 있다.
printStackTrace() : 예외 발생 당시 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
→ 에러의 모든 정보를 출력함
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있음
→ 에러의 간단한 정보를 출력함ㄷ
Exception e
모든 예외의 최고조상이기 때문에 모든 예외를 처리할 수 있다.
그렇기 때문에 Exception e가 선언된 catch 블럭은 제일 마지막에 와야한다.
Exception를 인스턴스 생성으로 넣어 정보를 얻지 않는 이유?
→ 최고 조상 클래스이기 때문에 각 catch의 구분된 에러 정보를 얻을 수 없음 (너무 범위가 크다)
•
Exception : 프로그램 코드에 의해서 수습될 수 있는 미약한 오류 처리 .
◦
hecked Exception : Exception의 하위 클래스, 반드시 에러를 처리해야함(try/catch or throws)
▪
존재하지 않는 파일의 이름을 입력(FileNotFoundException)
▪
실수로 클래스의 이름을 잘 못 적음(ClassNotFoundException)
◦
Unchecked Exception : RuntimeException의 하위 클래스, 체크 예외와 달리 에러 처리를 강제적으로 하지 않음
▪
배열의 범위를 벗어난(ArrayIndexOutOfBoundsException)
▪
값이 null인 참조변수를 참조(NullPointerException)
•
Error : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
ex) 메모리부족(OutOfMemoryError) 등 일단 발생하면 복구할 수 없는 심각한 오류
사용자 정의 예외 만들기
직접 예외 클래스를 정의할 수 있다. 조상은 Exception과 RuntimeException 중에서 선택하고 생성자를 작성해주어야한다.
class MyException extends Exception{
MyException(String msg) { //문자열을 매개변수로 받는 생성자
super(msg); //조상인 Exception클래스의 생성자를 호출
}
}
Java
복사
Exception은 필수 처리 예외이기 때문에 반드시 try-catch문을 써야한다.
RuntimeException은 선택 처리 예외이기 때문에 try-catch문을 사용하지 않아도 된다. 그렇기 때문에 가능하면 선택처리가 가능한 RuntimeException을 사용하는게 좋다.
디버깅 방법
1.
중단점(break point)를 지정한다.
2.
디버그 모드 실행(탭에 있는 벌레모양)
3.
Step 별로 수행하면서 디버그를 진행할 수 있다.
•
Step Into (F5) - 한단계씩 수행
•
Step Over (F6) - 함수단위 수행
•
Step Return (F7) - 호출한 곳으로 되돌아가기
오른쪽 위에 변수값을 확인할 수 있는 창이 뜬다. Expressions 탭에서는 확인하고 싶은 변수명을 입력하면 해당 변수의 값을 확인할 수 있다. 창이 안뜬다면 [Window]-[Show view]에 가서 사용하고 싶은 창을 선택하면 된다.