반응형
자바 예외 처리 (Java Exception)

자바에서 특정 오류가 발생했을 때 무시하고 싶거나, 오류에 따라 적당한 작업을 처리하도록할 수 있도록 해줄 수 있도록 해주는것이 예외 처리 입니다.

 

1. 에러 종류
  1. 컴파일 에러(compile-time error) : 컴파일할 때 발생하는 에러 (Error는 코드로 수습할 수 없는 심각한 오류이며, Exception은 개발자가 작성한 의도와 다르게 동작하게 됩니다.)
  2. 런타임 에러(runtime error) : 실행할 때 발생하는 에러 (프로그램 종료)
  3. 논리적 에러(logical error) : 작성 의도와 다르게 동작 (프로그램 종료X)

 

2. 예외 종류

예외의 종류로는 Exception의 자손과 RuntimeException이 있습니다.

  • Exception의 자손 : 개발자의 외적인 요인에 의해 발생 (ex. 입출력, 클래스가 없을때, ...)
  • RuntimeException : 개발자의 실수로 발생하는 예외 (ex. 형변환, 널포인터, 인덱스 범위 벗어남, ...)

또한 예외의 종류에는 checked 예외와 unchecked 예외가 있는데, 컴파일러가 예외 처리 여부를 체크 하는지 마는지에 따라 예외 처리가 필수인지, 선택인지 나눠지게 됩니다.

  • checked 예외 : 컴파일러가 예외 처리 여부를 체크 (예외처리 필수) , Excpetion
  • unchecked 예외 : 컴파일러가 예외 처리 여부를 체크하지 않음 (예외처리 선택), RuntimeException

 

3. 예외 상속구조

 

4. 예외 처리 기본 문법

예외 처리 시 기본 문법은 try-catch-finally 입니다. 아래 코드블럭에 주석으로 설명을 적어두었으며, throws의 경우 메서드를 호출한곳으로 예외를 넘겨서 호출한곳에서 예외를 처리하도록 합니다. 만약, main 메서드까지 throws로 다 넘긴다면 비정상 종료되며 JVM이 마지막으로 예외를 처리하게되어 출력하게 됩니다.

또한 아래 내용들을 사용하여 예외가 발생한 정보를 출력하여 확인할 수 있습니다.

  • printStackTrace() : 예외 발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지 출력
  • getMessage() : 발생한 예외 클래스의 인스턴스에 저장된 메시지 가져오기
public class test  {
	// throws : Exception 발생 시 호출된 곳으로 예외를 넘김
	public test() throws Exception {
    
		try {
			// 예외 처리가 발생할 가능성이 있는 코드
		} catch(RuntimeException e) {
			// 예외가 발생했을 때 실행할 코드
			// 현재 코드상으로는 RuntimeException 발생 시  catch되어 해당 라인에 있는 코드 실행
		} finally {
			// 예외 발생 유무와 상관없이 반드시 실행할 코드
		}
		
	}
}
반응형
반응형
자바 HashMap Null이 아닌 값 꺼내기

아래와 같이 HashMap의 길이만큼 for문으로 반복해준 후 if문에 map.get(i) != null ? true : false 를 사용하여 Null이 아닐 경우 Integer 형변환 후 mapValue 변수에 넣어 사용할 수 있습니다.

for(int i=0; i<boardLimit; i++) {
	if(map.get(i) != null ? true : false) {
		mapValue = Integer.parseInt(map.get(i));
	}
}

 

반응형
반응형
자바 인터페이스란?

자바에서 인터페이스란 상수와 추상 메서드(abstract)의 집합이며 모든 멤버가 public으로 구현되어 있습니다. 추상 메서드의 집합인만큼 클래스가 상속받아 구현하여 사용할 수 있도록 틀만 제공 하며, 사용을 강제 하거나, 인터페이스의 추상 메서드를 사용하도록하여 각 클래스들의 변경을 용이하게 대처할 수 있습니다.

 

1. 인터페이스 선언 및 구현

아래와 같은 형태로 인터페이스를 구현할 수 있으며 상수와 추성 메서드로 이루어져 있습니다.

인터페이스의 메서드는 사용을 강제하기 때문에 구현부를 작성하여 사용해야 하며, 만약 인터페이스에게 상속 받았지만 메서드를 구현하지 않는 경우 이클립스에서는 "The type classTest must implement the inherited abstract method interfaceTest.method()" 라고 알려줍니다.

// 인터페이스
public interface interfaceTest {
	// 상수
	public static final int num = 0;
	
	// 추상 메서드
	public abstract void method();
}
// 인터페이스 상속
public class classTest implements interfaceTest {

	public static void main(String[] args) {
		classTest c = new classTest();
		c.method();
	}
	
