///////
Search
📙

김건우

Static 변수(클래스 변수)

이씨 집안을 나타내는 HouseLee 클래스이다. 위와 같은 클래스를 만들고 객체를 생성하면 객체마다 객체변수 lastname을 저장하기 위한 메모리가 별도로 할당된다. 하지만 가만히 생각해 보면 HouseLee 클래스의 lastname은 어떤 객체이던지 동일한 값인 "이" 이어야 할 때 이렇게 항상 값이 변하지 않는 경우라면 static 사용시 유리하다.
class HouseLee { static String lastname = "이"; } public class Sample { public static void main(String[] args) { HouseLee lee1 = new HouseLee(); HouseLee lee2 = new HouseLee(); } }
Java
복사
위와 같이 lastname 변수에 static 키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점이 있다.static을 사용하는 또 한가지 이유로 공유  개념을 들 수 있다. static 으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유하게 되는 것이다.

객체를 count하는 static변수

class Counter { static int count = 0; Counter() { count++; // count는 더이상 객체변수가 아니므로 this를 제거하는 것이 좋다. System.out.println(count); // this 제거 } } public class Sample { public static void main(String[] args) { Counter c1 = new Counter(); Counter c2 = new Counter(); } } int count = 0 앞에 static 키워드를 붙였더니 count 값이 공유되어 다음과 같이 count가 증가되어 출력된다. 1 2 보통 변수의 static 키워드는 프로그래밍시 메모리의 효율보다는 공유의 목적으로 훨씬 더 많이 사용한다
Java
복사

Static변수,메서드의 메모리 저장영역

static 키워드를 통해 생성된 static멤버들은 heap영역이 아닌 static영역에 할당된다.
모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 갖지만
Garbage Collector의 관리 영역 밖에 존재하기 때문에 프로그램이 종료될 때까지 메모리에
값이 유지된 채로 존재한다

Static 메서드

※ static 메소드 안에서는 객체변수 접근이 불가능 하다. ※ 클래스의 객체없이 호출이 가능하며 , 반드시 클래스.static메소드로 사용!
class Counter { static int count = 0; Counter() { count++; System.out.println(count); } public static int getCount() { return count; } } public class Sample { public static void main(String[] args) { Counter c1 = new Counter(); Counter c2 = new Counter(); System.out.println(Counter.getCount()); // 스태틱 메서드는 클래스를 이용하여 호출 } }
Java
복사

Static메서드에서 인스턴스 변수 사용 못하는 이유

클래스 변수와 인스턴스 변수의 생성시점이 다르기 때문에 메모리에 먼저 올라간 static 메서드가 아직 올라가지 않은 인스턴스 변수를 참조하지 못한다는 것이다.
반대로 일반 메서드에서 클래스 변수를 참조할 수 있는 이유는 일반 메서드의 경우 인스턴스가 생성되는 시점에 호출되는데, 이 땐 이미 클래스가 메모리에 올라간 뒤이기 때문에 클래스변수를 참조할 수 있다.
—→ 컴파일 시 에러 발생( 결론 static메서드에서 인스턴스 변수 사용 못한다.

자바의 메인 메서드는 public static void인 이유

자바의 메인메서드를 작성할 때는 public static void main(String[] args){}구조로 작성된다.

public

public은 접근제어자이다. 어느 클래스에서든 해당 객체를 참조할 수 있다는 뜻이다. JVM(Java Virtual Machine)이 접근 하기 위해서 public을 사용해야만 한다. 다른 접근 제어자를 사용하면 프로그램이 실행되지 않는다.

static

static으로 뭔가를 선언하게 되는 경우, 자바가 컴파일 되는 시점에 정의된다(클래스 로드)
main 메서드는 프로그램의 시작점. 프로그램이 실행되면 제일 먼저 호출되는 메서드이기 때문에 객체를 생성하지 않은 채로 바로 작업을 수행해야 하기 때문에 static이어야 한다.

void

타입이 void라는 것은 반환할 것이 없다는 의미한다. 즉, 메인 메서드를 호출하는 JVM에서 반환 값을 요구하지 않으니 void타입을 사용한다(멀티 스레드를 염두 했기 때문)

String [] args

.String은 문자열을 나타내는 자바의 자료형이고, args []는 String 자료형에 대한 변수명으로 args 뒤에 []가 있으므로 배열임을 의미한다. String [] args는 프로그램 실행 시 매개변수를 보내서 실행할 수 있다는 것을 뜻한다. 1개를 사용할 수도 있고 여러 개를 사용할 수도 있기 때문에 배열을 사용한다

예외(Exception)

단순한 문법오류가 아닌 실행중간에 발생하는 덜 심갈한 에러이다
예외처리로 해당 오류상황을 처리할 수 있다.

예외 처리하기

try블록

try 블록  : 이 블록에서 예외가 발생할만한 코드가 쓰여진다

catch 블록

catch (예외 종류) 블록  : 이 부분에서 예외가 발생되었을때 처리하는 동작을 작성한다. catch블록은 여러 개가 있을 수 있다. 맨 처음 catch 블록에서 잡히지 않는 예외라면 다음 catch의 예외를 검사한다. 이때 상속관계에 있는 예외 중 부모가 위의 catch, 그리고 그 자식 예외 클래스가 아래의 catch로 놓일 순 없다.

finally 블록

finally 블록  : 여기서는 예외가 발생하건 발생하지 않건 공통으로 수행되어야할 코드가 쓰여진다.  임시 파일의 삭제 등 뒷정리 코드가 쓰인다

예외 처리 기본구조

다음은 예외처리를 위한 try, catch문의 기본 구조이다.
try { 예외가 발생할 수 있는문장 ... }catch(예외1) { ... }catch(예외2) { ... ... }finally{ }
Java
복사
try 문안의 수행할 문장들에서 예외가 발생하지 않는다면 catch문 다음의 문장들은 수행이 되지 않는다. 하지만 try 문안의 문장을 수행하는 도중에 예외가 발생하면 예외에 해당되는 catch문이 수행된다.

JAVA 에러 출력 메서드

e.getMessage() : 에러의 원인을 간단하게 출력한다.
e.toString() : 에러의 Exception 내용과 원인을 출력한다.
e.printStackTrace() : 에러의 발생근원지를 찾아서 단계별로 에러를 출력한다.

숫자 예외처리와 타입 불일치 예외처리

//숫자예외처리 int c; try { c = 4 / 0; } catch(ArithmeticException e) { c = -1; // 예외가 발생하여 이 문장이 수행된다. } //타입 불일치 예외처리 try { //예외가 발생할 가능성이 있는 코드 작성 System.out.println("Integer.parseInt(str) = " + Integer.parseInt(str)); } catch (NumberFormatException e) { //NumberFormatException 이 발생했을 경우 catch 문에서 예외를 처리하기 위한 코드 System.out.println("NumberFormatException = " + e.getMessage()); } catch (Exception e) { //Exception이 발생했을 경우 예외를 처리하기 위한 코드 System.out.println("e.getMessage() = " + e.getMessage()); }
Java
복사
발생시점에 따른 에러 분류

1.컴파일에러

Compile Error: 컴파일 시점에서 발생하는 에러로 소스코드를 컴파일러가 컴파일하는 시점에서 소스의 오타나 잘못된 구문, 자료형 체크등 검사를 수행하는데 여기서 발생하는 에러를 컴파일 에러라 하며 이 시점에서 발생하는 문제들을 수정 후 컴파일을 성공적으로 마칠경우 클래스 파일(*.class) 파일이 생성된다.

1.런타임에러

런타임 시점에서 발생하는 오류는 에러와 예외로 나뉜다.
에러(Error): 메모리 부족이나 스택오버플로우와 같이 일단 발생하면 복구할 수 없는 심각한 오류
예외(exception):수습이 가능한 덜 심각한 오류.

예외 발생시키기(throw)

예외 발생시키기
고의로 예외발생은 throw라는 키워드를 사용하면 되는데, 주로 사용자가 구현하는 비즈니스 로직에서 컴파일의 문법 오류는 없지만 로직 자체가 개발자가 의도한대로 진행되는지 확인할 때 사용한다.
사용법
1.발생시키고자 하는 예외를 생성한다.
⇒ Exception e = new Exception("고의 발생 예외");
2.throw 키워드를 이용해 예외를 발생시킨다.
⇒ throw e;
또 다른 방법은 바로 new 키워드로 예외 객체를 생성해도 된다.
⇒ throw new Exception("고의 발생 예외");
public static void main(String[] args) { try{ throw new Exception("고의 발생 예외"); }catch(Exception error){ error.printStackTrace(); System.out.println("Invalid str: "+error.getMessage()); } System.out.println("end"); }
Java
복사

메서드에 예외 선언하기

void method() throws Exception1, Exception2, ... ExceptionN { //... }
Java
복사
메서드레벨에서 예외를 선언할 수 있다.
메서드 레벨에서 선언한 예외와 그 자손타입까지 발생할 수 있다는 걸 의미한다.
⇒ throws RuntimeException 을 선언할 경우 RuntimeException을 상속하는 하위 예외객체들 모두가 발생 할 가능성이 있다.
해당 메서드에서 선언한 예외를 보고 블록 내부 로직을 수행하며 해당 예외가 발생할 수 있다고 추측할 수 있고, 이 부분에 대해 유의할 수 있다
예외 처리를 해당 메서드를 호출하는 로직에게 위임할 수 있다.