Java:Package

aiden·2023년 9월 7일

Java

목록 보기
9/30

Package

자바 패키지란 클래스나 인터페이스의 컴파일된 클래스 파일들을 저장해놓은 디렉토리/폴더로 생각할 수 있다. 하나의 프로그램은 패키지로 이루어지며 패키지는 여러 개 둘 수 있다. 각 패키지는 클래스 파일(.class)로 이루어지는데, 다른 패키지에 있는 경우 클래스명이 동일해도 다른 파일로 인식되므로 여러 명이 작업을 분담하는 경우에도 쉽게 합칠 수 있을 것이다.

자바 JDK에서 기본으로 제공하는 클래스들은 패키지를 이루고 있는데, 이 패키지들을 묶은 것이 모듈이라는 것이다.
클래스 사용 시 모듈명을 사용하지 않고 패키지명을 포함하여 경로를 지정한다. 경로는 .을 사용하여 표현하는데, 아래와 같은 예시를 들 수 있다.

java.util.Scanner //java.패키지명.클래스명

Import

다른 패키지의 클래스를 사용하려는 경우 패키지명을 포함하는 경로명이 필요하다. 컴파일러가 경로를 통해 클래스 파일을 찾도록 하기 위함이다. 이 때 import문을 사용하면 매번 작성하지 않아도 된다.

class Ex{
	public static void main(String args[]){
    	java.util.Scanner scanner = new java.util.Scanner(System.in);
    }
}

import문 사용 시

import java.util.Scanner;
//또는
import java.util.*;

class Ex{
	public static void main(String args[]){
    	Scanner scanner = new Scanner(System.in);
    }
}

import 방법으로는 다음의 두 가지가 있다.

import 패키지.클래스명;
import 패키지.*;

패키지 만들기

클래스 파일(.class)은 자바 파일(.java)이 컴파일되어 생성되며 반드시 패키지에 속해있어야 한다. 첫 줄에 다음과 같은 문장을 작성하면 된다.

package 패키지명;

Module

자바 프로그램 실행을 위한 자바 실행 환경은 자바 API 클래스와 자바 가상 머신(JVM) 등으로 이루어져 있다. 자바 API는 수많은 모듈로 분할되어 있으며 프로그램 컴파일 시 필요한 모듈을 조립하여 프로그램을 구성한다.
모듈은 패키지들을 담는 컨테이너로 모듈 파일(.jmod) 형태로 저장된다.

JDK에서 제공하는 패키지

자바 설치 시 자바 개발 도구 JDK(Java Development Kit)가 설치된다. JDK에는 자바에서 기본으로 제공하는 클래스인 자바 API가 패키지로 묶이고, 이 패키지가 모듈로 묶여있다. JDK 디렉토리의 jmods 디렉토리에 JDK 표준 패키지가 모듈로 나누어져 담겨있다. 다음은 JDK 표준 패키지의 구조이다.

일반적으로 가장 많이 사용하게 될 util, lang 패키지 등은 java.base 모듈에 포함되어 있다.

java.lang 패키지는 System, 문자열, 입출력 등 기본적인 클래스와 인터페이스를 제공하며 import문을 통해 임포트하지 않아도 자동으로 포함된다.

java.util 패키지는 날짜, 시간, 벡터 등 유틸리티 클래스와 인터페이스를 제공한다.

java.awt와 javax.swing 패키지는 GUI 프로그래밍에 필요한 클래스와 인터페이스를 제공한다.

자바 API에 대한 정보를 담은 다음 문서를 참고하자.(자바 버전 11)
👉🏻https://docs.oracle.com/en/java/javase/11/docs/api/

Object Class

Object 클래스는 java.lang 패키지에 속한 클래스로 모든 클래스의 최상위 클래스이다. Object 클래스에는 공통 기능이 구현되어 있어 모든 클래스가 상속받는다. Object 클래스는 최상위 클래스이므로 어떤 클래스도 상속받지 않는다.
Object 클래스의 주요 메소드는 다음과 같다.

toString()

Object 클래스의 toString() 메소드는 객체를 문자열로 변환하여 리턴한다. JDK의 Object.java 소스에는 다음과 같은 메소드가 작성되어 있다.

