오늘은 개발과 커밋 자세히보기

프로그래밍 공부/Java

[ Java 프로그래밍 ] 공부 정리 - 6강. 모듈과 패키지 개념, 자바 패키지 활용

호크테마 2023. 4. 30. 15:52

* 공부 정리일자 (2022년 8~12월) 
- 책 : 명품 자바 에센셜 
- 개인적으로 공부 및 복습하면서 정리한 내용입니다. (사진 제외) 


* 목차
6장 모듈과 패키지 개념, 자바 패키지 활용
6.1 패키지
6.2 패키지 만들기
6.3 모듈 개념
6.4 자바 JDK에서 제공하는 패키지
6.5 Object 클래스
6.6 Wrapper 클래스
6.7 String과 StringBuffer 클래스
6.8 StringTokenizer 클래스
6.9 Math 클래스 


1. 복습 (중요 키워드 위주)
6) 6강. 모듈과 패키지 개념, 자바 패키지 활용 (책 241p) 
6.1) 패키지 (책 241p)

(1) 패키지 개념과 필요성 
* 3명이 분담하여 자바 응용프로그램을 개발하는 경우, 동일한 이름의 클래스가 존재할 가능성 있음
-> 합칠 때 오류 발생 가능성
-> 개발자가 서로 다른 디렉터리로 코드 관리하여 해결

* 개발자가 서로 다른 디렉터리로 코드 관리

(2) 자바의 모듈과 패키지, 클래스, 경로명
패키지 (package)
- 서로 관련된 클래스와 인터페이스를 컴파일한 클래스 파일들을 묶어 놓은 디렉터리
- 하나의 응용프로그램은 한 개 이상의 패키지로 작성
- 패키지는 jar 파일로 압축할 수 있음

모듈 (module)
- 여러 패키지와 이미지 등의 자원을 모아 놓은 컨테이너
- 하나의 모듈을 하나의 .jmod 파일에 저장

* Java 9부터 모듈화 도입
- 플랫폼의 모듈화
-- Java 9부터 자바 API의 모든 클래스들(자바 실행 환경)을 패키지 기반에서 모듈들로 완전히 재구성

- 응용프로그램의 모듈화
-- 클래스들은 패키지로 만들고, 다시 패키지를 모듈로 만듦
-- 모듈 프로그래밍은 어렵고 복잡. 기존 방식으로 프로그램 작성


(3) 자바의 모듈화의 목적
* 모듈화의 목적
- Java 9부터 자바 API를 여러 모듈(99개)로 분할
-- Java 8까지는 rt.jar의 한 파일에 모든 API 저장

- 응용프로그램이 실행할 때 꼭 필요한 모듈들로만 실행 환경 구축
-- 메모리 자원이 열악한 작은 소형 기기에 꼭 필요한 모듈로 구성된 작은 크기의 실행 이미지를 만들기 위함

* 모듈의 현실
- Java 9부터 전면적으로 도입
- 복잡한 개념
- 큰 자바 응용프로그램에는 개발, 유지보수 등에 적합
- 현실적으로 모듈로 나누어 자바 프로그램을 작성할 필요 없음

(4) 자바 API의 모듈 파일들
* 자바 JDK에 제공되는 모듈 파일들
- 자바가 설치된 jmods 디렉터리에 모듈 파일 존재
-- .jmod 확장자를 가진 파일
-- jdk 10의 경우 99개 모듈 파일
-- 모듈 파일은 ZIP 포맷으로 압축된 파일

- 모듈 파일에는 자바 API의 패키지와 클래스들이 들어 있음
- jmod 명령을 이용하여 모듈 파일에 들어 있는 패키지를 풀어 낼 수 있음

* java.base.jmod 파일을 풀어 놓은 사례
- java.base.jmod 파일을 풀면 다음과 같이 java.base 모듈에 있는 패키지와 클래스를 볼 수 있다.

(5) 패키지 사용하기, import문
* 다른 패키지에 작성된 클래스 사용
* import를 이용하지 않는 경우
- 소스에 클래스 이름의 완전 경로명 사용 

* 필요한 클래스만 import
- 소스 시작 부분에 클래스의 경로명 import
- import 패키지.클래스
- 소스에는 클래스 명만 명시하면 됨

* 패키지 전체를 import
- 소스 시작 부분에 패키지의 경로명. (* import)
- import 패키지.*
- 소스에는 클래스 명만 명시하면 됨

- import java.util.*;
-- java.util 패키지 내의 모든 클래스만을 지정, 
        하위 패키지의 클래스는 포함하지 않음


6.2) 패키지 만들기 (책 243p) 

(1) 패키지 선언
* 클래스 파일(.class)이 저장되는 위치는?
- 클래스나 인터페이스가 컴파일되면 클래스 파일(.class) 생성
- 클래스 파일은 패키지로 선언된 디렉터리에 저장

* 패키지 선언
- 소스 파일의 맨 앞에 컴파일 후 저장될 패키지 지정
-- package 패키지명;

