웹_프론트_백엔드/단과

[단과_JAVA_심화반] 2020.08.27

shine94 2020. 8. 28. 00:53

1. 예외처리 예제
** com.lec.java.exception > ExceptionTest.java

package com.lec.java.exception;

public class ExceptionTest {

	public static void main(String[] args) {

		// try catch문 : try로 감쌀 문장 블록 + Alt + Shift + Z
		try {
			System.out.println(10/0);
		} catch (Exception e) {
			System.out.println("0으로 나눌 수 없습니다.");
			
			// 객체를 출력할때 언제나 toString()이 생략된 것임
			System.out.println(e);
			System.out.println(e.toString());
		}
		
		System.out.println("반드시 출력되어야 하는 문장");
		
	} // end main()
	
} // end class

 

 

2. 예외처리 문제

 : 5개의 정수만 입력 받기
   단 5개 이상의 정수도 입력은 가능하다.
   (예외처리를 사용해라)

 

[내 코드]

** com.lec.java.exception > ExceptionTaskMe.java

package com.lec.java.exception;

import java.util.Scanner;

public class ExceptionTaskMe {
	public static void main(String[] args) {
		// 5개의 정수만 입력 받기
		// 단 5개 이상의 정수도 입력은 가능하다
		Scanner sc = new Scanner(System.in);
		
		int index = 0;
		int[] arData = new int[5];
		
		while(true) {
			
			try {
				System.out.print("숫자를 입력해주세요(단, 0을 입력하면 프로그램이 종료됩니다.) : ");
				arData[index] = sc.nextInt();
				
				if(arData[index] == 0) {break;}
			} catch (Exception e) {
				System.out.println("5개를 초과할 수 없습니다.\n더 이상 입력할 수 없습니다.");
				break;
			}
			
			index++;
			
		} // end while()
		
		System.out.println("프로그램 종료");
		
	} // end main()
	
} // end class

 

[강사님 코드]

** com.lec.java.exception > ExceptionTaskTeacher.java

package com.lec.java.exception;

import java.util.Scanner;

public class ExceptionTaskTeacher {
	
	public static void main(String[] args) {
		// 5개의 정수만 입력받기
		// 단, 5개 이상의 정수도 입력은 가능하다.
		int[] arData = new int[5];
		Scanner sc = new Scanner(System.in);
		String msg = "번째 정수 입력 : ";
		
		int idx = 0;
		String temp = null;
		
		System.out.println("나가기 : q");
		
		while(true) {
			System.out.print(++idx + msg);
			temp = sc.next();
			if(temp.equals("q")) {break;}
			
			try {
				arData[idx - 1] = Integer.parseInt(temp);
			} catch (NumberFormatException e) {
				System.out.println("정수만 입력하세요.");
				idx--;
			} catch (ArrayIndexOutOfBoundsException e) {
				System.out.println("더 이상 정수를 입력할 수 없습니다.");
				break;
			}
		}
		
	}
	
}

 

 

3. Interface는 틀이다.

 

4. API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)
 : 선배 개발자들이 개발해놓은 클래스나 패키지를 통틀어 호칭하는 용어
   즉, JAVA에서 기능을 쉽게 구현할 수 있도록 만들어 놓은 패키지 혹은 클래스이다.

   (보통 API는 .jar파일로 구성)


1) 기본 API
 : JAVA에서 기본적으로 제공하는 패키지


2) 외부 API(무료, 유료)
 : JAVA에서 제공하지는 않지만 다른 업체에서 제공하는 패키지

   ex) 쿨에스엠에스: www.coolsms.co.kr/ Kakao Developers: developers.kakao.com/

 


5. 어노테이션 주석
 : API 제작시 각 클래스와 메소드에 설명글을 작성할 때에는 일반 주석으로는 배포할 수 없다.
   따라서 API document에서는 어노테이션 주석만 인식하기 때문에 반드시 어노테이션 주석으로 설명글을 작성한다.
   
   /**       */
   API document에서 어노테이션 주석 안에서는 JAVA 문법이 작동하지 않는다.
   따라서 javadoc문법에 맞춰서 작성해야 한다.

 