public String toString(){
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

toString() 메소드는 객체의 클래스 이름과 문자열 "@"와 객체의 해시코드 값을 16진수로 변환한 값을 연결한 문자열을 리턴한다.

객체를 문자열 형태로 사용할 때 다음 예시와 같이 자동으로 toString()이 호출된다.

Person p = new Person();
System.out.println(p); //System.out.println(p.toString());과 동일
String s = p; //String s = p.toString();과 동일

자동으로 변환되기 때문에 클래스를 작성할 때 이 toString() 메소드를 오버라이딩하여 활용할 수 있다. 이 때, 접근 지정자를 public으로 선언해야 한다.

이렇게 하면 객체를 문자열 형태로 사용해야 할 때 오버라이딩한 toString()이 자동으로 호출된다.

equals()

boolean equals(Object obj)는 두 객체가 서로 같은지 비교하는 메소드이며, 결과로 true와 false를 리턴한다. 객체의 내용을 비교하기 위해서는 클래스 작성자의 정의가 필요하기 때문에, 본인이 작성한 클래스의 객체를 비교하려면 equals() 메소드를 오버라이딩하여 작성할 필요가 있다.
equals()를 오버라이딩 할 때 다음과 같이 객체를 다운캐스팅한다.

String 또한 객체이며 equals() 메소드를 오버라이딩하여 가지고 있기 때문에 equals를 이용하면 두 문자열의 내용이 동일한지 비교할 수 있다.

문자열을 비롯한 객체를 비교할 때 == 연산자를 사용하면 객체의 내용이 같은지 비교하는 것이 아닌 두 레퍼런스가 동일한 객체를 가리키고 있는지를 비교한다.

따라서 문자열 비교 시에 다음과 같이 작성해야 원하는 결과를 얻을 수 있다.

String a = new String("String");
String b = new String("String");
boolean c = (a == b); //c = false
boolean d = a.equals(b); //d = true

Wrapper

Wrapper 클래스는 자바 기본 타입을 객체로 다루기 위해 만들어진 클래스를 말한다. 다음의 8가지가 존재한다.

자바는 객체지향 언어로 객체를 다루는 경우가 많아 기본 타입을 객체로 만들어서 사용할 수 있도록 한 것이다. Wrapper 클래스는 java.lang 패키지에서 제공한다.

다음 예시와 같이 valueOf() 메소드를 사용하여 객체로 변환한다.

Integer i = Integer.valueOf(1);
Character c = Character.valueOf('a');
Double d = Double.valueOf(5.20);
Boolean b = Boolean.valueOf(true);

또는 문자열로 Wrapper 객체를 생성할 수 있다.

Integer i = Integer.valueOf("1");
Double d = Double.valueOf("5.20");
Boolean b = Boolean.valueOf("true");

Wrapper 클래스 중 가장 많이 사용되는 Integer 클래스의 주요 메소드는 다음과 같다.

parseInt() 메소드 같은 경우 많이 사용되므로 주목할 것.

다양한 기법

Wrapper 객체에 들어있는 기본 타입의 값을 알아내려는 경우 다음과 같이 작성한다.

Integer i = Integer.valueOf(1);
Character c = Character.valueOf('a');
Double d = Double.valueOf(5.20);
Boolean b = Boolean.valueOf(true);

int ii = i.intValue();
char cc = c.charValue();
double dd = d.doubleValue();
boolean bb = b.booleanValue();

문자열을 기본 타입의 값으로 변환하려는 경우 static 타입의 parse 메소드를 이용한다. static이므로 객체가 아닌 클래스의 이름으로 메소드를 호출할 수 있다. 각 클래스마다 각자 자신의 타입으로 변환하는 메소드만 제공한다.

int i = Interger.parseInt("1");
double b = Double.parseDouble("3.14");
boolean b = Boolean.parseBoolean("true");

기본 타입의 값을 문자열로 젼환하려는 경우 toString() 메소드를 사용한다.

String s1 = Integer.toString(1); //s1 = "1"
String s2 = Integer.toHexString(10); //s2 = "a"
String s3 = Double.toString(3.14); //s3 = "3.14"
String s4 = Character.toString('a'); //s4 = "a"
String s5 = Boolean.toString(true); //s5 = "true"

자동 박싱/언박싱

기본 타입의 값을 Wrapper 객체로 변환하는 것을 박싱, Wrapper 객체를 기본 타입의 값으로 변환하는 것을 언박싱이라 한다.

중요한 것은, 이 박싱, 언박싱이 자동으로 이루어지므로 간결하게 코드를 작성할 수 있다는 점이다.

Integer i = 1; //Integer i = Integer.valueOf(1)
int n = i; //int n = i.intValue()

Math

Math 클래스는 java.lang 패키지에 포함되어 있는 산술 연산 관련 클래스이다. 모든 메소드들이 static 타입이므로 클래스 이름을 이용하여 메소드를 호출한다. 주요 메소드는 다음과 같다.

static double random() //0.0보다 크거나 같고 1.0보다 작은 임의의 실수 리턴
static double max(double a, double b) //두 수 a, b 중 큰 수 리턴
static double min(double a, double b) //두 수 a, b 중 작은 수 리턴
static double abs(double a) //실수 a의 절댓값 리턴
static long round(double a) //실수 a를 소수 첫째 자리에서 반올림한 정수를 long 타입으로 리턴
static double sqrt(double a) //실수 a의 제곱근 리턴

난수 발생

Math 클래스에서 가장 많이 사용하는 메소드는 random()으로, 0.0보다 크거나 같고 1.0보다 작은 임의의 실수를 리턴하므로 다음과 같이 수를 곱하여 활용할 수 있다.

int n = (int)(Math.random() * 100 + 1); //1~100 사이의 정수 n 생성
profile
파인애플 좋아하세요?

0개의 댓글