* 디폴트 패키지
- package 선언문이 없는 자바 소스 파일의 경우
- 컴파일러는 클래스나 인터페이스를 디폴트 패키지에 소속시킴
- 디폴트 패키지
-- 현재 디렉터리

(2) 이클립스로 쉽게 패키지 만들기
* 예제로 사용할 샘플 소스 (5장의 예제 5-5)

* 예제 프로젝트 만들기 (246p~)
* 프로젝트 작성 (프로젝트 이름 : PackageEx)

* 패키지 lib, app 작성
* 패키지 작성이 완료된 결과

* lib 패키지에 클래스 Calculator 만들기
* Calculator 소스 작성 후 수정
* app 패키지에 GoodCalc.java 작성 후 수정
* 실행을 위한 Run Configurations 작성
* 프로젝트 PackageEx 실행


6.3) 모듈 개념 (책 253p) 

(1) 모듈
* 모듈
- Java 9에서 도입된 개념
- 패키지와 이미지 등의 리소스를 담은 컨테이너
- 모듈 파일(.jmod)로 저장

(2) 자바 플랫폼의 모듈화
* 자바 플랫폼
- 자바의 개발 환경(JDK)과 자바의 실행 환경(JRE)을 지칭
-- Java SE(자바 API) 포함

- 자바 API의 모든 클래스가 여러 개의 모듈로 재구성됨
- 모듈 파일은 JDK의 jmods 디렉터리에 저장하여 배포

* 모듈 파일로부터 모듈을 푸는 명령
- jmod extract "C:\Program Files\Java\jdk-10\jmods\java.base.jmod“
- 현재 디렉터리에 java.base 모듈이 풀림

(3) 모듈 기반의 자바 실행 환경
* 자바 실행 환경
- JRE : 디폴트 자바 실행 환경
-- 자바 모듈(컴파일된 자바 API 클래스들), 자바 가상 기계 등으로 구성
* 자바 실행 환경 비교

(4) 자바 모듈화의 목적
* 가장 큰 목적
- 자바 컴포넌트들을 필요에 따라 조립하여 사용하기 위함
- 컴퓨터 시스템의 불필요한 부담 감소
-- 세밀한 모듈화를 통해 필요 없는 모듈이 로드되지 않게 함
-- 소형 IoT 장치에도 자바 응용프로그램이 실행되고 성능을 유지하게 함



6.4) 자바 JDK에서 제공하는 패키지 (책 256p) 
(1) 자바 모듈과 패키지 구조 

(2) JDK의 주요 패키지 
* java.lang
- 스트링, 수학 함수, 입출력 등 자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스 
- 자동으로 import 됨 - import 문 필요 없음

* java.util
- 날짜, 시간, 벡터, 해시맵 등과 같은 다양한 유틸리티 클래스와 인터페이스 제공

* java.io
- 키보드, 모니터, 프린터, 디스크 등에 입출력을 할 수 있는 클래스와 인터페이스 제공

* java.awt
- GUI 프로그램을 작성하기 위한 AWT 패키지

* javax.swing
- GUI 프로그래밍을 작성하기 위한 스윙 패키지


6.5) Object 클래스 (책 257p) 

(1) Object 클래스의 특징
- 모든 자바 클래스는 반드시 Object를 상속받도록 자동 컴파일
-- 모든 클래스의 수퍼 클래스
-- 모든 클래스가 상속받는 공통 메소드 포함

* 주요 메소드

(2) 객체 속성 
* Object 클래스는 객체의 속성을 나타내는 메소드 제공
- hashCode() 메소드
- 객체의 해시코드 값을 리턴하며, 객체마다 다름

getClass() 메소드
- 객체의 클래스 정보를 담은 Class 객체 리턴
- Class 객체의 getName() 메소드는 객체의 클래스 이름 리턴

toString() 메소드
- 객체를 문자열로 리턴

* 예제 6-1 : Object 클래스로 객체 속성 알아내기
- Object 클래스를 이용하여 객체의 클래스명, 해시 코드 값, 객체의 문자열을 출력해보자.

(3) toString() 메소드, 객체를 문자열로 변환
* 각 클래스는 toString()을 오버라이딩하여 자신만의 문자열 리턴 가능
- 객체를 문자열로 반환
- 원형
-- public String toString(); 

* 컴파일러에 의한 toString() 자동 변환
- ‘객체 + 문자열’ -> ‘객체.toString() + 문자열’로 자동 변환
- 객체를 단독으로 사용 하는 경우 -> 객체.toString()으로 자동변환


* 예제 6-2 : Point 클래스에 toString() 작성
- Point 클래스에 Point 객체를 문자열로 리턴하는 toString() 메소드를 작성하라.

(4) 객체 비교(==)와 equals() 메소드
* == 연산자
- 객체 레퍼런스 비교

* boolean equals(Object obj)
- 두 객체의 내용물 비교
- 객체의 내용물을 비교하기 위해 클래스의 멤버로 작성