    // 상속받은 메서드 구현
	public void method() {
		System.out.println("hi");
	}
}

 

2. 클래스 상속 vs 인터페이스 상속
  • 클래스 상속 : 모든 클래스는 Object의 후손 입니다.
  • 인터페이스 상속 : 인터페이스는 Object의 후손이 아니며, 인터페이스만 부모 관계를 가질 수 있습니다.
  • 클래스 상속 : 클래스는 다중 상속을 할 수 없습니다.
  • 인터페이스 상속 : 인터페이스는 다중 상속을 가질 수 있습니다.

일반적으로 다중 상속의 문제점은 만약 다중 상속을 받는다면 A 부모와 B 부모의 선언부가 같고, 구현부가 다른 메소드가 있다면 어떤 부모의 메소드를 가져가서 사용해야할지 등의 오버라이딩에서의 문제가 발생 했기 때문에 사용할 수 없도록 되었습니다.

하지만 인터페이스의 경우 A부모와 B부모의 선언부가 같더라도 구현부가 없는 추상 메서드이기 때문에 문제될것이 없어 다중 상속이 허용되어 있습니다.

 

3. 인터페이스와 다형성

인터페이스에서도 다형성을 사용할 수 있습니다. 단, 인터페이스를 참조 타입으로 할 경우 인터페이스에 선언된 추상 메서드만 구현하여 사용 가능 합니다.

또한 아래 코드와 같이 추상 메서드에 선언된 매개변수 타입을 인터페이스로 넣을 경우, 인터페이스를 구현한 클래스의 인스턴스만 사용할 수 있도록 강제할 수 있습니다.

public interface interfaceTest {
	// 상수
	public static final int num = 0;
	
	// 추상 메서드
	public abstract void method(interfaceTest i);
}
public class classTest implements interfaceTest {

	public static void main(String[] args) {
    	// 다형성 사용 가능
		interfaceTest i = new classTest();
        
        // 인터페이스가 구현된 객체 인스턴스를 매개변수로 전달
		i.method(new classTest());
	}

	@Override
	public void method(interfaceTest i) {
		System.out.println("polymorphism");
		
	}
}

 

4. 인터페이스의 장점
  1. 인터페이스는 객체간의 연견을 돕는 중간 역할을 합니다.
  2. 선언과 구현을 분리시켜 사용할 수 있습니다.
  3. 다른곳에서 변경을 하더라도 인터페이스의 추상메서드는 변경되지 않습니다.  때문에 유연한 설계가 가능합니다.
  4. 표준화가 가능해집니다.
  5. 서로 관계가 없는 클래스들을 인터페이스를 상속함으로써 관계를 맺어줄 수 있습니다.
반응형
반응형
자바 참조형 매개변수 이해하기 (java reference type parameter)

매개변수는 기본형과 참조형 매개변수로 나눠집니다. 기본형의 경우 값이 복사되지만, 참조형의 경우 해당 인스턴스의 주소를 복사하여 값 자체에 영향을 줄 수 있습니다. 

아래 이미지들을 참고하여 본다면 참조형 매개변수의 경우 실제 값을 가져가는것이 아니라, 주소값을 참고하여 접근하고 실제 값이 담긴 객체에 접근하기 때문에 수정이 되는것을 확인할 수 있습니다.

기본형 매개변수 변수의 값을 읽기만 가능 (read only)
참조형 매개변수 변수의 값을 읽고 수정 가능 (read & write)

 

1.  Class01 타입(참조형)의 num 인스턴스 생성 → num의 x에 100 대입 → 출력

아래 이미지와 같이 바로 값이 들어가지 않고, 해당 값이 들어있는 객체의 주소값을 저장하여 접근하는 방식으로 됩니다.

 

2. method01 메소드 호출 및 num 전달 → num의 주소값 참고 (값 X) → x에 1000 대입 → 출력

method01 메소드를 호출하며 num을 전달합니다. 이때 값이 들어가는것이 아닌 주소값을 참고하며, x에 1000을 대입할 때 실제 그 주소를 가지고 있는 값이 수정 됩니다.

 

3. method01 실행 후 실제로 값이 변경되었는지 다시 출력

실제로 method01에서 1000을 대입한 후 실제로 값이 변경된것인지 확인을 위한 출력 입니다. , method01 종료된 후 출력한다면 아래와 같이 변경된 값 1000이 출력 됩니다.

 

4. 테스트 코드
class Class01 {
	int x;
}

public class test {
	public static void main(String[] args) {
		Class01 num = new Class01();
		num.x = 100;
		System.out.println("Class : "+num.x);
		
		System.out.println("method : "+method01(num));
        		
		System.out.println("Class : "+num.x);
	}
	
	static int method01(Class01 test) {
		test.x = 1000;
		return test.x;
	}
}
반응형

+ Recent posts