1.예외처리, instance of


예외처리는 자바 작성 하고 실행 할 때에 발생하는 오류를 말한다.


예외는 수없이 많지만 대표적인것 3가지만 설명하자면


- NullPointerException


String data = null;

// ex 돈 안주고 심부름 시킬 경우

data.toString(); // null인 값에 무언가 하려고 할 경우


위와 같이 null값을 넣거나 초기화 하지 않아 null값이 들어가 있는데 참조 또는 호출을 할 경우 발생하는 오류이다.


가장 많이 발생하며 코딩의 논리적 순서나 어딘가에서 실수를 하였을 경우 자주 등장한다.


- ArrayIndexOutOfBoundsException


String[] var = new String[2];

var[0] = "data1";

var[1] = "data2";

// 예외 발생 지점

var[2] = "data3";


배열의 방의 크기는 2인데 3으로 가정 하고 작성하였을 경우 발생하는 오류이다.


- NumberFormatException


String data;

int val;

// "1234" -> 1234

data = "1234";

val = Integer.parseInt(data);

// "1q2w3e" -> 1q2w3e (예외 발생)

data = "1q2w3e";

val = Integer.parseInt(data);

System.out.println(data);


자료형을 잘못 지정하여 발생하는 오류이다.


값을 입력받을때 어떤 형식이 들어올지 예측할 수 없다면 instance of 라는 기능을 사용하여 조건문에 사용하면


구분 할 수 있다. 다음의 예제를 통해 쓰임을 살펴보자


package chap07.exam04.exception;

public class ClassCastingEx {

	public static void main(String[] args) {
		Object value = 1234;
		int intVal = (int)value;
		// 원래 숫자기 때문에 문자열 변환이 안된다.
//		String stringVal = (String)value;
		// 이것을 방지하기 위한 방법
		String strVal;
		
		if(value instanceof String) {
			strVal = (String)value;
		}else {
			strVal = "" + value;
			System.out.println(strVal + "숫자형을 문자로 변환이 불가능 합니다.");
		}
	}

}




2.try catch문


try catch문은 특정 코드 부분에서 예상된 오류가 발생했을 경우 처리할 구문을 작성 할 때에 쓴다.


try{ 진행할 코드 } catch ( 예상되는 오류 코드 ) { 오류 발생 시 작동 할 코드 } 


위와 같이 작성하며 오류코드는 너무 많기 때문에 보통 Exception e와 같이 작성하여 모든 예외를 받는다.



package chap07.exam05.tryCatch;

public class Main {

	public static void main(String[] args) {
		String data1 = "12345";
		String data2 = "asd";
		String data3 = "56789";
		
		try { // 문제가 날 것 같은 예상 지점
			
			int value1 = Integer.parseInt(data1);
			int value2 = Integer.parseInt(data2);
			
		} catch (NumberFormatException e) { // 예외 발생 시
			
			System.out.println("입력된 문자가 숫자로만 구성되었나?");
			System.out.println(e.toString());
			
		} finally { // 예외이던 아니던 무조건 실행
			
			System.out.println("data1 : " + data1);
			System.out.println("data2 : " + data2);
			
		}
	}

}


'개념 및 코딩 > 06.기타' 카테고리의 다른 글

[JAVA]06-06.Generic  (0) 2018.09.03
[JAVA]06-05.Object  (0) 2018.09.03
[JAVA]06-04.String  (0) 2018.09.03
[JAVA]06-03.Throw 예외처리, 커스텀 예외처리  (0) 2018.09.03
[JAVA]06-01.중첩 클래스, 중첩 인터페이스  (0) 2018.09.03

1.중첩 클래스


중첩 클래스란 클래스 안의 클래스라고 보면 된다.


중첩 클래스는 바깥의 클래스에 접근하기 용이하고 다른 사람이 읽기에도 좀 더 편리하며


유지 보수에도 효율적이다.


인스턴스, 정적, 로컬 멤버가 있으며 다음 예제를 통해 확인해보자.

package chap07.exam01.overClass;

public class Exclass {
	public Exclass() {
		System.out.println("외부 클래스 생성");
	}
	
	// 1. 인스턴스 멤버 - 객체화 해야 사용 할 수 있는 클래스 (클래스 영역에 생성)
	
	public class InsClass {
		public InsClass() {
			System.out.println("인스턴스 멤버 생성");
		}
		int field = 0;
		void method() {
			System.out.println(field + "을 출력하는 메서드");
		}
	}
	
	// 2. 정적 멤버 - 객체화를 하면 사용 할 수 없는 클래스

	public static class StaticClass{
		public StaticClass() {
			System.out.println("인스턴스 멤버 생성");
		}
		int field = 0;
		void method() {
			System.out.println(field + "을 출력하는 메서드");
		}
		
		static int sfield = 0;
		static void smethod() {
			System.out.println(sfield + "을 출력하는 메서드");
		}
	}
	
	// 3. 로컬멤버 - 메서드가 실행되어야 사용할 수 있는 클래스
	
	void localMethod() {
		// 메서드 안에서만 사용 할 수 있는 클래스
		// 메서드 안에서 선언 생성 전부 해야한다.
		class Local{
			Local(){
			System.out.println("Local 객체 생성");
			}
			int field = 0;
			void method() {
				System.out.println(field + "을 출력하는 메서드 실행");
			}
		}
		Local lo = new Local();
		lo.field = 10;
		lo.method();
	}
}


