[220928] static, 정적변수

최수정·2022년 9월 28일
0

멋쟁이사자처럼

목록 보기
4/14
post-thumbnail

Static

  • static변수란 한번 먼저올려 값을 공유 하는 변수, 인스턴스 별로 가지고 있을 필요가 없는 변수
  • static변수 = 정적변수 = 클래스변수 = 공용변수
  • 객체를 생성하지 않고도 Static 자원에 접근이 가능하다.(메모리에 올라간다)
  • java에서 Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해체되는 것을 의미.

클래스 변수의 접근방법
-클래스 내부에서는 인스턴스 변수같이 기존의 방법과 같다. 이름을 통해 접근한다.
-클래스 외부에서는 생성자를 만들어서 객체를 통해 접근한다. 클래스명으로도 접근가능.
-클래스명으로 접근 가능한 이유?
-인스턴스변수랑 스태틱변수가 나뉜 이유? : 공동으로 유지해야 하는 규격을 인스턴스별로 다르게 할 필요가 없어서 공동 메모리에 올려놓고 똑같이 유지하거나 인스턴스끼리 함께 공유하고 영향을 표현해야하는 변수를 정의 하기 위해서 스태틱변수가 나온 느낌임.

code static사용방법, 개념

class AccessWay {
	static int num;
}

public class Hello {

	public static void main(String[] args) {
		
		AccessWay access = new AccessWay();
		
		System.out.println(access.num++);
		
		System.out.println(AccessWay.num);
       
	}

}

code static활용예제

class InstCnt{  // static이 있고 없고 차이를 보기 위한 
	// static int instNum = 0;
	int instNum = 0;
	
	InstCnt(){ // 객체가 생성될때 마다 변수 값 증가. 
		instNum++;
		System.out.println("인스턴스 생성: " + instNum);
	}
}

public class Hello {

	public static void main(String[] args) {
		InstCnt cnt1 = new InstCnt();
		InstCnt cnt2 = new InstCnt();
		InstCnt cnt3 = new InstCnt();
        
 // static 있을때 출력값 : 1 2 3 없을때 : 1 1 1

code static활용예제2

자주쓰는 함수에 대해서는 static을 써서 하는게 소스코드도 간결해지고, 메모리도 절약된다.(객체생성을 안하니까)

Q
main 메소드가 static인 이유는?
-> 인스턴스 생성과 관계없이 제일 먼저 호출되는 메소드다.
main 메소드가 public인 이유는?
-> main 메소드의 호출 명령은 외부로부터 시작되는 명령이다. 단순히 일종의 약속으로 이해한다.

예외처리

자바에서의 예외는 실행 중간에 발생하는 정상적이지 않은 상황을 뜻한다. 실행은 될 수 있음!

자바는 이와 같은 예외 상황에 대해 예외처리 매커니즘을 제공한다. 문제가 발생한 지점에 대한 정보출력과 프로그램종료이다. 이때 프로그램 종료를 막기위한 예외처리를 아래에서 살펴보자.

  1. try catch - finary
  2. trows

(1) try catch

✏️code 문법

public static void main(String[] args) {

		int a = 0;
		
		try {
			
			a = 1/0;
			
		} catch (Exception e) {
			
		}
		
		System.out.println("트라이캐치 바깥");
		System.out.println(a);

	}

tyr catch가 없다면 1/0의 연산은 불가하므로 프로그램이 종료된다. 하지만 위와같이 예외처리를 해주면 a = 0에서 멈추고 예외처리 안쪽은 실행되지 않고 출력문은 트라이캐치 바깥 0 이된다.
즉, try이 안은 테스트하는 코드 catch는 try안이 오류라면 구멍을 만들어줘서 빠져나가거나 오류상황을 출력해주는 용도로 쓸 수 있다. 🔽 code

public static void main(String[] args) {

		int a = 1;
		int b = 0;
		
		try {
			
			b = a / b;
			
			System.out.println("트라이 인" + a);
			
		} catch (ArithmeticException e) {
			
			e.printStackTrace();
			
			System.out.println("캐치" + a);
			System.out.println("캐치" + b);
		} finally { 
			System.out.println("파이널리 입니다.");
		}
		
		System.out.println("트라이캐치 바깥");
		System.out.println(a);
	}

💡
e.printStackTrace(); : 디버깅을 위해 catch문 안에 넣어주는 메서드, 오류내용을 출력함.
e.getMessage()
💡 finally : try안이 실행되든 catch안이 실행되든 실행되는 부분
💡 catch는 여러개 쓸 수 있고, 예외사항을 차례대로 해결해나가는 것. 그래서 Exception이 제일 위로 오면 그 밑의 오류객체들은 에러가 난다. 🔽사진참고

(2) throws

try-catch는 예외사항 확인해서 고치려는 느낌이고, throws는 일단 실행은 되게끔(컴파일 오류 안나게) 예외를 넘긴다고 생각하고 이해한다.

✏️문법

public class Test2 {

	public static void main(String[] args) throws Exception { 
    // 일반적 사용법, Exception은 다른 종류의 예외문구로 바뀔 수 있다. 
		...
 }

public void simpleWrite() throws IOException, IndexOutofBoundsException {
// 둘 이상의 예외 넘김에 대한 선언 
 ....
}

(3) 예외 클래스 구분


여기서 Error는 메모리적 에러를 뜻하기 때문에 자바나 개발자의 능력으로 해결할 수 없어 프로그램이 죽는다.

  • checked Exception
    : 반드시 예외처리를 해줘야 하는 사항들.
  • unchecked Exception

0개의 댓글