6. 어노테이션 태그에서 사용할 수 있는 문법
   @author : 개발자 이름
   @exception : 메소드에서의 예외 확인
   @param : 메소드의 매개변수
   @return : 메소드의 리턴값
   @see : 참고할 수 있는 클래스 링크 추가
   @since : JDK 버전 기준
   @throws : 발생할 수 있는 예외
   @version : 1.n

 


7. javadoc 문서 만들기
 : .java 파일 우클릭 > Export... 클릭

> java 폴더 안에 javadoc 선택 후 Next 클릭

> javadoc command는 jdk/bin/javadoc.exe 설정, destination는 실제로 javadoc를 저장할 경로 설정 후 finish 클릭

> javadoc 문서 완성...!

[추가] doc.zip의 index.html로 들어가면 javadoc를 볼 수 있다.

doc.zip
0.02MB

[추가] 배포하려면 .jar 파일과 함께 javadoc 문서를 만들어서 넘겨주면 된다.

 

 

8. API 예제

** com.lec.java.api > Calc.java

package com.lec.java.api;
/**
 * 
 * @author 박빈나
 * @since JDK8
 * <br>Calculator 
 */
public class Calc {
	
	/**
	 * To divide the following integers.<br>
	 * For example<br>
	 * <code>div(10, 3) : 3</code>
	 * 
	 * @param num1 : First Integer for divide
	 * @param num2 : Last Integer for divide
	 * @see Math
	 * @return int
	 * @throws ArithmeticException
	 */
	public int div(int num1, int num2) {
		return num1 / num2;
	}
	
}

 

[추가] 어노테이션 주석 작성시 아래의 그림과 같이 확인할 수 있다.

 

 

9. Object 클래스
1) toString()
 : 객체를 사용할 때 항상 뒤에 붙여서 사용되고 생략이 가능하다.
   객체명을 출력할 때 사용자가 원하는 값을 출력하고 싶다면
   해당 클래스에서 toString()을 재정의하여 리턴값을 변경한다.

2) equals()
   객체간의 주소값을 비교할 때 사용한다.
   단, String 클래스에서는 equals()를 값을 비교하는 기능으로 재정의하였다.

   [참고] == : 주소 비교

3) hashCode()
 : 객체가 가지고 있는 주소값
   단, String 클래스에서는 hashCode()가 재정의 되어 있다.
   따라서 가지고 있는 문자열 값이 같다면 모든 객체의 hachCode()가 같게 나온다.

 

 

10. Object 클래스 예제

[equals(), ObjecthashCode() 재정의 전]

** com.lec.java.obj > Student.java

package com.lec.java.obj;

public class Student {
	
	int num;
	String name;
	
	public Student(int num, String name) {
		super();
		this.num = num;
		this.name = name;
	}

} // end class

 

** com.lec.java.obj > School.java

package com.lec.java.obj;

public class School {
	
	public static void main(String[] args) {
		Student std1 = new Student(1, "박빈나");
		Student std2 = new Student(1, "박빈나");
		
		// Object의 equals()는 주소 비교, ObjecthashCode()는 객체가 가지고 있는 주소값 
		// 여기서는 같은 학생인지 비교와 번호 비교가 필요함
		// 이럴때 필요한 것이 equals(), hashCode() 재정의 필요
		System.out.println("std1.hashCode() : " + std1.hashCode());
		System.out.println("std2.hashCode() : " + std2.hashCode());
		System.out.println("std1.equals(std2) : " + std1.equals(std2));
	} // end main()

} // end class

 

[equals(), ObjecthashCode() 재정의 후]

** com.lec.java.obj > Student.java

package com.lec.java.obj;

public class Student {
	
	int num;
	String name;
	
	public Student(int num, String name) {
		super();
		this.num = num;
		this.name = name;
	}
	
