자바 기본 배우기 -패키지와 import-

1. 패키지(package)

 

PC의 많은 파일을 관리하기 위해 폴더를 이용

 

프로그램의 많은 클래스를 관리하기 위해 패키지를 이용

 

패키지도 결국 하나의 폴더 느낌..

 

패키지는 클래스와 관련 있는 인터페이스들을 모아두기 위한 이름 공간

 

패키지의 구분은 .(dot) 연산자를 이용한다

 

패키지의 이름은 시중에 나와있는 패키지들과 구분되게 지어야 한다

 

보통은 소속이나 회사의 도메인을 이용한다고함

 

예를 들어 naver.com이 자기 회사 소속이라면,, 이를 뒤집어서 com.naver.(project_이름).(module_이름,class 이름,... 등등)으로 쓰는게 관례

 

 

Person.java랑 PersonTest.java로 서로 이름이 같은데

 

com.ssafy.class01, com.ssafy.class02로 서로 다른 패키지에 각각 존재해서..

 

서로 다르다, 관련이 없다고 생각을 함

 

 

2. import

 

다른 패키지에 있는 클래스를 사용하기 위해 import과정이 필요함

 

나한테 없는 패키지의 내용을 쓸려면 import해와서 써야한다 이 소리

 

위와 같은 구조일때.. 단순히 다음과 같이 쓴다면...?

 

public class PersonService {
    Person p;
}

 

Person p;에서 에러가 난다

 

com.ssafy.project.dto에서 Person을 import해와서 써야한다

 

import com.ssafy.project.dto.Person;

public class PersonService {
    Person p;
}

 

PersonService.java에서 Person 클래스를 사용할려면 위와 같이 import해와서 써야한다.

 

import를 선언할때는.. import 키워드 뒤에 패키지 이름과 클래스 이름을 모두 입력하기도 하고

 

해당 패키지의 모든 클래스를 가지고 오고 싶다면 *을 사용하기도 한다

 

import (package_name).(class_name);

 

import (package_name).*;

 

-------------------------------------------------------------------------------------------------------------------------

 

3. 예시로 이해하기

 

IDE로 클래스를 생성해보면.. 기본적으로 맨 위에는 패키지 명이 선언됨

 

 

 

디폴트 패키지를 사용하면 패키지 명이 선언이 안됨

 

알고리즘 문제 해결에는 보통 패키지명을 지우고 디폴트 패키지로 제출한다

 

아무튼..

 

자바에서 입력을 받기 위해 Scanner라는 클래스를 사용하는데..

 

 

그냥 쓰자니 빨간줄로 경고를 주고 있음

 

지금 패키지 modifier01내에 Scanner가 존재하는가..?

 

존재하지 않아서 다른 패키지에서 가져와야함

 

Scanner는 어디에 있냐면 java.util.Scanner에 있다

 

java로 시작하는 패키지는 당연히 java에서 만들어놓은 기본 제공 패키지

 

 

import문은 package문 아래에 한번만 작성

 

패키지 내에 모든 클래스를 가져오고 싶다면 *을 사용할 수 있음

 

java.util 내에는 Scanner 말고도 Arrays라는 클래스가 있는데.. 만약 import java.util.*;을 한다면..?

 

 

3-1) 근데 단순히 *을 찍으면 모든 내용을 가져올 수 있느냐..?

 

그것도 아님 

 

주의할 점이 있다

 

java.util안에도 클래스 말고도 여러가지 패키지가 존재함

 

 

java.util.function으로 들어가보면.. Function이라는 클래스가 있다

 

 

 

그러면 import java.util.function.*; 하고 Function f;하면 사용 가능할 것이다

 

하지만 import java.util.*;만 하고도 Function f;가 가능할까..?

 

 

찾을 수 없다고 나온다

 

*로 찍은 것은 하위 패키지는 포함하지 않고 해당 공간의 클래스들만 포함한다

 

 

패키지는 클래스들을 구분하기 위한 이름 공간으로 Scanner, Arrays,... 등등은 java.util이라는 이름 공간 안에 존재함

 

하지만 Function은 java.util.function이라는 이름 공간 안에 존재함

 

 

 

참고로 이클립스 IDE에서는 crtl+shift+o를 누르면 자동으로 해당 클래스를 위한 import를 해줌

 

눌러보면.. java.util.Arrays; java.util.Scanner;, java.util.function.Function;이 자동으로 생기네

 

 

3-2) 우연히 서로 다른 패키지내에 서로 같은 이름을 가지는 클래스가 존재할 수도 있음

 

 

하지만 둘 다 쓰고 싶을때가 있을 수도 있음

 

public class PackageTest {
	public static void main(String[] args) {
		
		Person p;
	}
}

 

단순히 이렇게 쓴 상황에서 ctrl+shift+o를 눌러보면.. 둘중 하나 선택하라고 나옴

 

 

 

com.ssafy.class01.Person을 선택했다고 하더라도 나는 class02.Person도 쓰고 싶을수가 있음

 

그러면 둘다 import하면 되나..?

 

 

 

충돌 난다고 나옴.. 자바는 별칭이 없나..?

 

이럴때는 하나를 지우고 다른 하나를 쓰고 싶으면 그 안에서 com.ssafy.class02.Person p; 이런식으로 사용하면 된다

 

package com.ssafy.modifier01;

import com.ssafy.class01.Person;

public class PackageTest {
	public static void main(String[] args) {
		
		Person p1;
		
		com.ssafy.class02.Person p2;
	}
}

 

 

4. java.lang.*

 

직접 쓰지는 않았는데 자동으로 삽입되어있는 패키지

 

import java.lang.하고 살펴보면 자주보던 System, Boolean, Class, String 등등이 있음

 

근데 그냥 막 System.out.println()하고 썼잖아

 

이는 java.lang.*이 안보이지만 자동으로 들어있어서 그렇다

 

 

TAGS.

Comments