[TIL] PowerJava chap8 - 자바 API 패키지, 예외 처리, 모듈

은동·2023년 2월 5일
0

JAVA_TIL

목록 보기
8/8
post-thumbnail

✔️ 패키지?

관련있는 클래스들을 하나로 묶은 것

  • 왜 필요할까?
  1. 서로 관련된 클래스들을 하나의 단위로 묶을 수 있음
  2. 세밀한 접근 제어 구현 가능(패키지 외부에서 오는 접근)
  3. name space
    모든 클래스는 서로 다른 이름을 가져야 하는데, 사람의 상상력에는 한계가 있으므로 우연히 같은 클래스 이름을 사용할 수도 있음
    패키지만 다르면 동일한 클래스 이름 사용 가능
  • 패키지 선언
    소스 파일의 맨 상단에 'package 패키지 이름' 넣기

    만약 pkg1 패키지 안에 pkg2 패키지를 넣고 싶은 경우에는 패키지와 패키지 사이에 점을 찍어서 구별

    package 패키지 이름
    ...

    package pkg1.pkg2;
    ...
  • 규칙
  1. 패키지의 이름은 일반적으로 소문자만을 사용 (클래스나 인터페이스 이름과의 중복을 피하기 위함
  2. 인터넷 도메인 이름의 역순을 이용
    ex. kr.co.company.library는 company.co.kr에서 일하는 프로그래머에 의하여 생성된 library 패키지임을 알 수 있음

✔️ 패키지 사용

  1. 완전한 이름으로 참조한다.

만약 같은 패키지 안에 있는 클래스라면 클래스 이름만 가지고 클래스를 참조할 수 있다. 하지만 외부 패키지에 있는 클래스를 사용하려면 원칙적으로 앞에 패키지를 붙인 정식 클래스 이름을 써주어야 한다.
ex. graphics 패키지 안에 있는 Rectangle 클래스의 정식 이름은 graphics.Rectangle 이다.

graphics.Rectangle myRect = new graphics.Rectangle();

그러나 자주 사용하는 클래스는 import를 사용하여 해당 클래스나 패키지를 포함하는 것이 좋다.

  1. 원하는 패키지 멤버만을 포함한다.

외부 패키지 특정한 멤버를 import하려면

import graphics.Rectangle;

클래스가 포함되었으면 이제부터는 클래스 이름만 사용하여서 참조 가능

Rectangle myRect = new Rectangle();

하지만 외부 패키지에서 많은 클래스를 사용한다면 전체 패키지를 포함하는 것이 나음

  1. 전체 패키지 포함

하나의 패키지 안에 포함된 모든 클래스를 포함하려면 다음과 같이 별표 문자(*)를 사용하면 된다.

import graphics.*;

패키지 전체가 포함되면 패키지 이름을 생략하고 클래스 이름으로만 참조할 수 있다.

만약 똑같은 이름의 클래스를 가지는 패키지가 동시에 포함될 때는, 모호성을 제거하기 위해 패키지 이름까지 붙여서 정식 이름을 사용하여야 함


✔️ 클래스 파일은 언제 로드될까?

  1. 클래스 파일은 요청 시 JVM에 로드됨
  2. 애플리케이션 코드를 구성하는 기본적인 클래스 파일은 시작 시 로드됨


✔️ JAR 압축 파일

Java Archive의 줄임말로서 자바 파일들을 압축하여 하나의 파일로 만드는 데 사용됨
클래스 + 이미지 + 사운드


✔️ 자바 API 패키지

  • API(application porgramming interface)
    https://namu.wiki/w/API
    운영체제와 응용프로그램 사이의 통신에 사용되는 언어나 메시지 형식을 말한다.
    예를 들어 명령어 창에 "Hello, world!" 라는 문자열을 출력하는 프로그램을 C언어로 작성한다고 하자. 당연히 텍스트로 출력하는 printf API를 사용하여 printf("Hello, World!"); 라고 작성하게 될 것이며, 이는 윈도우, 리눅스, 유닉스, OS X 모두에서 동일하게 동작하도록 C언어 API가 보장해준다. 이 'printf'라는 것은 API를 기반으로 설계된 문법이며 이런 것들이 여러개 쌓여 '라이브러리'가 된다.

    물론 printf같은 기본적인 것들은 다 기본적으로 탑재되어있기 때문에 따로 이것을 '라이브러리'라고 부르진 않지만 좀 더 나아가면 운영체제의 종류나 버전을 출력한다든가 파일의 데이터를 읽어오는 등의 행동에는 별도의 라이브러리를 호출할 필요가 있다.

  • Java 19 버전에서 제공하는 패키지 정보
    https://docs.oracle.com/en/java/javase/19/docs/api/index.html


✔️ Object 클래스

java.lang 패키지에 들어 있으며, 자바 클래스 계층 구조에서 맨 위에 위치하는 클래스
자신의 용도에 맞추어 메소드들을 재정의하여 사용하면 됨

getClass() 메소드 - 객체가 어떤 클래스로 생성되었는지에 대한 정보 반환

toString() 메소드 - 재정의하여 사용하는 메소드, 객체의 상태를 몇 줄의 문자열로 반환하는 함수, 우리가 println()을 사용하여 객체를 출력하면 객체의 toString() 메소드가 자동으로 호출됨

equals() 메소드 - 동일한 값을 가지고 있는지 비교, 하지만 ==연산자를 사용하면 잘못된 결과를 얻음(참조값이 동일한지만을 검사하기 때문), 따라서 재정의가 필요함

...


✔️ 랩퍼 클래스(Wrapper Class)

자바에서는 정수나 실수와 깉은 기초 자료형을 제외하고는 모든 것이 객체로 되어 있는데, 이와 같은 기초 자료형도 객체로 포장하고 싶은 경우가 있음

예를 들어 객체만을 저장하는 벡터같은 경우에는 기초 자료형은 객체로 포장하여야 함
-> 이 때 사용하는 클래스가 랩퍼 클래스

int i=100;
Integer obj = new Integer(i);

obj 객체는 정수 100을 객체로 나타내며 정수 대신에 객체가 필요한 경우에 사용됨

  • 랩퍼 클래스 제공 메소드 (저장된 값을 다른 자료형으로 변환하는 메소드)
    intValue() : int형으로 반환
    doubleValue() : double형으로 반환
    floatValue() : float형으로 반환
    parseInt() : 문자열을 int형으로 변환
    toString() : int형의 정수를 문자열로 변환
    ...

  • 오토박싱 (auto - boxing)
    랩퍼 객체와 기초 자료형 사이의 변환을 자동으로 해주는 기능

  Integer obj = 10;	// 오토박싱
  // Integer obj = 10.1; 은 안됨
  // Integer에 대응되는 값만 오토박싱 적용 가능
  
  System.out.println(obj+1);
  //출력 결과 : 11

(화살표 방향이 박싱, 반대가 언박싱)
boolean -> Boolean
byte -> Byte
short -> Short
int -> Int
float -> Float
long -> Long
double -> Double
char -> Char


✔️ String 클래스

  • 메소드
    charAt() : 지정된 인덱스에 있는 문자 반환
    compareTo() : 사전적 순서로 문자열 비교 (앞 : -1, 같 : 0, 뒤 : 1)
    equals() : 주어진 객체와 현재의 문자열을 비교
    length() : 현재 문자열의 길이를 반환
    toLowerCase() : 문자열의 문자들을 모두 소문자로 변경
    toUpperCase() : 문자열의 문자들을 모두 대문자로 변경
    ...

  • 객체 생성

// (1) 많이 사용되는 방법
String s1 = "Java";
String s2 = "Java";
// (2) 원칙
String s3 = new String("Java");
String s4 = new String("Java");

(2)와 같이 new를 사용해서 String 객체를 생성하면 문자열이 동일하다고 하여도 새로운 객체를 생성하지만, (1)과 같이 문자열 상수로 초기화하면 문자열 상수 풀(pool)을 조사해서 동일한 문자열을 가진 객체가 존재하면 이를 공유

  • 문자열 비교
    '==' 연산자가 아닌 equals()를 호출하여야 함
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java");
String s4 = new String("Java");

System.out.println(s1.equals(s2)); //true, 올바른 방법
System.out.println(s1.equals(s3)); //true, 올바른 방법
System.out.println(s1==s2); //true이지만, 올바르지 않음
System.out.println(s1==s3); //false, 올바르지 않음

'=='연산자는 문자열 객체의 주소만을 비교하게 됨


✔️ Math 클래스

지수나 로그, 제곱근, 삼각함수와 같은 기본적인 수치 연산을 위한 메소드들을 제공


✔️ Random 클래스

난수를 발생하는 데 사용

public class RandomTest {

	public static void main(String[] args) {
		Random random = new Random();
		for(int i=0;i<10;i++) {
			System.out.print(random.nextInt(100)+", ");	
            //0~99까지의 랜덤 수 출력
            //Math클래스의 random() 메소드와는 다름
            //바로 int형의 난수 발생 가능
		}

	}

}

✔️ Arrays 클래스

배열을 다루는 다양한 메소드들을 가지고 있음
sort(), fill() 등
이들은 모두 객체를 생성하지 않고서도 호출될 수 있는 정적 메소드임


✔️ Calendar 클래스

추상클래스로서 날짜와 시간에 대한 정보를 가지고 있고 특정 시각을 연도, 월, 일 등으로 변환하는 메소드도 가지고 있음


✔️ 예외 처리

오류가 발생했을 때, 프로그램을 종료시키는 것이 아닌 오류를 처리한 후 프로그램을 계속 실행시킬 수 있는 것

ex. 배열의 인덱스가 배열의 한계를 넘는 것, 디스크에서 하드웨어 에러 발생


✔️ try-catch 구조

try{
	// 예외가 발생할 수 있는 코드
}catch(예외 클래스 변수){
	// 예외를 처리하는 코드
}finally{
	// 생략이 가능하고, try블록이 끝나면 무조건 실행
}

예외가 발생하지 않는 경우에는 catch블록의 코드는 실행되지 않음
예외가 발생한 경우에는 catch블록의 코드가 실행됨
fianlly블록은 항상 실행됨

public class DivideByZeroOK {

	public static void main(String[] args) {
		try {
			int result = 10/0;			
		}catch(ArithmeticException e){
			System.out.println("0으로 나눌 수 없습니다.");
		}
		System.out.println("프로그램은 계속 진행됩니다.");
	}

}

✔️ 예외의 종류

  1. Error
    JVM안에서 치명적인 오류가 발생하면 생성됨 (ex. 하드웨어 오류)
    애플리케이션은 이러한 Error를 잡아서 사용자에게 보고할 수는 있짐나, 더는 처리할 수 없음 -> 강제종료
    Error는 예외 처리의 대상이 아님

  2. RuntimeException (Unchecked Exception)
    실행 중에 발생하며, 프로그래밍 버그나 논리 오류에서 기인
    스스로 고쳐야 함

https://docs.oracle.com/javase/9/docs/api/java/lang/RuntimeException.html

ArithmeticException
NullpointerException
ClassCastException
NegativeArraySizeException
...

  1. Error나 RuntimeException이 아닌 예외 (Checked Exception)
    RuntimeException을 상속받지 않고 Exception을 상속받는 모든 Exception은 Checked Exception
    이 예외들은 충분히 예견될 수 있고 회복할 수 있는 예외이므로 프로그램은 반드시 처리하여야 함
    (ex. 파일 이름을 입력받을 때, 사용자가 실수로 잘못된 파일 이름을 입력할 경우)

    개발자가 체크 예외를 처리하였는지를 컴파일러가 확인
    만약 처리하지 않았다면 컴파일 오류 발생


✔️ Try-With-Resource

자동 리소스 관리
try catch 블록 내에서 사용되는 리소스를 자동으로 닫음

try 괄호 안에 필요한 리소스를 선언하면 됨

try(FileReader fr = new FileReader("test.txt"))
// 리소스는 FileReader

✔️ 예외 떠넘기기

예외를 그 자리에서 처리하지 않고, 자신을 호출한 상위 메소드로 예외를 전달하는 것

throws 키워드를 메소드 뒤에 붙여서 사용

public static void generateException() throws NullPointerException{
    //NullPointerException 발생
}

https://dololak.tistory.com/87


✔️ 모듈

여러 가지 자바 패키지들을 하나의 단위에 포장할 수 있는 메커니즘

profile
자자 선수입장~

0개의 댓글