[Java] 패키지(package) / import

2021. 1. 23. 14:57Dev.Program/Java & Spring

728x90

p.212~ 간단 설명

======== Ex7.java 만들기 (package 설명)

p.236

< package(패키지) >

  • 윈도우에서의 폴더, 리눅스에서의 디렉토리에 해당하는 개념
  • 자바의 클래스 파일들을 모아놓은 공간
    • ⇒ 서로 다른 패키지에는 같은 이름의 클래스가 각각 존재할 수 있다!
    •      (같은 이름의 파일이 서로 다른 폴더에 존재하는 것과 동일)
  • 자바에서 패키지를 사용하면, 실제 폴더가 패키지로 구분됨
  • 특정 클래스 파일은 하나의 패키지에'만' 소속되어야 함

< package 키워드 >

  • 특정 클래스 파일의 맨 첫 번째 라인에 해당 클래스가 소속된 패키지명을 명시
  • 실제 클래스 파일이 위치하는 패키지와 다를 경우 오류 발생
  • 소스 코드의 첫번째 라인(주석 제외)에서만 사용 가능한 키워드
    • ⇒ 클래스 내에서 단 한 번만 사용 가능

< package 키워드 사용 기본 문법 >

-------- 소스코드 첫 번째 라인에서 --------
package 패키지명;

 

< import 키워드 >

  • 원래 클래스에 접근할 때 패키지명.클래스명 형태로 특정 클래스에 접근하거나 import 문을 사용하여 특정 패키지의 위치를 선언하여 패키지명 지정 생략 가능
    • (같은 패키지 내에서는 패키지명을 생략할 수 있다)
  • java.lang 패키지는 유일하게 생략이 가능한 패키지
    • ⇒ 그 외의 모든 패키지는 반드시 위치 정보가 필요함
  • import 문 뒤에 패키지명과 클래스명을 지정하면 특정 클래스만 포함시키고, 패키지명 뒤에 만능문자(*)를 지정하면 해당 패키지 내의 모든 클래스를 포함
  • package 문보다 아래쪽, 다른 코드들보다 윗쪽에 명시해야하며 package 문은 단 한 번만 사용 가능하지만, import 문은 여러번 사용 가능
  • 자동 import 단축키 : Ctrl + Shift + O

< import 키워드 사용 기본 문법 >

import 패키지명.클래스명;

또는   

import 패키지명.*;



  • 자바에서 기본으로 제공하는 rt.jar

  • 우리가 지금까지 쓴  String 은 여기서 가져오는거
  • java.lang.String s = "유라"; 원래 정석대로 쓰려면 이렇게 써야함!

 

  • 그러나 java.lang 은 유일하게 패키지명이 생략 가능하다. (가장 자주 쓰이므로)
  • 밑에 util 패키지는 생략하면 오류남

 

  • package test; 라고 쓰면 Ex7 클래스는 test 패키지에 소속되어 있지 않으므로 컴파일 에러가 발생한다.

 

< Ex7.java > → 전체 코드

// package test; 
// ⇒ Ex7 클래스는 test 패키지에 소속되어 있지 않으므로 컴파일 에러 발생!
// 현재 위치는 Default package 이므로 아무런 package 도 지정하지 않아야함

import java.util.Date;
// java.util 패키지의 Date 클래스를 현재 소스코드에 포함시킴
// ⇒ 이 코드가 있을 때는 Date 클래스명 앞에 패키지명을 생략할 수 있다!

import javax.swing.JButton;
import javax.swing.JFrame; // 자동완성 하면 자동으로 import 구문 추가됨.
// ⇒ 각각 서로 다른 클래스들을 별도로 지정하는 경우에 사용하는 문장

//import javax.swing.*;
// ⇒ 특정 패키지 내의 모든 클래스들을 한꺼번에 import 시키는 문장
// ⇒ javax.swing 패키지의 클래스만 포함하고,
//    서브패키지(폴더)는 포함시키지 않는다!

public class Ex7 {
	public static void main(String[] args) {
		// java.lang 패키지에 있는 String 클래스를 사용할 경우
		java.lang.String s = "홍길동";
		String s2 = "홍길동2"; // java.lang 패키지라 패키지명 생략 가능
		
		// java.util 패키지에 있는 Random 클래스의 참조변수 선언
		java.util.Random rr;
		
		// java.util 패키지에 있는 Random 클래스의 인스턴스 생성
		java.util.Random r = new java.util.Random();
//		Random r2 = new Random();
		// ⇒ 패키지명을 지정하지 않으면 컴파일 에러 발생!
		
		// java.util 패키지에 있는 Date 클래스의 인스턴스 생성
		Date d = new Date();
		// ⇒ 패키지명이 없지만,
		//    import 문을 통해 Date 클래스를 포함시켰으므로 오류 X
		
		// javax.swing 패키지에 있는 JFrame 클래스의 인스턴스 생성
//		javax.swing.JFrame f;
		JFrame f;
		// javax.swing 패키지에 있는 JButton 클래스의 인스턴스 생성
		JButton btn = new JButton();
	}
}



  • new - package 만들기 (Name : test)

