본문 바로가기

프로그래밍 언어/JAVA

[No.5] 모듈과 패키지, 자바 기본 패키지

반응형

패키지의 개념과 필요성

패키지의 필요성

하나의 자바 응용 프로그램을 여러명이서 분담하였을 때, 두 명이상이 동일한 이름의 클래스를 작성하게 되면 클래스 파일이 중복되는 문제가 발생한다.

→ 이를 해결하기 위해 패키지 사용

 

패키지(Pakage)

서로 관련 있는 클래스나 인터페이스의 컴파일된 클래스 파일(.class)들을 한 곳에 묶어 놓은 것 

▣ JDK 9 부터는 패키지들을 모듈이라는 단위로 묶어 제공해준다. (가장 많이 쓰는 모듈 - java.base)

+ 클래스를 지칭할 때는 모듈명을 사용하지 않고, 패키지 명을 포함하는 경로명으로 나타낸다

 

import java.util.Scanner; 	// import 패키지.클래스; -> 클래스 경로명을 컴파일러에게 알려주는 문

import java.util.*; 		// import 패키지.*; -> 패키지의 모든 클래스 import
package UI; 		// 패키지 선언
 
public class Tools {} 	// 클래스 선언(경로명 : UI.Tools)

 

디폴트 패키지(default pakage)

패키지를 선언하지 않았을 때, 자바 컴파일러는 클래스나 인터페이스를 디폴트 패키지에 소속시킨다. 디폰트 패키지는 현재 디렉터리이다.

 

패키지 특징

패키지 계층 구조

JDK 패키지 역시 디렉터리 계층 구조도 만들어진다. 상속 관계에 있는 클래스나 인터페이스의 경우, 서브 클래스 파일을 슈퍼 클래스 파일이 저장된 패키지의 서브 디렉터리에 패키지를 만들어 저장하여 계층화 시키면 더욱 관리하기 쉽다.

 

패키지별 접근 제한

디폴트 접근 지정으로 선언된 클래스나 멤버는 동일 패키지 내의 클래스들이 자유롭게 접근하도록 허용한다. 하지만 패키지를 지정하면 패키지에 포함된 클래스들끼리는 자유롭게 접근하게 하고, 다른 패키지의 클래스들은 접근을 막음으로써 패키지를 접근 권한의 범위로도 이용할 수 있다. .

 

동일한 이름의 클래스를 다른 패키지에 작성 가능

같은 패키지 내에서 동일한 이름을 가진 클래스나 인터페이스가 존재할 수 없다. 그러나 다른 패키지에서는 가능하다.

 

소프트웨어의 높은 재사용성

클래스와 인터페이스를 잘 분류하여 패키지로 관리하면, 나중에 같거나 유사한 기능을 수행하는 클래스나 인터페이스는 재작성할 필요없이 프로그램에 포함하여 쉽게 사용할 수 있다.

 

모듈

모듈(module)

: JAVA 9에서 처음 도입된 개념으로, 패키지는 서로 관련 있는 클래스나 인터페이스의 컴파일도니 클래스 파일들을 한 곳에 담는 컨테이너로 모듈 파일(.jmod)로 저장한다

+ 오라클은 java 9의 도입과 함께 자바 플랫폼 전체를 모듈화하였다.

자바 플랫폼: 자바 프로그램의 개발 환경과 실행 환경을 함께 지칭하는 것으로 JDK/JRE 형태로 자바 개발자에게 제공

 

모듈 기반의 자바 실행 환경

자바 실행 환경: 자바 응용 프로그램이 실행되는데 필요한 제발 환경으로서, 응용프로그램이 실행 중에 사용하는 자바 API 클래스와 자바 가상 기계(JVM) 등으로 이루어진다. 

 

자바 모듈화의 목적

자바 컴포넌트들을 필요에 따라 조립하여 사용하기 위함이다. 필요 없는 모듈이 로드 되지 않게 하여, 컴퓨터 시스템에 불필요한 부담을 줄인다.

 

Object

  •  모든 클래스에 강제로 상속되는 클래스
  • Object만이 아무 클래스도 상속받지 않는 유일한 클래스로 계층 구조 상 최상위 클래스이다.
Object obj = new Object();

 

.toString()

 

이를 오버라이딩하여 자신만의 문자열을 리턴할 수 있음

class Point {
	private int x,y;
    public Point(int x, int y) {
    	this.x = x;
        this.y = y;
    }
    public String toString() {
    	return "Point("+x+","+")";
    }
}

public class ToStringEx {
	public static void main(String [] args) {
    	Point p = new Point(2,3);
        System.out.println(p.toString());	// Point(2,3)
        System.out.println(p);			// Point(2,3)
    }
}

 

.equals(Object obj)

 

이를 오버라이딩하여 두객체가 같은지를 비교하는 법을 변환할 수 있다

