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를 볼 수 있다.
[추가] 배포하려면 .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. 다음 수업 내용 : 제네릭, 컬렉션 프레임워크
'웹_프론트_백엔드 > 단과' 카테고리의 다른 글
[단과_JAVA_심화반] 2020.09.18 (0) | 2020.09.21 |
---|---|
[단과_JAVA_심화반] 2020.09.17 (0) | 2020.09.18 |
[단과_JAVA_심화반] 2020.08.25 (0) | 2020.08.25 |
[단과_JAVA_심화반] 2020.08.11 (0) | 2020.08.13 |
[단과_자료구조] 2020.08.05 (0) | 2020.08.10 |