-
학원 DAY 17. API, Object, 접근제한자기록 2022. 10. 2. 22:01
API(Application Programming Interface)
자바를 사용해서 어플리케이션을 쉽게 구현할 수 있도록 제공되는 라이브러리(클래스들의 집합)
자바에서는 입출력, 네트워크, 자료구조와 같이 어플리케이션 구현에 꼭 필요한 클래스를 구현해 놓은 것.
자바 API는 JDK(자바 개발 도구)설치시 같이 설치된다.
이클립스와 같은 통합개발환경에서 프로젝트를 생성하면 JAVA API를 바로 사용할 수 있도록 프로젝트의 클래스패스에 자동으로 등록시킨다. (classpath는 자바가상머신이 프로그램을 실행할 때 .class파일을 찾는 경로를 말함)
이클립스 왼쪽 창의 api에서 오른쪽버튼 build path > configure build path에 들어가면 api가 등록되어있음을 확인할 수 있다.
API는 application programming interface의 약자이다. 인터페이스는 표준이라고 배워왔으나 여기서는 제공되는 기능이라는 의미를 갖고 있다.
대표적인 Java API
java.lang 패키지 - 자바 어플리케이션 개발에 기본적으로 필요한 라이브러리를 제공, String, System, Object, Math 등
java.util 패키지 - 자바 어플리케이션 개발에 매우 자주 사용되는 라이브러리를 제공, 날짜관련, 자료구조관련 클래스 등
java.io 패키지 - 입출력과 관련된 라이브러리를 제공
java.net 패키지 - 네트워크 관련 라이브러리를 제공, URL, Socket, ServerSocat 등
java.text 패키지 - 포맷팅 관련 라이브러리를 제공, 문자열, 숫자, 날짜를 지정된 형식의 문자열로 변환하거나 그 반대작업을 수행하는 클래스를 제공
java.time 패키지 - 날짜, 시간 관련 라이브러리를 제공, java8부터 추가됨.
Java API Document
Java API에 제공하는 클래스, 인터페이스 등에 대한 설명 및 각 클래스나 인터페이스가 제공하는 기능을 설명하는 문서
html 문서 형식이다.
jdk설치경로/bin/javadoc.exe로 생성한다.
사용자 정의 프로젝트에서도 javadoc.exe를 사용해서 java api document를 생성할 수 있다.
api에서 오른쪽버튼 export > java > javadoc > next > api 선택 > next > VM옵션 칸에 한글 깨지지 않게 -locale ko_KR -encoding UTF-8 -charset UTF-8 -docencoding UTF-8 이러한 문장 붙이기 > Finish버튼 클릭
app 폴더 밑 doc폴더에서 index파일을 열면 내가 만든 api문서가 들어가있다.
/** : api document 주석
Object 클래스
- 배열을 포함한 모든 객체의 최상위 부모클래스다.
- 명시적으로 extends를 사용해서 부모클래스를 지정하지 않으면 무조건 extends Object로 간주된다.
- Object의 모든 메소드는 모든 클래스가 상속받는다.
- 모든 객체는 Object의 메소드를 사용할 수 있다.
- Object에는 객체와 관련된 필수 기능들이 구현되어 있다.
Object 클래스 주요 메소드
boolean equals(Object obj)
현재 객체와 전달받은 객체가 동일한 객체인지 여부를 반환한다. (객체의 동일성 확인)
객체들의 주소값(참조값)을 비교한다.
재정의 가능 (hashcode와 equals메소드를 동시에 재정의하여 객체가 같은 값을 갖고 있는지 비교할 수도 있다. (객체의 동등성 확인)
+) 해시코드 재정의가 필요한 이유!
Set이라는 자료구조는 같은 객체가 들어오지 못한다.
같은 객체가 안들어오게 하기 위해서 객체가 같은 값을 가지고 있으면 못들어가게 하고 싶은 것임.
그런데 우리가 아무것도 안해놓으면 주소값을 비교해서 주소값이 같으면 같은 객체 다르면 다른 객체로 판단한다.
그런데 equals를 재정의한 것은 굉장히 길다.
해시코드를 먼저 비교한다. 다른 객체이면 해시코드값이 다르다. 해시코드값이 다르면 equal를 비교해볼 필요가 없다.
equals를 비교하기 전에 hashcode를 비교하면 빠르다.
int hashcode()
현재 객체의 해시코드값을 반환한다.(해시코드란 객체가 생성될 때 임의로 부여되는 숫자값으로 객체를 식별할 수 있는 값이다. 객체가 다르면 해시코드값도 다르다.)
재정의 가능
String toString()
현재 객체에 대한 간단한 정보를 제공한다.
클래스이름@16진수해시코드.
재정의 가능 (우리는 해시코드가 별 의미가 없기 때문에 종종 재정의해서 쓴다. 변수안에 실제로 무슨 값이 들어있는지 빠르게 보고싶을 때 toString을 재정의해서 쓴다.)
Class<?> getClass()
현재 객체에 대한 설계도(클래스정보) 정보를 제공한다.
Object clone()
현재 객체를 복제한 복사본을 생성해서 제공한다.
package day18; import java.lang.reflect.Field; public class ContactApp { public static void main(String[] args) { Contact c1 = new Contact("김유신", "010-1111-1111", "kim@naver.com"); Contact c2 = new Contact("강감찬", "010-2222-2222", "kang@naver.com"); Contact c3 = new Contact("강감찬", "010-2222-2222", "kang@naver.com"); // Object의 주요 메소드 확인하기 // int hashCode(); - 객체의 해시코드값을 반환한다. System.out.println("### c1참조변수가 참조하는 Contact객체의 해시코드 확인하기"); System.out.println(c1.hashCode()); System.out.println(c2.hashCode()); System.out.println(c3.hashCode()); // 같은 이름이면 해시코드가 같도록 재정의해놓았기 때문에 해시코드가 같다. // String toString() - 참조변수가 참조하는 객체에 대한 간단한 설명을 반환한다. // 패키지명이 포함된 클래스 이름@16진수 해시코드값 // 객체의 멤버변수값으로 구성된 문자열을 반환하도록 toString() 메소드를 재정의하는 경우가 많다. // Object의 toString() 재정의의 대표적인 예 // String 클래스는 String객체가 가지고 있는 문자열을 반환하도록 재정의했다. // Date 클래스는 Date객체의 현재 날짜와 시간 정보를 문자열로 반환하도록 재정의했다. System.out.println("### c1, c2참조변수가 참조하는 Contact객체의 정보를 문자열로 반환한다."); System.out.println(c1.toString()); System.out.println(c2.toString()); System.out.println(c1); // 실제로 실행되는 코드 System.out.println(c1.toString()); System.out.println(c2); // 실제로 실행되는 코드 System.out.println(c2.toString()); // String str = new String("abc"); // String에는 파이널이 없기 때문에 재정의 가능 // System.out.println(str); // boolean equals(Object other) - equals(Object other)를 실행하는 객체와 매개변수로 전달받은 객체가 동일한 객체인지 여부를 반환한다. // - Object의 equals() 메소드는 두 객체의 주소값을 비교하는 메소드다. // - Object의 equals() 메소드는 객체의 동일성을 검사한다.(같은 객체인지 비교) // - Object의 equals() 메소드를 객체의 동등성을 검사하도록 재정의한다.(hashcode와 equals를 재정의해야 함) // Object의 equals() 재정의의 대표적인 예 // String 클래스는 Object의 equals() 메소드를 재정의해서 객체가 서로 다르더라도 // 객체가 갖고 있는 문자열이 같으면 true가 반환된다. // String 클래스의 equals() 메소드는 동등성을 검사한다.(같은 값인지 비교) System.out.println("### c1, c2참조변수가 참조하는 Contact객체가 같은 객체인지 여부를 반환한다."); System.out.println(c1.equals(c2)); // false System.out.println(c2.equals(c1)); // false System.out.println(c1.equals(c3)); // false System.out.println(c2.equals(c3)); // true. c2와 c3참조변수가 참조하는 객체는 같은 이름을 가지고 있다. // Class<?> getClass() - 객체의 설계도 정보를 표현하는 Class객체를 반환한다. // - Class객체는 패키지정보, 클래스정보, 멤버변수 정보, 생성자 정보, 메소드 정보를 모두 포함하고 있다. Class<?> clazz = c1.getClass(); // 키워드는 변수명으로 쓸 수 없어서 class대신 clazz라고 적음. Field[] fields = clazz.getDeclaredFields(); // 멤버변수에 대한 정보를 획득하는 메소드를 호출하고 Field배열에 반환값을 저장한다. for (Field field : fields) { String typeName = field.getType().getName(); String fieldName = field.getName(); System.out.println(typeName + ", " + fieldName); } } }
final 키워드
final이 정의된 클래스는 상속 받을 수 없다. 상속 금지 // ex. public final class Sample { ... }
final이 정의된 메소드는 하위 클래스에서 재정의할 수 없다. 재정의 금지 // ex. public final void test2() { 수행문; }
final이 정의된 변수는 값을 변경할 수 없다. 값 변경 금지 // ex. final int x = 10;
접근 제한자
public
전체 공개 (같은 패키지내의 모든 클래스, 다른 패키지의 모든 클래스에 공개)
protected
같은 패키지안에서만 공개. 단, 하위 클래스인 경우 다른 패키지여도 공개
private
비공개
생략(dafault)
같은 패키지내안에서만 공개
ObjectApp에서 접근제한자가 protected인 c.clone();은 호출할 수 없고 public인 c.copy를 호출 가능하다.
객체 복제 시 CloneNotSupportException 오류가 발생. 예외처리해야 함.
객체가 cloneable이라는 인터페이스를 구현 안해서 발생. 클래스이름 옆에 implements Cloneable을 적어야 함.
cloneable이라는 인터페이스를 구현한 클래스는 object의 clone()을 활용해서 객체를 복제할 수 있다. 그래서 Object의 clone() 메소드가 실행될 때는 implements Cloneable을 한 객체인지 아닌지 체크한다.
Cloneable은 메소드가 하나도 없는 마크업 인터페이스이다. 안에 들어있는 값을 그대로 복제 허용하면 나쁜 짓을 할 수 있기 때문에 내가 허용한 객체만 복제가 되게 하고 싶어서 메소드가 하나도 없다.
Markup Interface
메소드가 하나도 없는 인터페이스.
객체에 특정한 작업이 가능한지 불가능한지 표시하는 용도로 사용되는 인터페이스.
대표적인 예로는 java.lang.Clonable, java.io.Serializable이 있다.
상속은 하나만 적을 수 있어서 다른 클래스는 상속할 수 없지만 인터페이스는 여러개 적을 수 있기 때문에 인터페이스로 함.
'기록' 카테고리의 다른 글
학원 DAY17. StringBuilder, StringBuffer 클래스 (0) 2022.10.03 학원 DAY 17. String 클래스 (0) 2022.10.03 학원 DAY 16. 상속과 구현 (0) 2022.10.02 학원 DAY 15. 추상화, 인터페이스, 추상클래스 (0) 2022.10.02 학원 DAY 14. 메소드 재정의(오버라이딩) (0) 2022.10.02