자바에서는 개발자들의 구현부담을 최소화하기 위해서 시스템, 입출력, 화면처리, 네트워크, 스레드등을 구현할 때 필요한 클래스 / 인터페이스(표준안)나 클래스들을 미리 구현해서 제공하고 있는데 이것을 JavaAPI라고 한다. ->즉, 미리 구현 해둔 것
다른 언어들로 이뤄진 API가 있다.
String, Scanner, System 등 자바에서 제공하는 라이브러리들이 많이 존재한다.
API문서
Java API에서 제공하는 여러인터페이스나 클래스들에 대한 설명 및 사용법을 제공하는 문서이다. - java도큐먼트라고 불린다.
소스코드에서 Document주석을 사용해서 설명이나 사용법을 추가해놓으면, javadoc.exe를 이용하여 javaAPI문서가 자동으로 실행된다. API문서를 생성할 수 있다.
이클립스는 해당프로젝트에서 export->java->javadoc의 기능을 이용해서 API문서를 생성할 수 있다.
마우스 오른쪽 export -> java -> javadoc을 이용하면 API문서가 자동으로 만들어진다.
API문서는 HTML형식의 문서로 자동으로 작성한다.
API Module ->Package ->Interface class로 나눈다.
API구성
자바 9버젼부터 Module이 지원된다.
Java SE 11 API 는 moule -> package ->interface ->내부 class가 들어 있다.
JAVA SE 11 API는 Desktop에서 실행할 수 있는 응용프로그램 개발에 필요한 java API를 제공한다.
여러 Module로 구성되어 있다.
Module
java 9버젼부터 지원하는 자바의 새로운 그룹화 방식이다.
java.base 모듈이 가장 많이 사용되는 모듈이다.
하나의 모듈은 여러가지 패키지를 포함하고 있다.
자바의 모든 API를 가지고와서 사용할 경우 문제점은 한번도 사용하지 않을 라이브러리를 가져와서 사용해야한다는것이다.
필요한 모듈만 지정해서 사용하고 싶다. 불필요한 라이브러리는 사용하고 싶지않아 자바9 버젼이상부터는 모듈이 생성되었다.
Package
관련있는 클래스나 인터페이스의 묶음이다.
같은 패키지 내의 클래스들끼리는 import없이 다른 클래스를 사용할 수 있지만, 패키지가 다른경우에는 반드시 import구문을 사용해서 포함시킬 클래스의 패키지명과 클래스명을 지정해야한다.
대표적인 패키지는 4가지가 있다.
java.lang
java.io
java.net
java.util
java.lang
가장 인터페이스와 클래스를 포함하는 패키지이다.
이패키지의 인터페이스나 클래스는 구문없이 바로 사용할 수 있다.
Object, System,String, Wrapper클래스들을 포함하고 있다.
java.io
입출력과 관련된 인터페이스, 클래스들을 포함하고 있는 패키지 이다.
XXXInputStream, XXXOutPutStream,XXXReader,XXXWriter클래스를 포함하고 있다.
java.net
네크워크 통신을 지원하는 인터페이스, 클래스들을 포함하고 이쓴ㄴ 패키지이다.
Socket, ServerSocket, Url등의 클래스들을 포함하고 있다.
java.util
자료구조, 날짜/시간등을 다루는 유용한 클래스들을 포함하고 있는 패키지 이다.
어플리케이션구현에서 가장 많이 사용하는 패키지이다.
Collection,List,Set(자료구조 ) , map,Date,Calender(시간정보) 이다.
java.lang
자바의 가장 기본적인 인터페이스, 클래스를 포함하고 있는 패키지이다.
Object
모든 객체의 최상위부모클래스다
Object클래스의 메소드는 모든 객체에서 사용가능하다.
Class
객체의 설계도 정보를 표현하는 클래스다
클래스명, 필드, 생성자, 메소드의 정보를 포함하고 있는 객체이다,
자바->플렉션기술을 이용하여 설계도 정보를 획득할 수 있다
Boolean character,Integer, Double,Byte,Short
Wapper클래스이다.
기본자료형타입의 값을 객체로 표현할 때 사용되는 클래스이다.
String,StringBuffer,StringBuilder
String은 문자열을 표현하는 클래스다.
문자열을 조작하는 다양한 메소드를 포함하고 있다.
StringBuffer와 StringBuilder은 내부에 버퍼(임시저장소)가 있어서 문자열을 추가할 수 있다,
문자열을 이어붙일때 사용한다,
Math
수학연산과 관련된 상수와 정적메소드를 제공한다
클래스의 모든 메소드가 정적메소드이다.
con,Sin,Tan 들의 메소드가 있다.
System,Runtime
System은 자바프로그램이 실행중인 운영체제와 관련된 정보를 제공하는 클래스다
운영체제가 뭔지 CPU가 어떤건지 알아낼 수 있다,
Runtime은 운영체제와의 인터페이스를 지원하는 클래스다.
운영체제와 관련된 명령어를 실행할 수 있다. (cmd와 commed창)
Throwable
error와 exception클래스의 부모클래스이다.
error와 exception은 자바에서 발생하는 모든 오류정보를 표현하는 클래스이다. (예외처리 시간때 배울예정이다)
Object Class
배열을 포함한 모든 객체의 최상위 부모클래스다
명시적으로 extends를 사용해서 부모클래스를 지정하지 않으면 무조건 extends Objedct로 간주된다.
Object의 모든 메소드는 모든 클래스가 상속받는다
모든 객체는 Object의 메소드를 사용할 수 있다.
Object에는 객체와 관련된 필수 기능들이 구현되어있다.
Boolean equals(Object obj)
현재 객체와 전달받은 객체가 동일한 객체인지 여부를 반환한다.
객체들의 주소값(참조값)을 비교한다
재정의가 가능하다
동일한 객체이면 true, 다르면 false의값을 반환한다.
int hashCode()
현재 객체의 해쉬함수를 시행해서 획득되는 숫자값을 반환한다
일반적으로 같은 객체시 해시코드의 값도 동일하고 값이 다르면 다른 것이 나온다
재정의 가능하다,
String toString()
현재 객체에 대한 간단한 정보를 제공한다
클래스이름 @16진수해시코드를 반환한다
재정의 가능하다
Class<?>getClass()
현재 객체에 대한 설계도(클래스 정보를 제공한다)
<>의 경우 제네릭이라는 문법이다. 이번주내로 배울 예정이다.
Object Clone()
현재 객체를 복제한 복사본을 생성해서 제공한다
원본과 복사본을 만들어서 복사본을 전달해준다
notify()
다운로드가 여러개가 진행이 될 때 동시에 3개가 동작하게 되는 것.
동시작업이 가능한 걸 쓰레드라고 한다.
wait가 기다리게 만들어주는데, 그것을 깨우는게 notify()- 1개만 깨우는것이다.
notifyAll()
wait를 전체 깨움
wait()
시분할시 기다리게 만드는
wait(lnogtimeoutmillis)
기다리게 만들고 시간이 지나면 깨어남
equals(Object obj); 와 hasCode(); 메소드에 따른 동일성과 동등성
equals(Object obj);
각각 new라는 연산자로 새로운 Student라는 객체를 만들어 낸다 .
Student라는 설계도가 같은 것 뿐이지 객체가 같은 것이 형성되는 것은 아니다.
어떤내용인지는 중요하지 않고, 참조하는 값이 제일 중요하다. 객체도 별개의 객체가 생성을 하게되고, 우연히 같은 매개변수를 가질 뿐이다.
그렇기 때문에 equalse를 사용하면 false로 출력이 된다.
같은 클래스로 만들어진 객체라도 서로 다른 객체이다.
같은 클래스로 객체를 만들 때마다 매번 새로운 객체가 생성되는 것이다.
생성된 객체마다 다른 주소값을 가지고 있다.
Object의 boolean equals(Object obj)는 객체가 다르면 주소값도 다르기 때문에 주소값으로 같은 객체인지 여부를 판단하기 때문에 설계도가 동일하고 객체가 가지고 있는 값도 같은 값을 가지고 있더라도 객체가 서로 다르면 다른 객체로 판단한다.
가끔 같은 객체인지 비교할 일이 존재한다.
자바의 자료구조는 2번의 비교를 한다.
객체에 대해서 비교연산자를 사용할 수 있다. 비교연산자는 주소값을 비교한다. (==)
== 비교연산자는 동일성의 법칙으로 이뤄지고
equals는 동등성(값이 동등하냐 같은 형태의 값으로 이뤄져있는가)에 대한 비교를 한다.
동등성의 경우 형태의 값이 동등하냐라는 의미하고 == 동일성의 법칙은 같은 주소값을 가지고있어서 동일(종류가 같냐)라는 의미로 사용된다.
그러나 우리는 동등성의 원칙으로 값을 비교하고 싶어지기 때문에 hashCode()와 equals(Object obj)를 재정의하여 어느한가지이상의 값을 쓰고 동등한가에 대해서 출력이 가능하게 만들 수 있다. 객체는 다르지만 데이터가 같으면 같다고 출력을 할 수 있다 (동등성의 원칙)
Student에 대해서 매개변수도 입력하고 생성자도 입력하고, getter/setter의 값도 입력을 하였다. 그러면 hashCode()와 equals(Object obj)를 메소드재정의를 통하여 동등성의 원칙이 가능하도록 값을 입력한다.
1. hashCode()의 값이 동등해지도록 만들어주어야한다.
순서
hashCode()를 Override하기 위해 불러온다.
hashCode가 동일하면 비교하지 않고 출력한다. -->저장하지 않는다. 여기서 끝
equals(Object obj)를Override하기 위해 불러온다.
비교할 객체가 null이면 저장하지 않는다 -->여기서 끝
비교할 객체가 비교표본과 같은 타입인지 확인후 다른타입이면 저장하지 않는다(instanceof연산자 사용) -->여기서 끝
비교할 객체와 비교표본을 동일한 타입으로 형변환하여 비교할 타입의 참조변수를 만들어서 입력한다.
비교표본의 기본 키인 학번과 비교할 기본 키값이 다르면 저장하지 않는다.
완성 return true로 완성시켜준다
equals의 메소드를 재정의하고 동등성의 비교를 통해 true가 된걸 확인할 수 있다.
hashCode와 equals를 재정의하여 동등성 있게 만들었다.
==비교 연산자를 사용하면 동일성의 원칙으로 따지기 때문에 사용하면 다른 값이 출력된다. (주소값만 같냐 아니냐)
Alt + shift + s 키를 누르면 자동으로 Generate hash() and equals()이 떠 입력을 자동으로 할 수 있다.
형변환을 시켜주는 이유
많이 사용하는 메소드 재정의 방법이다.
final키워드
상속금지 (Class) , 재정의 금지 (Method) , 값 변경금지(Variable)
최종클래스, 최종메소드, 최종 값으로 설정되기 때문에 값을 바꾸거나 변경할 수 없다.
final 클래스
A클래스는 부모가 될 수 없다.
A클래스는 상속받아서 자식클래스를 정의할 수 없다.
final 메소드
메소드를 자식클래스에게 정의할 수 없다.
B클래스를 상속받은 자식클래스에서 method()을 재정의할 수 없다.
final정적변수
값을 변경할 수 없는 상수다.
public static final을 함께 꼭 붙인다.
final매개변수
메소드 호출시 전달 받은 값을 블록내의 수행문에서 변경할 수 없다.
final지역변수
변수에 할당된 값을 변경할 수 없다.
대표적인 클래스로는 String 이다.
String class public final class Stirng
자식을 가질 수 없는 상속이 안되는 클래스이다.
Object의 int hashCode();
객체의 해시코드 값을 정수로 반환한다.
같은 객체는 해시코드의 값도 같다. 해시코드의 값이 같으면 같은 객체다.
그러나 역으로 해시코드의 값이 같다고해서 같은 객체는 아니다.
이전에 포스팅이 되있는 글이다. 해시코드의 값이 같다고해서 같은 값이 아니다. 강사님과 같은 해시코드의 값이 나오는데 어떤 연산식으로 계산된 값이 아니라는 의미이다.