- package 만들어짐.

  • test 위에서 new - class 만드니까 이렇게 패키지네임 알려줌! Ex.java 이름으로 class 생성

 

  • 자동으로 package test; 가 생성 된 모습을 볼 수 있다.
  • 여기선 test 패키지 안 이므로 오류 안남.



- window - Preferences.

- Java - Code Style - Organize Imports

- 설정 바꾸는 창이 뜬다!

  • 아랫부분에 99 로 된 걸 1로 바꿔본다 (99단계까지 보여준다는 뜻)
  • 1로 바꾸고 자동완성하면 import javax.swing.*; 이렇게 뜸!
  • 우리는 공부중이기때문에 (아직 어디에 뭐가 있는지 모르니까) 99로 다시 바꿔줌

  • 우리는 처음에 패키지를 안 만들고 시작했는데 그럼 자동으로 Default package에 저장됨.
  • Default package는 작업관리자로 가서 보면 이렇게 src 에 그냥 저장됨.
  • 만들어진 test 패키지는 폴더가 하나 생성 된 걸 볼 수 있음.

(지금 우리는 연습중이라 상관 없지만 실무에서는 관리가 힘들다 → package 별로 폴더를 구분해놓으면 직관적으로 보이고 관리하기가 쉬움.)




tip. 패키지명을 만들땐 회사의 도메인네임을 사용(전세계에서 중복이 불가)

  • p.236 -237 참고

  • src 에서 new - class 만들면 패키지명 부터 내가 설정 가능

  • 이렇게 패키지부터 class 까지 자동 생성됨
  • 패키지명에서 F2 누르면 패키지이름 변경가능

- 이렇게 한 번 만들어보고 (이렇게 만드는 건 나쁜 예!)

 

- 이렇게 한 번 만들어보기 (좋은 예) ⇒ 만들어진 파일 보면 알수있음.

  • 만들어진 파일 보면 두 가지 방법이 차이가 난다! 책 p236-237
  • 2번째 방법으로 만든 건 tv로 묶여서 구분 된 것을 볼 수 있다. (좋은 예)



======== Ex8.java 만들기 : 기본형과 참조형

p.195-197

< 기본형 변수와 참조형 변수의 차이 >

  • 기본형(Primitive Type) 변수는 실제 값(리터럴)을 저장하며, 참조형(Reference Type) 변수는 인스턴스의 주소값(참조값)을 저장
  • 변수의 값을 복사할 때
  • 기본형 : 변수에 저장된 실제 값을 복사(Pass by Value)
    • ⇒ 복사본과 원본은 아무런 관계가 없으므로 복사본의 값을 변경해도 원본이 변경되지 않음
  • 참조형 : 변수에 저장된 인스턴스의 주소 값을 복사(Pass by Reference)
    • ⇒ 복사본과 원본은 같은 주소값을 가지므로, 같은 인스턴스를 가리킴.
    • ⇒ 복사본을 통해 인스턴스 값을 변경하면 원본 인스턴스의 값도 같이 변경됨(변경된 값을 같이 공유함)


1) 기본형 : 변수에 저장된 실제 값을 복사(Pass by Value)

⇒ y값은 안바뀜

→ 복사본과 원본은 아무런 관계가 없으므로 복사본의 값을 변경해도 원본이 변경되지 않음

2) 참조형 : 변수에 저장된 인스턴스의 주소 값을 복사(Pass by Reference)

⇒ d1과 d2 다 바뀜 (d2에도 영향을 미침)

→ 복사본과 원본은 같은 주소값을 가지므로, 같은 인스턴스를 가리킴. 그래서 복사본을 통해 인스턴스 값을 변경하면 원본 인스턴스의 값도 같이 변경됨

 

  • num 값을 전달만 하고, 내 num 값에는 영향 X (기본형 예제)

 

  • 오류 없애보기 (class 안에 메소드 만들어보기)

  • refNum 이름은 중요한게 아님(다른거 설정 가능)

 

  • 이렇게는 못넣음! 여긴 참조형이기 때문에 값이 들어갈 수 없다.
  • 주소값을 줘야함.

→ num 의 주소값을 전달해줘야하기 때문에 refNum.num 으로 주소값을 불러옴(참조형 예제)

 

  • 내 값도 바뀜! 파라미터로 참조형 변수를 전달 시, 주소값의 복사가 일어나기 때문.
  • 원본에도 영향을 미친다.(참조형 예제)

 

728x90