	// equals(), hashCode() 재정의
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Student) {
			Student std = (Student) obj;
			if(this.num == std.num) {
				return true;
			}
			return false;
		}
		return false;
	}
	
	@Override
	public int hashCode() {
		return this.num;
	}

} // end class

 

** com.lec.java.obj > School.java

package com.lec.java.obj;

public class School {
	
	public static void main(String[] args) {
		Student std1 = new Student(1, "박빈나");
		Student std2 = new Student(1, "박빈나");
		
		// Object의 equals()는 주소 비교, ObjecthashCode()는 객체가 가지고 있는 주소값 
		// 여기서는 같은 학생인지 비교와 번호 비교가 필요함
		// 이럴때 필요한 것이 equals(), hashCode() 재정의 필요
		System.out.println("std1.hashCode() : " + std1.hashCode());
		System.out.println("std2.hashCode() : " + std2.hashCode());
		System.out.println("std1.equals(std2) : " + std1.equals(std2));
	} // end main()

} // end class

 

 

 

11. String Constant Pool영역은 Heap영역에서 String 객체를 위해 별도로 관리하는 장소

     java 6 버전까지 Perm 영역이었으나 Perm 영역은 고정된 사이즈이며 Runtime 에 사이즈가 확장되지 않는다.
    그래서 intern 되는 String 값이 커지면 OutOfMemoryException을 발생시킬 수 있었고

    이를 방지하기 위해 java 7 버전에서는 String Constant Pool의 위치를 Heap 영역으로 변경했다.

 

 

12. Object 클래스 예제

** com.lec.java.obj > Obj_test.java

package com.lec.java.obj;

import java.util.Random;

public class Obj_test {
	
	public static void main(String[] args) {
		// new를 통해 String을 생성하면 Heap 영역에 존재하게 되고
		String str1 = new String("ABC");
		String str2 = new String("ABC");
		// 주소는 다르나
		System.out.println("str1 == str2 : " + (str1 == str2));
		// 내용은 같음
		System.out.println("str1.equals(str2) : " + str1.equals(str2));
		
		// Heap 영역에 무조건 새롭게 생성된다.
		
		// 리터럴을 이용한 경우 constant pool이라는 영역에 존재하게 된다.
		String str3 = "ABC";
		String str4 = "ABC";
		// 주소도 같고
		System.out.println("str3 == str4 : " + (str3 == str4));
		// 내용도 같음
		System.out.println("str3.equals(str4) : " + str3.equals(str4));
		
		// constant pool 영역은 일치하는 값이 있다면 그 값의 주소들을 공유한다.
		// (즉, 새로 만드는 것이 아니라 만들어진 공간의 주소를 공유한다.)
		
		System.out.println("-----------------------------------------");
		System.out.println("str1 == str3 : " + (str1 == str3));
		System.out.println("str1 == str4 : " + (str1 == str4));
		System.out.println("str2 == str3 : " + (str2 == str3));
		System.out.println("str2 == str4 : " + (str2 == str4));
		System.out.println("-----------------------------------------");
		
		System.out.println(str1.hashCode());
		System.out.println(str2.hashCode());
		System.out.println(str3.hashCode());
		System.out.println(str4.hashCode());
		
		Random r1 = new Random();
		Random r2 = new Random();
		
		System.out.println("-----------------------------------------");
		System.out.println("r1.hashCode() : " + r1.hashCode());
		System.out.println("r2.hashCode() : " + r2.hashCode());

		System.out.println("-----------------------------------------");
		System.out.println("r1.hashCode() : " + r1.toString());
		System.out.println("r2.hashCode() : " + r2.toString());
		
		Object obj = new Object();
		System.out.println("-----------------------------------------");
		System.out.println(obj.hashCode());
		System.out.println(obj.toString());
		
	} // end main()

} // end class

 

[추가] 위의 코드 메모리 영역

 

 

13. C언어는 자료구조를 만드는데 포커스가 되어 있고 java는 자료구조를 사용하는데 포커스가 되어 있다.

 