class Point {
	private int x,y;
    public Point(int x, int y) {
    	this.x = x;
        this.y = y;
    }
    public boolean equals(Object obj) {
    	Point p = (Point) obj;
        if(x==p.x && y == p.y) return true;
        return false;
    }
}

public class ToStringEx {
	public static void main(String [] args) {
    	Point a = new Point(2,3);
        Point b = new Point(2,3);
        
        if(a == b); 		// false
        if(a.equals(b));	// true
        
    }
}

 

Wrapper 클래스

Wrapper 클래스

 

int, char, double 등 8개의 기본 타입을 객체로 다루기 위해 JDK에 다음과 같은 8개의 클래스를 통칭하여 Wrapper 클래스라 한다. 

기본타입 byte short int long char float double boolean
Wrapper타입 Byte Short Integer Long Character Float Double Boolean

 

String 클래스 (문자열 수정 불가능)

/* 스트링 리터럴로 String 객체 생성 */
String str1 = "abcd";

/* String 클래스의 생성자를 이용하여 String 객체 생성 */
string str2 = new String("abcd");

 

스트링 리터럴로 선언: 자바 내부에서 리터럴 테이블로 특별히 관리하며, 동일한 리터럴을 공유

String a1 = "a"; String a2 = "a"; // 동일한 주소를 가르킴

 

new String으로 선언: new를 이용하여 생성되는 다른 객체와 동일하게 힙 메모리에 생성

 String a1 = new String("a"); String a2 = new String("a"); // 다른 주소를 가르킴

 

 

스트링 객체는 수정이 불가능

수정하고자 한다면 .concat으로 수정해야한다.
String s = new String("Hello");
String t = s.concat("JAVA");	// 스트링 s에 "JAVA"를 덧 붙인 새로운 스트링 객체 리턴

 

+ 비교: compareTo(String s)
+ 연결: concat(String s)
+ 앞뒤 공백 제거: trim()
+ 문자열의 문자: charAt(int index)

 

StringBuffer 클래스 (문자열 수정 가능)

  • 문자열을 저장하는 가변 버퍼를 가지고 있기 때문에 저장된 문자열의 수정이 가능하다.
  • 문자열의 크기가 늘어나면 내부 버퍼 크기를 자동 조절한다.

 

public class StringBufferEx {
	public static void main(String [] args) {
    	StringBuffer sb = new StringBuffer("This");
        
        sb.append(" is pencil");	// 문자열 덧 붙이기
        System.out.println(sb);		// This is pencil
        
        sb.insert(7, "my");		// "my" 문자열 삽입
        System.out.println(sb);		// This is my pencil
        
        sb.replace(8, 10, "your");	// "my"를 "your"로 변경
        System.out.println(sb);		// This is your pencil
        
        sb.delete(8, 13);		// "your "을 삭제
        System.out.println(sb);		// This is pencil
        
        sb.setLength(4);		// 스트링 버퍼 내 문자열 길이 수정
        System.out.println(sb);		// This
    }
}

 

StringTokenizer 클래스

: 하나의 문자열을 여러개의 문자열로 분리하기 위해 사용

+ 문자열을 분리할 때 사용되는 기준 문자를 구분 문자라고 하고, 구분 문자열을 토큰이라고 한다.

 

public class StringTokenizerEx {
	public static void main(String [] args) {
    	StringTokenizer st = new StringTokenizer("홍길동/장화/홍련/콩쥐/팥쥐", "/");
        // 구분자로  '/' 사용
        
        while(st.hasMoreToken()) 	// 토큰이 있는 동안
        	System.out.println(st.nextToken());
    }
    /*
    print 결과
    ---------------------------------------
    홍길동
    장화
    홍련
    콩쥐
    팥쥐
    */
}

 

Math 클래스

System.out.println(Math.PI);		// 원주율 상수 출력
System.out.println(Math.ceil(a));	// 올림
System.out.println(Math.floor(a));	// 내림
System.out.println(Math.sqrt(9));	// 제곱근
System.out.println(Math.exp(2));	// e의 2승
System.out.println(Math.round(3.14));	// 반올림
System.out.println(Math.random()*40);	// 난수 발생(0~39)

 

Calendar 클래스

Calendar firstDate = Calendar.getInstance();
firstDate.clear();				// 현재 날짜와 시간 정보를 모두 지운다
firstDate.set(2016, 11, 25);			// 2016년 12월 25일. 12월은 11로 설정
firstDate.set(Calendar.HOUR_OF_DAY, 20);	// 저녁 8시로 설정
firstDate.set(Calendar.MINUTE, 30);		// 30분으로 설정

 

반응형

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

[NO.4] 상속  (0) 2022.12.30
[NO.3] 클래스와 객체  (0) 2022.12.30
[NO.2] 반복문과 배열 그리고 예외 처리  (0) 2022.12.29
[NO.1] JAVA 기본 프로그래밍  (0) 2022.12.29
[NO.0] JAVA란?  (0) 2022.12.29