오늘부터 며칠간은 객체 지향 프로그래밍(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를 설계하기

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

새로운 클래스를 만들어서
우리가 c언어에서 했듯이
멤버변수와 멤버 함수를 입력하면 끝이다.

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

사용법도 간단하다. 우리가 계속 사용하고 있는 Scanner나 String처럼
heap메모리에 할당해 주고
참조변수를 이용하여 사용해 준다.
2) 하나의 .java 문서 안에 여러 개의 class를 설계하기

위에서 작성했던 second 클래스가
끝난 부분에 또 다른 클래스를 선언할 수 있다.
그럼 클래스 파일이 안 생기는 것 아니냐고?
아니다.

컴퓨터는 class 단위로 bin 폴더에
별도의 파일을 만들기 때문에
이렇게 해도 class파일이 생긴다.

사용법도 똑같다.!!
3) class안에 또 다른 class 설계하기

처음 설계한 Second 클래스 안에
또 다른 클래스를 설계할 수 있는데
이를 inner class라고 부른다.

그러나 이너 클래스는 객체 생성이 불가하다.
4) 함수(메소드)안에 class를 설계하기

마지막으로 지역 클래스이다.
처음 선언한 Second 클래스 안에
멤버함수인 aaa 함수 안에
클래스를 설계할 수 있는데
이를 지역클래스라고 한다.
지역 클래스는 그 지역 안에서만 사용가능한 클래스로
1회용이라고 생각하면 된다.
(그 지역 사용이 끝나면 사라지기 때문에)
2. 패키지(Package)
1) 패키지 만들기
그런데 만일 같은 클래스의 이름을 써야 하는 상황이 생긴다면?


그땐 패키지 만들기를 해야 한다.
패키지란 쉽게 말해 폴더다.
폴더를 하나 만들고
거기다 새로운 클래스를 만드는 방법이다.

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

위 사진처럼 만들고 나면
이렇게 패키지가 생기며
우리가 src를 오른쪽으로 눌러
새로운 클래스를 만드는 것처럼
새로 클래스 생성이 가능하다.

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


이렇게 동일한 이름의 클래스가
패키지라는 폴더로 구분돼서
만들어졌다.
2) 다른 패키지의 클래스 사용하기

그래서 패키지 안에 있는 클래스를 사용하려고
멤버 변수를 입력하면 에러가 난다.

그 이유는 다른 패키지에 멤버 변수를 사용하게 하려면
public 선언이 필요하기 때문이다.

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

bbb는 public 선언을 하였고
aaa는 하지 않아서
aaa는 에러가 나지만
bbb는 멤버변수에 대입이 가능해진다.
3) import
그러나 또 다른 bbb Student 객체를 많이 만들어야 한다면?

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

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

즉 우리가 평소 사용하는 Random이나 Scanner 역시
앞에 패키지를 원래는 적어줘야 하나
import를 통해 이런 번거로움을 제거하는 것이다.
그런데 우리가 사용하는 객체 중 특이한 녀석이 있다.

String 같은 경우엔 java.lang에 들어 있는 클래스인데
이 패키지는 기본적인 클래스들만 있어서
자동으로 import를 하기 때문에
따로 적을 필요가 없다고 한다.

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

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

그러나 bbb에 있는 Student는
import가 필요하다.
또 default 패키지 안에 있는 클래스는
부를 수 없기에 다른 패키지 클래스에서 사용이
불가하다.
또 만일 bbb 패키지에 여러 클래스가 있다고 가정해 보자.


bbb 패키지 안에 있는 클래스가 100개라면
이를 모두 다 하나씩 import 할 순 없다..
이를 해결하기 위해
*을 사용한다.
( import bbb.*; )
4) 패키지명 규칙

패키지명을 만들 땐 규칙이 있다.
패키지명은 반드시 소문자로만 작성할 것을
강제로 권장한다고 한다.
그리고 여러 단어를 구분할 때 사용하는.(마침표)는
사실 하위폴더를 의미하는 것이다.
즉 java.lang에서는
java라는 폴더 안에 lang이라는 폴더를 말하는 것이다.
3. 접근제한자 (Access Modifier)

자바는 4가지 접근제한자를 가지고 있다.
private, default, protected, public이다.
1. private : 본인 클래스 안에서만 접근 가능한 제한자
2. default : 같은 패키지안에서는 . 연산자로 멤버접근 가능, 다른 패키지에서는 접근 불가
3. protected : 같은 패키지안에서는 . 연산자로 멤버접근 가능, 다른 패키지에서는 접근 불가, 단, 상속관계라면 접근 가능함
4. public : 어디서든 . 연산자로 접근 가능

이 접근제한자는
클래스를 만들 때 멤버변수나 멤버함수에 설정할 수 있다.

우선 멤버변수에 접근제한자를 위의 사진처럼 각각 줬을 때
private은 메인함수에서 검색도 안되게 되어있다.

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

그리고 멤버함수에서도 역시 접근제한자가 적용되는데
아무것도 쓰지 않으면 default가 적용이 되고
나머지는 앞에 입력을 하면 된다.

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

위의 접근제한자 설명처럼
public을 제외하고는 에러가 난다.

또한 멤버함수 역시 같은 규칙에 의해서
작동된다.
이제 학생성적관리 프로그램을 만든다고 생각해 보자.

그럼 이전에 배운 대로 간다면
이렇게 배열을 이용해서
하나하나 입력할 수 있는 방법이 있다.
그러나 이 방법은
은근 짜증 나고 가독성도 떨어진다.
그래서 연관 있는 데이터끼리 묶어서 관리할 수 있는
데이터 묶음은 class를 설계를 해보자.

우선 새로 Student라는 클래스를 생성하여
필드를 작성해 주자.
그러나 알다시피
클래스를 만들었다고 해서
그냥 사용할 수 있는 것이 아니다.

객체를 생성해 주고
값을 넣어줘야 한다.

키보드로 입력받아서
사용도 가능하다.
(사실 이것들은 다 공부했었음..)
이렇게 하나하나 입력하고
하나하나 출력하는 것 역시 귀찮고
번거롭다.
그래서 클래스에 멤버함수를 추가하는 이유다.

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

이렇게 간결하게 사용할 수 있다.
'# 개발 > Java' 카테고리의 다른 글
Java #7 - 상속, 오버라이드, Final (국비19일차) (0) | 2023.01.27 |
---|---|
Java #6 - 생성자, Static, 이너클래스, 지역클래스 (국비18일차) (0) | 2023.01.26 |
Java 연습문제 #4 (국비15일차) (0) | 2023.01.20 |
Java #4 - 배열 객체 Array, for each문 (국비16일차) (0) | 2023.01.20 |
Java #3 - String 객체 (국비15일차) (1) | 2023.01.19 |