20.03 ~ 20.08 국비교육/JAVA

클래스 구조

찹키리 2020. 3. 21. 20:26

<클래스>

 

1) 자바 프로그램의 기본 단위

 

2) 클래스 이름과 저장되는 파일명(저장 소스명)이 같다.

 

3) 하나의 소스(패키지)에 여러 개의 클래스를 정의할 수 있다.

 

4) 여러 개의 클래스 중 public 클래스의 이름으로 저장한다.

 

5) 컴파일하면 클래스파일은 각각 생성된다.

 

6) public 클래스 안에 main(실행) 함수를 정의해야 한다.

 

7) 클래스를 사용하려면 main함수 내에서 인스턴스를 생성해야 한다.

★클래스명 객체변수명 = new 생성자() <--- 선언

객변.멤버(변수/메소드) <--- 호출

 

8) method area(code segment, main)/heap/stack

-> 그림을 그려보면 이해가 빠르다.

 

*즉, 클래스를 만들지 않으면, 아무것도 만들 수가 없다.

A.java: 소스, 리소스   ---컴파일--->   A.class: 클래스파일   ---실행--->   OS/JVM/A실행
  문자코드             ------------>      바이트코드         ---------->   가상머신(JVM) 필요
★public★ A Class{ }  ------------>   public은 얘만 붙일 수 있다. 동일한 파일에서는 public 하나의 클래스만 붙일 수 있다.
B Class{ }             ------------>      B.class
C Class{ }             ------------>      C.class
(소스는 하나인데 클래스 여러개 정의 가능: 소스이름 = 클래스 이름)

-> A클래스는 공개되는 클래스(public)이고, A 안에서 B와 C클래스를 참조하고 있다.(내부에서 A를 도와주는 서포터 클래스)

 

 

 

 

 

<종속된 클래스(내포 클래스)>

Class A {
     Class B {
     }
{

-> B클래스가 A클래스에 종속되어 있다.

-> A.class, A$B.class로 생성(달러표시)

 

 

 

 

<저장 클래스와 실행 클래스>

저장 클래스와 처리 및 실행 클래스를 따로 분리해서 만들 수 있다.

이 경우 라이브러리에 저장되기 때문에, 라이브러리를 가지고 있어야 한다.

-> 클래스 단위의 재활용을 위한 기능이다. 객!체!지!향!

-> 반복되는 함수는 무조건 함수화, 메소드로 만들기★

 

단 클래스 앞에 public이 붙지 않으면 다른 패키지에서 접근이 불가하다.(friendly) 
---> 재활용 - 은닉화 충돌

 

 

<예제>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
class Pay{ // 도우미 클래스 -> 함수(메소드) 없이 변수만 저장한다.
    String name;
    int bonbong;
    int tax;
    int silsu;
// 다른 패키지에서는 접근할 수 없다. 재활용X
 
public class PayCalc {
// 동일 소스 안에 클래스가 2개 이상이면 main함수가 있는 클래스에서 인스턴스를 생성한다.
// 나머지 클래스는 부수적으로 명기한다.
    public static void main(String[] args) {
        Pay p1 = new Pay();
        Pay p2 = new Pay();
        Pay p3 = new Pay();
 
        p1.bonbong = 2000000;
        p1.name = "왕눈이";
        p1.tax = (int)(p1.bonbong * 0.045 + 0.5);
        p1.silsu = p1.bonbong - p1.tax;
 
        p2.bonbong = 2500000;
        p2.name = "아로미";
        p2.tax = (int)(p2.bonbong * 0.045 + 0.5);
        p2.silsu = p2.bonbong - p2.tax;
 
        p3.bonbong = 1500000;
        p3.name = "투투";
        p3.tax = (int)(p3.bonbong * 0.045 + 0.5);
        p3.silsu = p3.bonbong - p3.tax;
 
        System.out.println("--------------------");
        System.out.println("---12월 급여 내역---");
        System.out.println("--------------------");
        System.out.println("성명: " + p1.name);
        System.out.println("본봉: " + p1.bonbong);
        System.out.println("세금: " + p1.tax);
        System.out.println("실 수령액: " + p1.silsu);
        System.out.println("");
 
        System.out.println("--------------------");
        System.out.println("---12월 급여 내역---");
        System.out.println("--------------------");
        System.out.println("성명: " + p2.name);
        System.out.println("본봉: " + p2.bonbong);
        System.out.println("세금: " + p2.tax);
        System.out.println("실 수령액: " + p2.silsu);
        System.out.println("");
 
        System.out.println("--------------------");
        System.out.println("---12월 급여 내역---");
        System.out.println("--------------------");
        System.out.println("성명: " + p3.name);
        System.out.println("본봉: " + p3.bonbong);
        System.out.println("세금: " + p3.tax);
        System.out.println("실 수령액: " + p3.silsu);
        System.out.println("");
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

-> 클래스 활용의 좋지 않은 예

재활용성이라는 객체지향의 이점을 하나도 활용하지 못했다.

★반복되는 함수는 무조건 함수화, 메소드로 만들기★

 

 

 

 

<수정 예제>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
class Pay4 {
 
    String name;
    int bonbong;
    int tax;
    int silsu;
 
    public void setTax() {
        tax = (int)(bonbong  0.05 + 0.5);
    }
 
    public void setSilsu() {
        float f;
        silsu = bonbong - tax;
        //10자리 절삭(소수점 떼어내기)
        f = silsu / 100.0f;
        silsu - ((int)f) * 100;
    }
 
    public void prnPay() {
        System.out.println("성명: " + name);
        System.out.println("본봉: " + bonbong);
        System.out.println("세금: " + tax);
        System.out.println("실 수령액: " + silsu);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

저장 클래스

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
public class PayCalc4 {
    public static void main(String[] args) {
 
    Pay4 p1 = new Pay4();
    Pay4 p2 = new Pay4();
 
    p1.bonbong = 2157635;
    p1.name = "왕눈이";
    p1.setTax();
    p1.setSilsu();
    p1.prnPay();
 
    System.out.println("--------------------");
 
 
    p2.bonbong = 1987557;
    p2.name = "";
    p2.setTax();
    p2.setSilsu();
    p2.prnPay();
 
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

실행 클래스

저장 클래스에 반복적인 작업을 함수화시켜 메소드를 만들었고, 처리 클래스에서 이를 호출해 사용했다.

재활용성이라는 객체지향 언어의 특성을 살린 예제가 되었다.

 

다만 지금 다시 생각해 보니, Pay 클래스에서 이름이랑 본봉을 인자로 받는 생성자를 만들고, setter 대신 getter를 사용해 세금과 실수령을 반환하는 함수를 만드는 편이 보다 간편한 작업이 될 것 같다. 뭔가, 점점 지식의 폭이 넓어지고 있는 기분이 든다!

'20.03 ~ 20.08 국비교육 > JAVA' 카테고리의 다른 글

Call by value vs Call by reference  (0) 2020.03.21
클래스 멤버 메소드  (0) 2020.03.21
배열  (0) 2020.03.21
7. 제어문 - 반복문(while문, for문)  (0) 2020.03.21
6. 제어문 - 조건문(if문, switch문)  (0) 2020.03.21