default 인터페이스, 메소드
default 메소드 강제성이 없다.
인터페이스에 선언할 때 { } 몸통이 있음
클래스에 인터페이스에 추가할 때 좋음
기존 코드에 추가 할 때 용이
인터페이스
package exam0615;
// default 메소드
public interface TestInterface {
void method();
default void method2() { // default 메소드 강제성이 없다.
System.out.println("method2");
}
}
실행
package exam0615;
public class TestEx {
public static void main(String[] args) {
MyInterface mi = new MyClassB();
mi.method2();
}
}
<결과>
MyInterface-method2
인터페이스
package exam0615;
public interface MyInterface {
void method1();
default void method2() {
System.out.println("MyInterface-method2");
}
}
구현 객체 1
package exam0615;
public class MyClassA implements MyInterface {
@Override
public void method1() {
System.out.println("MyClassA-method1");
}
}
구현 객체 2
package exam0615;
public class MyClassB implements MyInterface {
@Override
public void method1() {
System.out.println("method1");
}
}
default 인터페이스, 메소드 ( 람다식 )
인터페이스
package exam0615_2;
@FunctionalInterface// 인터페이스에 추상메소드 한개만 사용 가능 ( 람다식 개념 )
// default 인터페이스 가능
public interface MyInterface {
void method();
// void aaa();
}
실행
package exam0615_2;
public class MyInterfaceEx {
public static void main(String[] args) {
MyInterface my = new MyInterface() {
@Override
public void method() {
System.out.println("my");
}
};
my.method();
// 람다식
my = () -> {System.out.println("my1");};
my.method();
my = () -> {System.out.println("my2");};
my.method();
}
}
<결과>
my
my1
my2
인터페이스, 메소드 ( 람다식 )
인터페이스
package exam0615_2;
public interface MyInterface2 {
int method(int x, int y);
}
실행
package exam0615_2;
public class MyInterfaceEx2 {
public static void main(String[] args) {
MyInterface2 my3 = new MyInterface2() {
@Override
public int method(int x, int y) {
System.out.println(x+y);
return x+y;
}
};
MyInterface2 my2 = (x,y) -> {
System.out.println(x+y);
return x+y;
};
my3.method(3, 4);
my2.method(5, 6);
int res = my3.method(20, 30);
System.out.println(res);
MyInterface2 my4 = (a, b) -> {return a+b;};
res = my4.method(100, 200);
System.out.println(res);
}
}
<결과>
7
11
50
50
300
예외 직접 만들기 => 처리
예외 상속 ( 예외 만들기 )
package exam0615_3;
// 예외 상속
public class TestException extends Exception {
public TestException(String msg) {
super(msg);
}
}
예외 처리
package exam0615_3;
// 예외 처리
public class Test {
private int x;
public int getX() {
return x;
}
public void setX(int x) throws TestException {
if(x < 0) {
throw new TestException("x는 0보다 커야 합니다.");// 예외 생성 (예외 메세지 작성)
}
this.x = x;
}
}
실행
package exam0615_3;
public class TestEx {
public static void main(String[] args) {
Test test = new Test();
try {
test.setX(-100);
} catch (TestException e) {// 만든 예외
// TODO Auto-generated catch block
// e.printStackTrace();
System.out.println(e.getMessage());// 예외 메세지 출력
}
//작성 했던 예외 메세지 나옴
//exam0615_3.TestException: x는 0보다 커야 합니다.
// at chap10/exam0615_3.Test.setX(Test.java:13)
// at chap10/exam0615_3.TestEx.main(TestEx.java:8)
}
}
<결과>
x는 0보다 커야 합니다.
배열 예외 처리
선언 및 실행
package exam0615_4;
public class TryEx {
public static void main(String[] args) {
String[] strArray = {"10","2a"};
int value = 0;
for(int i=0; i<=2; i++) {
try {
value = Integer.parseInt(strArray[i]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("인덱스를 초과했음");
}catch (NumberFormatException e) {
System.out.println("숫자로 변화할 수 없음");
} finally {
System.out.println(value);
}
}
}
}
<결과>
10
숫자로 변화할 수 없음
10
인덱스를 초과했음
10
배열 예외
선언 및 실행
package sec01.exam01;
public class ArrayEx {
public static void main(String[] args) {
//ArrayIndexOutOfBoundsException 에러
if(args.length != 2) {
System.out.println("매개 값이 부족 합니다.");
System.exit(0);
}
String data = args[0];
String data1 = args[1];
System.out.println(args.length);
System.out.println("args[0] : " + data);
System.out.println("args[1] : " + data1);
}
}
<결과>
2
args[0] : 10
args[1] : 20
Number 예외
package sec01.exam01;
public class NumberFormatEx {
public static void main(String[] args) {
// int로 변경 가능
String data1 = "100";
int var1 = Integer.parseInt(data1);
System.out.println(var1);
// 에러 int로 변경 불가
String data2 = "100as";
int var2 = Integer.parseInt(data2);
System.out.println(var1);
// NumberFormatException 예외 발생
}
}
Null 예외
package sec01.exam01;
public class NullEx {
//실행 예외
public static void main(String[] args) {
// 컴파일러가 오류 잡음
// String data = null;
// System.out.println(data.toString());
//NullPointerException 예외 발생
String data2 = null;
System.out.println(data2.toString());
//NullPointerException 예외 발생
// 값이 null인지 비교
String data3 = null;
if(data3 != null) {
System.out.println(data3.toString());
}else {
System.out.println("값이 null이 아님");
}
//NullPointerException 예외 발생
}
}
Class 예외
package sec01.exam02;
class Animal{} // 부모
class Dog extends Animal{}// 자식
class Cat extends Animal{}// 자식
public class ClassCastEx {
//매개변수가 부모타입
public static void changeDog(Animal animal) {
// Dog dog = (Dog) animal; // 강제 형변환
if(animal instanceof Dog) {
Dog dog = (Dog) animal;
}else {
System.out.println("안됩니다.");
}
}
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
// 가능
changeDog(dog);
//ClassCastException 에러
// changeDog(cat);
}
}
예외 떠넘기기 throws
package sec01.exam03;
public class ThrowsEx {
// 예외 떠넘기기
public static void findClass() throws ClassNotFoundException {
Class.forName("shdg.fnjgs.dghj");
}
// public static void main(String[] args) throws ClassNotFoundException {
// findClass();
// // ClassNotFoundException: 에러
// System.out.println("여기");
// }
public static void main(String[] args) {
try {
findClass();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// ClassNotFoundException: 에러
System.out.println("여기");
}
}
배열 다중 catch
package sec01.exam03;
public class TryCatchFinallyRuntimeEx {
// 다중 catch
public static void main(String[] args) {
String data1 = null;
String data2 = null;
try {
data1 = args[0];
data2 = args[1];
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(value1 + "+" + value2 + "=" + result);
} catch (ArrayIndexOutOfBoundsException e) {// <= 배열 예외 생겼을때 처리
System.out.println("실행 매개값의 수가 부족합니다.");
} catch (NumberFormatException e) {// <= 문자열로 되어 있는 데이터를 숫자로 변경할때 예외 처리
e.printStackTrace();
System.out.println("숫자로 변화할 수 없습니다.");
}finally {// <= 항상 실행
System.out.println("다시 실행 하세요.");
}
}
}
<결과>
90+80=170
다시 실행 하세요.
try, catch 예외 처리 코드 basic
package sec01.exam03;
public class TryEx {
//try, catch 예외 처리 코드 basic
public static void main(String[] args) {
try {
Class.forName("java.leng.String2");// 해당 파일 존재하지 않음
} catch (ClassNotFoundException e) { // <= 해당 위치에 오류코드 넣기
e.printStackTrace();// 오류 코드 확인
System.out.println("클래스가 존재하지 않습니다.");
//System.out.println(e.getMessage());
// TODO Auto-generated catch block
// e.printStackTrace();
}
}
}
<실행>
java.lang.ClassNotFoundException: java.leng.String2
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at chap10/sec01.exam03.TryEx.main(TryEx.java:7)
클래스가 존재하지 않습니다.
기본 API 클래스
java.lang 패키지
java.lang 패키지는 자바 프로그램의 기본적인 클래스를 담고 있는 패키지이다.
패키지에 있는 클래스와 인터페이스는 import 없이 사용할 수 있다.
자바 API 도큐먼트
API ( Aplication Programming Interface )는 API 라이브러리라고 부르기도 하는데, 프로그램 개발에 자주 사용
되는 클래스 및 인터페이스 모음을 말한다.
https://docs.oracle.com/en/java/javase/ 해당 URL에서 버전별로 볼 수 있다.
Object 클래스
객체 비교(equals())
Object 클래스 비교
package sec01.exam01;
public class Ex01 {
public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
boolean result1 = obj1.equals(obj2);
// System.out.println(result1); // false
boolean result2 = (obj1 == obj2);
System.out.println(result2); // false
}
}
객체 동등 비교 ( 선언 )
package sec01.exam01;
public class Member {
String id;
public Member(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member) { // 매개값이 Member 타입인지 확인
Member member = (Member) obj;
if (id.equals(member.id)) {
return true;
}
}
return false;
}
}
객체 동등 비교 ( 실행 )
package sec01.exam01;
public class MemberEx {
public static void main(String[] args) {
Member obj1 = new Member("blue");
Member obj2 = new Member("blue");
Member obj3 = new Member("red");
if(obj1.equals(obj2)) {
System.out.println("obj1와 obj2는 같다.");
}else {
System.out.println("obj1와 obj2는 틀리다.");
}
}
}
<결과>
obj1와 obj2는 같다.
package sec01.exam01;
public class SString {
public static void main(String[] args) {
// String str1 = new String("test");
// String str2 = new String("test");
// if(str1 == str2) {
// System.out.println("같다");
// }else {
// System.out.println("다르다");
// } // 결과 : 다르다.
String str1 = new String("test");
String str2 = new String("test");
if(str1.equals(str2)) {
System.out.println("같다");
}else {
System.out.println("다르다");
} // 결과 : 같다.
}
}
객체 해시코드
객체 해시코드란 객체를 식별하는 하나의 정수값을 말한다. 객체의 메모리 번지를 이용해서 해시코드를 만들어
리턴하기 때문에 객체마다 다른 값을 가지고 있다.
선언
package sec01.exam01;
import java.util.Objects;
//해쉬코드
public class Key {
int number;
public Key(int number) {
this.number = number;
}
// 1 번
// @Override // 해쉬 코드 재정의
// public int hashCode() {
// return number;//
// // 해쉬값을 int값으로 바꿔줌
// }
// 2번
@Override
public boolean equals(Object obj) {
if(obj instanceof Key) {
Key c = (Key) obj;
if(this.number == c.number) {
return true;
}
}
return false;
}
// 2번
public int hashCode() {
return number;
}
}
호출
package sec01.exam01;
import java.util.HashMap;
public class KeyEx {
public static void main(String[] args) {
// 1번
// Key key1 = new Key(100);
// Key key2 = new Key(100);
// System.out.println(key1.hashCode());
// System.out.println(key2.hashCode());
// 2번
HashMap< Key, String > hashmap = new HashMap<Key, String>();
hashmap.put(new Key(1), "홍길동");
String name = hashmap.get(new Key(1));
System.out.println(name);
}
}
HashMap
package sec01.exam01;
import java.util.HashMap;
public class HashMapEx {
public static void main(String[] args) {
//제네릭 <Integer(키값), String(출력물)>
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "한국");// put 값 넣기
map.put(2, "미국");
map.put(3, "일본");
String val = map.get(2);// get 값 출력
System.out.println(val);// get(2) 미국 출력
}
}
<결과>
미국
제네릭
선언
package sec01.exam01;
// 제네릭
public class NewBox<T> {
private T t;
public T get() {
return t;
}
public void set(T t) {
this.t = t;
}
}
실행
package sec01.exam01;
public class NewBoxEx {
public static void main(String[] args) {
// <클래스> 클래스만 가능
NewBox<String> newBox = new NewBox<String>();
newBox.set("홍길동");
String name = newBox.get();
System.out.println(name);
NewBox<Apple> newBox2 = new NewBox<Apple>();
newBox2.set(new Apple());
Apple apple = newBox2.get();
System.out.println(apple);
NewBox<Integer> a3 = new NewBox<Integer>();
a3.set(100);
int res = a3.get();
System.out.println(res);
}
}
<결과>
홍길동
sec01.exam01.Apple@1e643faf
100
'프로젝트 기반 자바(JAVA) 응용 SW개발자 취업과정' 카테고리의 다른 글
JDBC_설정(MariaDB, 이클립스) (1) | 2023.06.17 |
---|---|
2023-06-16 21일차 (0) | 2023.06.16 |
2023-06-14 19일차 (0) | 2023.06.14 |
2023-06-13 18일차 (0) | 2023.06.13 |
2023-06-12 17일차 (1) | 2023.06.12 |