package chap07.exam01.overClass;

import chap07.exam01.overClass.Exclass.InsClass;

public class Main {

	public static void main(String[] args) {
		// Exclass에 있는 InsClass 사용 하기
		Exclass ex = new Exclass();
		Exclass.InsClass ins = ex.new InsClass();
		// Exclass를 import를 통해서 명시 하여도 됨
		InsClass ins2 = ex.new InsClass();
		ins.field = 3;
		ins2.field = 4;
		ins.method();
		ins2.method();
		
		System.out.println();
		
		
		
		// Static 멤버 가져오기, static 멤버의 static도 객체화 하지 않아야 접근 가능
		Exclass.StaticClass.sfield = 40;
		Exclass.StaticClass.smethod();
		// field와 method 호출 해 보기
		Exclass.StaticClass sta = new Exclass.StaticClass();
		sta.field = 99;
		sta.method();
		
		System.out.println();
		
		// Local member 호출
		ex.localMethod();
	}

}



2.중첩 인터페이스


인터페이스는 중첩 클래스의 인터페이스 버전으로 생각하면 된다.


중첩 클래스와 같이 직관적으로 보이고 특징들은 비슷하다.


예제를 통해 이해해보자.



package chap07.exam02.overInter;

public class Element {
	
	EventListener listener;
	
	void regist(EventListener listener) { // 특정 감시자를 등록
		this.listener = listener;
	}
	
	void trigger() {
		listener.call();
	}

	// Element와 EventListener의 관계가 직관적으로 보인다.
	interface EventListener{
		void call(); // 이벤트 발생 시 호출 할 메소드 구현
	}
	
}

package chap07.exam02.overInter;

public class Main { // 중첩인터페이스

	public static void main(String[] args) {
		// Element에 Listener 등록
		// 이벤트 발생 시 어떻게 되나?
		Element ele = new Element();
		ele.regist(new OnClickListener());
		
		ele.trigger();
		

		Element ele2 = new Element();
		ele2.regist(new OnKeyListener());
		
		ele2.trigger(); // 이벤트 발생 시 호출 할 메소드 구현
	}

}


'개념 및 코딩 > 06.기타' 카테고리의 다른 글

[JAVA]06-06.Generic  (0) 2018.09.03
[JAVA]06-05.Object  (0) 2018.09.03
[JAVA]06-04.String  (0) 2018.09.03
[JAVA]06-03.Throw 예외처리, 커스텀 예외처리  (0) 2018.09.03
[JAVA]06-02.예외처리 instance of, try catch  (0) 2018.09.03

1.익명객체, anony


익명객체란 클래스의 객체화 할 때 메소드를 임시로 생성하는 것이다.


실체가 없다고도 하며 한 두번 쓰이고 말 때에 작성한다. 그리고 일반적으로 static 영역에 만들어지지만


익명 개체는 heap영역에 올라간다. 클래스의 특징인 재사용을 할 필요가 없다면 익명객체가 좀 더 효율적이라고 볼 수 있다.



package chap06.exam06.anony;

import chap06.exam05.poly.Common;
import chap06.exam05.poly.CommonImpl;

public class Main {

	public static void main(String[] args) {
		
		// 익명 개체
		// 일반적인 객체 메서드 사용
		CommonImpl impl = new CommonImpl();
		impl.test1();
		
		// 익명 = 이름이 없다. = 실체가 없다. -> 한번만 쓰고 버리는 경우
		// 클래스는 static 메모리에 만들어지는데 익명 개체는 heap영역에 올려짐
		Common com = new Common() {
			
			@Override
			public void test2() {
				System.out.println("TEST 2");
			}
			
			@Override
			public void test1() {
				System.out.println("TEST 1");
			}
		};
		
		// 익명객체 = 단일클래스에서 한번 쓸 경우
		// 여러 클래스에서 객체를 원할 경우는 비효율적이다.
		com.test1();
		com.test2();
	}

}




2.결합도, Coupling


결합도란 클래스가 얼마나 똘똘 뭉쳐있냐라고 할 수 있다.


클래스의 중요한, 기능들을 공유하는 특징을 여러 클래스를 만들어 분산하였다면 결합도가 낮은것이고


한 두개의 적은 클래스 파일에 많은 기능을 집어 넣었다면 결합도가 높은것이다.


결합도가 낮은 코딩이 재사용, 객체지향의 특징을 더욱 살렸다고 보며 상황에 따라 다를 수도 있지만 더 잘 코딩했다고 한다.


특히 결합도가 낮으면 클래스 하나하나가 복잡하지 않고 보기 쉬울것이며


그러한 이유로 유지보수에 좀 더 효율적이라 볼 수 있다.

'개념 및 코딩 > 05.상속' 카테고리의 다른 글

[JAVA]05-05.추상클래스, 인터페이스  (0) 2018.08.30
[JAVA]05-04.다형성 배열, 활용  (0) 2018.08.29
[JAVA]05-03.다형성  (0) 2018.08.29
[JAVA]05-02.오버라이드  (0) 2018.08.27
[JAVA]05-01.상속  (0) 2018.08.24

+ Recent posts