14. Wrapper class
 : 기본형 타입의 객체화를 가능하게 도와주는 클래스
   
   Wrapper클래스 타입 = new 생성자(일반타입) : 박싱(boxing)
   일반 타입 = Wrapper클래스 타입.일반타입Value() : 언박싱(unboxing)
   
   [JDK 5 버전 이후부터는 오토(auto)를 지원한다]
   Wrapper클래스 타입 = 일반 타입; : 오토박싱(auto boxing)
   일반 타입 = Wrapper클래스 타입; : 오토언박싱(auto unboxing)

 

** 박싱(boxing) : 기본형 값들을 객체로 변환하는 작업

** 언박싱(unboxing) : 변환된 객체를 기본형 값으로 변환하는 작업

 


15. Wrapper class를 사용하는 이유

   ① 편리한 메소드를 사용하기 위해서

   ② 객체로만 사용이 가능할 때

 

 

16. Wrapper class 예제

** com.lec.java.wrapperClass > WrapperClass.java

package com.lec.java.wrapperClass;

public class WrapperClass {

	public static void main(String[] args) {
		int data = 10;
		
		// boxing
		Integer data_I = new Integer(data);
		System.out.println(data_I);
		
		// unboxing
		data = data_I.intValue();
		System.out.println(data);
		
		// 위의 같은 방식은 너무 너무 너무 번거롭다
		// 번거로움을 극복하기 위해 JDK 5 버전 이후부터는 오토(auto)를 지원한다.
		int data_auto= 20;
		
		// auto boxing
		Integer data_auto_I = data_auto;
		System.out.println(data_auto_I);
		
		// auto unboxing
		data_auto = data_auto_I;
		System.out.println(data_auto);
		
	} // end main()
	
} // end class

 

** com.lec.java.wrapperClass > WrapperClass2.java

package com.lec.java.wrapperClass;

public class WrapperClass2 {
	
	public static void main(String[] args) {
		// 다른 타입은 배열로 담을 수 없다.
		// 그러나 아래의 방법을 이용하면 담을 수 있다.
		Object[] datas = {3, 3.0, 'A', "ABC", true};
		
		// 위의 datas들에서 사용된 기술
		// 1. up-casting
		// 2. auto-boxing
		
		// auto-boxing 사용하지 않는다면...!!
		Object[] datasNoAuto = {new Integer(3), new Double(3.0),
				new Character('A'), new String("ABC"), new Boolean(true)};
		
		// 빠른 for문(forEach문, 향상된 for문)을 이용하여 저장된 데이터 출력하기
		System.out.println("빠른 for문 : datas");
		for(Object obj : datas) {
			System.out.print(obj + " ");
		}
		
		System.out.println();
		System.out.println();
		System.out.println("빠른 for문 : datasNoAuto");
		for(Object obj : datasNoAuto) {
			System.out.print(obj + " ");
		}
		
	} // end main()

} // end class

 


17. 빠른 for문(forEach문, 향상된 for문)
   for(자료형 변수명 : iterator){
   
   }

 

 

18. 빠른 for문(forEach문, 향상된 for문) 예제

** com.lec.java.forEach > ForEachTest.java

package com.lec.java.forEach;

public class ForEachTest {

	public static void main(String[] args) {
		// 2차원 배열을 빠른 for문 사용
		// 총점과 평균을 구하기
		int[][] arrScore = {
				{10, 20, 30},
				{11, 25, 39},
				{12, 26, 38},
				{13, 27, 37},
				{14, 28, 36}
		};
		
		double avg = 0.0;
		
		for(int[] arScore : arrScore) {
			int total = 0;
			for(int score : arScore) {
				total += score;
			}
			avg = (double)total / arScore.length;
			System.out.println("총점 : " + total + "점");
			System.out.println("평균 : " + avg + "점");
			System.out.println("===================");
		}
		
	} // main()
	
} // class



19. 다음 수업 내용 : 제네릭, 컬렉션 프레임워크