* 예제 6-3 : Point 클래스의 equals() 작성
- Point 클래스에 x, y 점 좌표가 같으면 true를 리턴하는 equals()를 작성하라.

* 예제 6-4 : Rect 클래스와 equals() 메소드 만들기 연습
- int 타입의 width(너비), height(높이) 필드를 가지는 Rect 클래스를 작성하고, 
   면적이 같으면 두 Rect 객체가 같은 것으로 판별하는 equals()를 작성하라.


6.6) Wrapper 클래스 (책 263p)
(1) Wrapper 클래스 개념
- 자바의 기본 타입을 클래스화한 8개 클래스를 통칭

* 용도
- 객체만 사용할 수 있는 컬렉션 등에 기본 타입의 값을 사용하기 위해 
-> Wrapper 객체로 만들어 사용

(2) Wrapper 객체 생성
* 주요 메소드
- 가장 많이 사용하는 Integer 클래스의 주요 메소드
-- 다른 Wrapper 클래스의 메소드는 이와 유사

(3) Wrapper 활용 
* 예제 6-5 : Wrapper 클래스 활용
- 다음은 Wrapper 클래스를 활용하는 예이다. 다음 프로그램의 결과는 무엇인가?

(4) 박싱과 언박싱
* 박싱 (boxing)
- 기본 타입의 값을 Wrapper 객체로 변환하는 것

* 언박싱 (unboxing)
- Wrapper 객체에 들어 있는 기본 타입의 값을 빼내는 것
- 박싱의 반대

* 자동 박싱과 자동 언박싱
- JDK 1.5부터 박싱과 언박싱은 자동으로 이루어지도록 컴파일됨


6.7) String과 StringBuffer 클래스 (책 266p)
(1) String의 생성과 특징
* String
- String 클래스는 문자열을 나타냄
- 스트링 리터럴(문자열 리터럴)은 String 객체로 처리됨
- 스트링 객체의 생성 사례

(1.1) 스트링 리터럴과 new String()
* 스트링 리터럴
- 자바 가상 기계 내부에서 리터럴 테이블에 저장되고 관리됨
- 응용프로그램에서 공유됨
-- 스트링 리터럴 사례) String s = "Hello"; 

* new String()으로 생성된 스트링 
- 스트링 객체는 힙에 생성
- 스트링은 공유되지 않음

(1.2) 스트링 객체의 주요 특징
* 스트링 객체는 수정 불가능
- 리터럴 스트링이든 new String()을 생성했든 객체의 문자열 수정 불가능
예)

* 스트링 비교
- 두 스트링을  비교할 때 반드시 equals()를 사용하여야 함
-- equals()는 내용을 비교하기 때문

* 주요 메소드

(2) String 활용 
* 스트링 비교, equals()와  compareTo()
- 스트링 비교에 == 연산자 절대 사용 금지

* equals()
-- 스트링이 같으면 true, 아니면 false 리턴

* int compareTo(String anotherString)
- 문자열이 같으면 0 리턴
- 이 문자열이 anotherString 보다 사전에 먼저 나오면 음수 리턴
- 이 문자열이 anotherString 보다 사전에 나중에 나오면 양수 리턴

* 공백 제거, String trim()
- 키보드나 파일로부터 스트링을 입력 시, 스트링 앞 뒤 공백이 끼는 경우가 많다. 
-> trim()을 이용하면 스트링 앞 뒤에 있는 공백 제거

* 예제 6-6 : String을 활용하여 문자열 다루기 

(3) StringBuffer 클래스
- 가변 스트링을 다루는 클래스
- StringBuffer 객체 생성

* String 클래스와 달리 문자열 변경 가능
- 가변 크기의 버퍼를 가지고 있어 문자열 수정 가능
- 문자열의 수정이 많은 작업에 적합

* 스트링 조작 사례


6.8) StringTokenizer 클래스 (책 270p)
* StringTokenizer 클래스
- 구분 문자를 기준으로 문자열을 분리하는 클래스
- 구분 문자(delimiter) : 문자열을 구분할 때 사용되는 문자
- 토큰(token) : 구분 문자로 분리된 문자열
예) * StringTokenizer로 문자열 분리 사례

* 예제 6-7 : StringTokenizer를 이용한 문자열분리
- "name=kitae&addr=seoul&age=21"를 '&'문자를 기준으로 분리하는 코드를 작성하라.


6.9) Math 클래스 (책 272p) 
* 기본 산술 연산 메소드를 제공하는 클래스
- 모든 메소드는 static으로 선언
-- 클래스 이름으로 호출 가능

* Math.random() 메소드로 난수 발생
- random()은 0보다 크거나 같고 1.0보다 작은 실수 난수 발생
- 1에서 100까지의 랜덤 정수 10개를 발생시키는 코드 사례

* java.util.Random 클래스를 이용하여 난수 발생 가능

* 예제 6-8 : Math 클래스 활용
- Math 클래스의 메소드 활용 예를 보인다.