Java #5 - class 위치, 패키지, 접근제한자 (국비17일차)

 

오늘부터 며칠간은 객체 지향 프로그래밍(OOP)에 대해

더 알아보는 시간을 가질 것이다.

그리고 오늘은 class 만들기를 중점으로 공부할 것이다.

 

 

목차

1. Class의 위치

    1) 별도의 .java 문서에 만들기
    2) 하나의 .java 문서 안에 여러 개의 class를 설계하기
    3) class안에 또 다른 class 설계하기
    4) 함수(메소드)안에 class를 설계하기

2. 패키지(Package)

    1) 패키지 만들기
    2) 다른 패키지의 클래스 사용하기
    3) import

3. 접근제한자 (Access Modifier)

 

 

혹시라도 객체 개념이 부족하면 밑의 글을 

다시 한번 참고하자.

2023.01.16 - [Android journey/Java] - Java #0 - 객체 (국비 12일 차)

 

Java #0 - 객체 (국비12일차)

java에 들어가기 앞서 객체가 무엇인지 알아보고 이해하는 시간을 가져야 한다. 우선 객체를 알기 위해선 객체가 어디로부터 왔는지 알아야 한다. 객체는 class라는 설계도로부터 나온 것이다. 그

d0ngurrrrrrr.tistory.com

 

 

 

 

1. Class의 위치

이전에도 배웠지만

객체란

고유의 기능과 값을 가진 녀석 (변수 + 함수)이다.

 

또한 class

Struct와 구별되는

Struct에 함수가 들어가 있는 것으로

객체의 종류를 말한다.

 

우리가 앞에서 사용했던

String, Scanner 등과 같은 객체들을

미리 2000여 개 정도 만들어 놓은 것을

Java System Library라고 한다.

 

그리고 2000여 개의 class가

있어도 내가 원하는 기능이 없을 경우엔

사용자 정의 class를 만들 수도 있다.

 

class를 만드는 방법 - 4가지 위치

1) 별도의 .java 문서에 만들기

2) 하나의 .java 문서 안에 여러 개의 class를 설계하기

3) class안에 또 다른 class 설계하기

4) 함수(메소드)안에 class를 설계하기

 

etc-image-0

 

 

1) 별도의 .java 문서에 만들기

 

etc-image-1
별도의 .java 문서에 만들기

새로운 클래스를 만들어서

우리가 c언어에서 했듯이

멤버변수와 멤버 함수를 입력하면 끝이다.

 

etc-image-2

이렇게 해서 저장하면 자동으로 class 파일이 생긴다.

 

etc-image-3
main class에서 사용자 정의 class 사용하기

사용법도 간단하다. 우리가 계속 사용하고 있는 Scanner나 String처럼

heap메모리에 할당해 주고

참조변수를 이용하여 사용해 준다.

 

 

2) 하나의 .java 문서 안에 여러 개의 class를 설계하기

 

etc-image-4

위에서 작성했던 second 클래스가

끝난 부분에 또 다른 클래스를 선언할 수 있다.

 

그럼 클래스 파일이 안 생기는 것 아니냐고?

아니다.

 

etc-image-5

컴퓨터는 class 단위로 bin 폴더에

별도의 파일을 만들기 때문에

이렇게 해도 class파일이 생긴다.

etc-image-6

사용법도 똑같다.!!

 

 

3) class안에 또 다른 class 설계하기

etc-image-7
inner class

처음 설계한 Second 클래스 안에

또 다른 클래스를 설계할 수 있는데

이를 inner class라고 부른다.

etc-image-8
inner class는 객체 생성 불가

그러나 이너 클래스는 객체 생성이 불가하다.

 

 

4) 함수(메소드)안에 class를 설계하기

etc-image-9

마지막으로 지역 클래스이다.

처음 선언한 Second 클래스 안에

멤버함수인 aaa 함수 안에

클래스를 설계할 수 있는데

이를 지역클래스라고 한다.

 

지역 클래스는 그 지역 안에서만 사용가능한 클래스로

1회용이라고 생각하면 된다.
(그 지역 사용이 끝나면 사라지기 때문에)

 

 

 

2. 패키지(Package)

    1) 패키지 만들기

 

그런데 만일 같은 클래스의 이름을 써야 하는 상황이 생긴다면?

etc-image-10

 

etc-image-11
패키지 만들기

그땐 패키지 만들기를 해야 한다.

패키지란 쉽게 말해 폴더다.

폴더를 하나 만들고 

거기다 새로운 클래스를 만드는 방법이다.

 

etc-image-12
패키지 이름 규칙

(패키지는 소문자로 만드는 게 규칙이다.)

 

etc-image-13

위 사진처럼 만들고 나면

이렇게 패키지가 생기며

우리가 src를 오른쪽으로 눌러 

새로운 클래스를 만드는 것처럼

새로 클래스 생성이 가능하다.

etc-image-14

패키지를 만들고

클래스를 만들면 위처럼 1번 줄에 패키지가 나타나게 된다.

 

 

etc-image-15
패키지 aaa의 Student 클래스
etc-image-16
패키지 bbb의 Student 클래스

이렇게 동일한 이름의 클래스가

패키지라는 폴더로 구분돼서

만들어졌다.

 


    2) 다른 패키지의 클래스 사용하기

etc-image-17
패키지 안에 클래스 사용하기

그래서 패키지 안에 있는 클래스를 사용하려고

멤버 변수를 입력하면 에러가 난다.

 

