본문 바로가기
study_java/java_수강정리(~10.29)

[JAVA]10일차

by developer_j 2020. 5. 22.
728x90
반응형

< 10일차 수업 >

 

1.클래스 패스: 절대 경로와 상대경로

클래스 패스는 자바 가상머신이 .class 파일을 탐색할 폴더 경로를 말한다.

클래스 패스가 뭐라고 설정되어 있는지 확인하고 싶다면, 프롬프트 창에서 'set classpath'를 입력해 주면 된다.

C:\JavaStudy>set classpath

프롬프트 창으로 클래스패스를 설정하면 프롬프트 창을 껐을 때 설정내용도 사라지므로, 아마 처음 시도해본다면 classpath 환경 변수가 정의되지 않았다고 뜰 것이다. 클래스 패스를 설정하려면 set classpath뒤에 '=폴더경로'를 작성해주면 된다. 그러면 해당 폴더 경로로 클래스 패스 경로가 설정된다.

클래스 파일을 어디서 찾을 지 경로를 설정해줄 때, 경로는 절대경로와 상대경로로 나뉜다. 절대 경로는 루트(C:또는 D:)를 기준으로 표시된 경로를 말한다. 상황에 따라 바뀌는 경로가 아니므로 절대경로라 칭한다.

상대 경로는 현재 위치(.)를 기준으로 표시된 경로를 말한다. 현재 디렉토리를 기준으로 하는 상대경로는 현재 디렉토리가 바뀔때 모든 경로가 그에 맞게 수정되므로 더 자주 사용된다고 한다.


2. 패키지

패키지는 한마디로 클래스 묶음이다. 패키지는 동일한 이름의 클래스들을 사용할 때, 각각의 클래스 접근 방법과 물리적 공간을 구분할 수 있게 해준다. 따라서 패키지는 수많은 클래스를 묶으면서, 다른 클래스와 구별짓기 위한 수단으로 사용된다.

패키지를 만들고 싶다면 'package 패키지명;'을 코드 제일 위에 선언한다. 접근할 때는 import 키워드로 해당 패키지를 데려오거나, 직접 다른 패키지의 클래스 혹은 패키지 경로(폴더명과 클래스명)를 명시해준다. 즉, 다른 패키지에 있는 클래스를 사용하고 싶다면 해당 패키지나 클래스를 import 해줘야한다.

import com.javaStudy.smart.class01;       //클래스 import
import com.javaStudy.smart.*;             //패키지 import

 

한편, 각각 다른 패키지 두 개에 같은 이름의 클래스(이름이 'Func' 클래스라고 가정)가 존재하고 사용하기 위해

import package1.Func;
import package2.Func;

위와 같은 코드를 사용한다면.. 이건 불가능하다. 구분지었다 하더라도 똑같은 클래스 이름이면 이름충돌이 발생한다고 한다. 패키지가 같은 이름의 클래스이더라도 구분지을려고 쓰는건데, 하나는 import가 되는데 왜 두개는 안되는 건지는 사실 아직 이해하지 못했다. 더 공부해서 추가해야겠다.

+)둘다 같은 이름 Func이라서 어떤 Func를 써야되는지 몰라서 생기는 문제라고 한다.

해결하기 위해 두가지의 방법이 있는데 ①둘중 한 패키지를 package2.*; 으로 패키지 전체를 임포트 하거나, 

②하나는 import하고, 나머지 하나는 변수선언을 해줄때

package2.Func fn1 = new Func();

처럼 직접적으로 접근 표시를 해주면 된다. 이름이 같으면 저렇게 이름 충돌이 일어나니 권고되지 않는다고 한다.

 

결론 : 사용하고자 하는 대상이 다른 패키지에 있다면 import 해줘야 함. 안해주면 다른 패키지에 있는 클래스가 public이든 뭐든 걍 못쓰는 것. 

그러므로 import가 되어 있다고 가정했을 때, 해당 패키지에 있는 대상이 public인 경우에만 참조할 수 있다! import가 되어 있다고 해도 클래스가 default라면 참조할 수 없다!!!!!!! 왜냐 default는 같은 패키지끼리만 참조할 수 있기 때문!!!! 같은 패키지의 클래스라면 default여도 참조할 수 있다. public은 물론이다.


2-1. 접근 제어자

 접근제어자 종류에는 4가지가 있다.

public, protected, default, private

이 중에서도 오늘 배운건 protected를 제외한 나머지 3가지다.

먼저 public 키워드는 어디서든 접근할 수 있도록 하는 것이다. 단어 의미대로 다같이 사용하라고 선언하는 것과 같다. default는 전에 배웠던 디폴트 생성자처럼 기본적이라는 의미다. 함수나 클래스 앞에 default라고 선언해주는 것이 아니라, 그냥 비워두면 알아서 default로 인식된다. (아래 예시에서 확인하면 된다). private는 다른 사람이 접근하는것을 막는 역할을 한다. private은 데이터들은 숨기는 정보 은닉(information hiding)에 사용된다. 만약 내가 선언한 클래스의 변수를 누군가가 함부로 건들여 값을 다르게 할당하거나, 직접 변수 값에 접근했다가 원치않은 결과를 출력할 수 있다. 즉, 바깥에서 해당 데이터에 접근하지 못하도록 숨겨놓는 것이다.

정리해보면,

- public은 어디에서나 접근할 수 있다. (단 import 필요. import시 패키지 간 넘나들면서 사용가능)

- default는 같은 패키지 내에서 접근할 수 있다.

- private은 같은 클래스 내에서 접근할 수 있다.

class example {
           //public
           public String name;
           //protected
           protected double num1;
           //default(어느 키워드도 입력되어있지 않은 상태)
           int num2;
           //private
           private int num3;
}
728x90
반응형

'study_java > java_수강정리(~10.29)' 카테고리의 다른 글

[JAVA]12일차  (0) 2020.05.26
[JAVA]11일차  (0) 2020.05.25
[JAVA]9일차  (1) 2020.05.21
[JAVA]8일차  (0) 2020.05.20
[JAVA]7일차  (0) 2020.05.19