JAVA

[JAVA] 패키지&import & 접근 제어 지시자

EJUN 2023. 4. 26. 02:40

패키지란?
쉽게 말해 클래스들의 모음집이다.
패키지를 통해서 클래스 구분이 가능
그렇다면 패키지를 사용하는 이유는 무엇일까?
바로 클래스의 고유성을 유지하기 위해서이다.
다시 말해, 서로 다른 용도의 2개의 클래스의 이름이 겹쳐서 충돌하는 경우를 방지하기 위하여 패키지를 이용하여 클래스의 고유성을 지키기 위해서이다.

패키지를 이용한 동일명 클래스 선언

위의 코드는 동일한 클래스명을 생성한 경우이다. 

동일한 패키지에서 Tam이라는 클래스를 생성하면

동일 패키지에서 동일한 클래스명을 생성하는 경우

위의 사진처럼 이미 존재한다고 컴파일러가 개발자에게 알려준다.

하지만 패키지를 이용하면 정상적으로 생성이 가능하다.

이것이 패키지를 사용하는 이유다.

 

패키지를 사용한 클래스 호출

위의 코드는 java1에 있는 Tam클래스를 java2패키지의 Tam1클래스에서 호출하는 코드이다. 

여기서 바로 import라는 키워드가 사용된다.

import는 다른 패키지 안의 클래스를 사용하기 위해서 사용하는 키워드이다.

 

여기서 import.패키지명.클래스를 이용하면 다른 패키지의 클래스도 이용이 가능하다.

대표적으로 우리가 사용하는

import java.util.*;

위 코드는 util이라는 패키지의 모든 클래스(*)를 사용하겠다는 의미이다.

대표적으로 Scanner클래스가 있다.

실행결과

위의 코드를 실행하게 되면 이와 같이 java1패키지의 Tam클래스와 java2패키지의Tam1클래스의 생성자를 호출하여서 이와 같은 실행결과가 나왔다.

 

 

접근 제어 지시자란?
클래스 외부에서 클래스의 멤버변수, 메소드, 생성자 사용여부를 지정하는 키워드

접근 제어 지시자의 종류에는 public, protected, private, default 총 4가지이다.

 

 public키워드

public은 누구나 접근이 가능하다는 걸 의미하는 키워드이다.

public키워드 사용

Pra클래스에서 메소드와 변수에 public키워드를 사용하게 되면 

public키워드 접근

다른 클래스에서 Pra의 메소드와 변수에 제한없이 접근이 가능하다.

 

protected 키워드

protected키워드는 동일패키지나 상속관계 클래스에서만 접근이 가능하고 나머지는 접근이 안된다.

protected키워드 사용예시

Pra클래스의 멤버변수와 메소드를 protected로 선언하면

protected키워드 접근

PClass 클래스는 Pra를 상속받았기 때문에 사용이 가능하지만,

다른 패키지 + Pra클래스를 상속받지 않은 클래스는 아래와 같은 오류를 발생시킨다.

protected키워드로 인한 오류 발생

 

private 키워드

동일한 클래스 내부에서만 접근이 가능하다. 즉, 외부클래스, 상속관계의 클래스에서도 접근이 불가하다.

private키워드 사용예시

그렇다면 private로 선언한 변수는 외부클래스에서 접근할 수 있는 방법은 없을까?

바로 Getter/Setter를 이용하는 것이다.

Getter/Setter 사용예시

위처럼 private로 선언된 String타입의 변수 name을 외부클래스에서 접근하기 위하여 선언한 Getter/Setter이다.

getName()은 private로 선언된 변수 name의 값을 얻어서 출력해주는 메소드이고,

setName()은 private로 선언된 변수 name값을 외부 클래스에서 변경할 수 있게 도와주는 메소드이다.

Getter/Setter 사용

위처럼 PClass에서 Pra클래스의 name변수에 접근하기 위하여 setName()메소드를 이용하여서 "jun" 이었던 값을 

"lee"로 변경하였고, getName()메소드를 이용하여 출력하게 하였다.

실행결과

하지만 Setter같은 경우는 객체 지향 언어인 자바에서 객체지향원칙인 SOLID원칙에 어긋나기 때문에 권장을 많이 하는 편은 아니다.

'JAVA' 카테고리의 다른 글

[JAVA] Enum(열거 타입)  (0) 2023.05.17
[JAVA] Thread & Runnable & Multi Thread란?  (0) 2023.05.03
[JAVA] Object클래스  (0) 2023.04.25
[JAVA] final 키워드  (0) 2023.04.23
[JAVA] 추상클래스란  (0) 2023.04.23