etc-image-18

그 이유는 다른 패키지에 멤버 변수를 사용하게 하려면

public 선언이 필요하기 때문이다.

etc-image-19

이렇게 선언해 줘야 사용이 가능하다.

 

etc-image-20

bbb는 public 선언을 하였고 

aaa는 하지 않아서

aaa는 에러가 나지만

bbb는 멤버변수에 대입이 가능해진다.

 

 

 


    3) import

그러나 또 다른 bbb Student 객체를 많이 만들어야 한다면?

etc-image-21

bbb. 을 여러 번 입력하는 것이 귀찮고 짜증 날 것이다.

 

etc-image-22

이를 쉽게 해결하는 것이 import다.

이렇게 입력하면 앞에 bbb를 입력할 필요가 없어지는 것이다.

 

etc-image-23

즉 우리가 평소 사용하는 Random이나 Scanner 역시 

앞에 패키지를 원래는 적어줘야 하나

import를 통해 이런 번거로움을 제거하는 것이다.

 

 

그런데 우리가 사용하는 객체 중 특이한 녀석이 있다.

etc-image-24

String 같은 경우엔 java.lang에 들어 있는 클래스인데

이 패키지는 기본적인 클래스들만 있어서

자동으로 import를 하기 때문에

따로 적을 필요가 없다고 한다.

 

 

etc-image-25

만일 aaa 패키지 안에 Person이라는 클래스를 만들었다고 가정하자.

etc-image-26

그럼 aaa에 있는 Student는

같은 패키지 안에 있는 Person을 import 하지 않고도 사용이 가능하다.

 

etc-image-27

 

그러나 bbb에 있는 Student는

import가 필요하다.

 

또 default 패키지 안에 있는 클래스는

부를 수 없기에 다른 패키지 클래스에서 사용이

불가하다.

 

 

 

또 만일 bbb 패키지에 여러 클래스가 있다고 가정해 보자.

etc-image-28
etc-image-29
패키지 다 import 하기

bbb 패키지 안에 있는 클래스가 100개라면

이를 모두 다 하나씩 import 할 순 없다..

이를 해결하기 위해

*을 사용한다.

(   import bbb.*;   )

 

    4) 패키지명 규칙

etc-image-30
패키지명 규칙

 

패키지명을 만들 땐 규칙이 있다.

패키지명은 반드시 소문자로만 작성할 것을

강제로 권장한다고 한다.

그리고 여러 단어를 구분할 때 사용하는.(마침표)는

사실 하위폴더를 의미하는 것이다.

즉 java.lang에서는

java라는 폴더 안에 lang이라는 폴더를 말하는 것이다.

 

 

3. 접근제한자 (Access Modifier)

 

 

etc-image-31
java 접근제한자

 

자바는 4가지 접근제한자를 가지고 있다.

private, default, protected, public이다.

1. private : 본인 클래스 안에서만 접근 가능한 제한자

2. default : 같은 패키지안에서는 . 연산자로 멤버접근 가능, 다른 패키지에서는 접근 불가

3. protected : 같은 패키지안에서는 . 연산자로 멤버접근 가능, 다른 패키지에서는 접근 불가, 단, 상속관계라면 접근 가능함

4. public : 어디서든 . 연산자로 접근 가능

 

etc-image-32

이 접근제한자는

클래스를 만들 때 멤버변수나 멤버함수에 설정할 수 있다.

 

etc-image-33

 

우선 멤버변수에 접근제한자를 위의 사진처럼 각각 줬을 때

private은 메인함수에서 검색도 안되게 되어있다.

etc-image-34

그래서 f.a는 에러가 난다.

 

etc-image-35
aaa.Second

그리고 멤버함수에서도 역시 접근제한자가 적용되는데

아무것도 쓰지 않으면 default가 적용이 되고

나머지는 앞에 입력을 하면 된다.

 

etc-image-36

이렇게 패키지가 다른 경우
(우리가 참조변수를 사용하는 곳은 Main함수 default패키지, Second 클래스는 aaa패키지)

etc-image-37

위의 접근제한자 설명처럼

public을 제외하고는 에러가 난다.

etc-image-38

또한 멤버함수 역시 같은 규칙에 의해서

작동된다.

 

 

 

 

이제 학생성적관리 프로그램을 만든다고 생각해 보자.

etc-image-39

그럼 이전에 배운 대로 간다면

이렇게 배열을 이용해서

하나하나 입력할 수 있는 방법이 있다.

 

그러나 이 방법은

은근 짜증 나고 가독성도 떨어진다.

 

그래서 연관 있는 데이터끼리 묶어서 관리할 수 있는

데이터 묶음은 class를 설계를 해보자.

 

etc-image-40

우선 새로 Student라는 클래스를 생성하여

필드를 작성해 주자.

 

그러나 알다시피

클래스를 만들었다고 해서 

그냥 사용할 수 있는 것이 아니다.

 

etc-image-41

객체를 생성해 주고

값을 넣어줘야 한다.

 

etc-image-42

키보드로 입력받아서

사용도 가능하다.
(사실 이것들은 다 공부했었음..)

 

이렇게 하나하나 입력하고

하나하나 출력하는 것 역시 귀찮고

번거롭다.

그래서 클래스에 멤버함수를 추가하는 이유다.

 

etc-image-43
class 맴버변수

클래스에 show, calAverage, setMembers라는 함수를 추가해서

etc-image-44

이렇게 간결하게 사용할 수 있다.