Programming/JAVA

JAVA Web#7 Day 7 자바의 클래스

copotter 2019. 3. 3. 03:07

day7

190226 금일은 자바의 클래스에 대해서 배웠습니다.

클래스에 대해 배우고 나니, 이제 좀 뭔가 드디어 프로그래밍 다운걸 하는 느낌이 드는 것 같습니다.

조금씩 바로 이해가 안가는 것도 생기기 시작하기도 합니다.

<클래스>

--객체지향프로그래밍(OOP)

: 재사용성이 증가하고, 확장성이 증가한다.


--객체 : 설계도(클래스)에 의해 메모리안에 생성되어 있는 것.

--속성 : 객체가 가지고 있는 객체를 구분할 수 있는 고유한 성질.

--동작 : 객체가 가지고 있는 고유한 기능

(같은 설계도로 만들어진 객체들은 동작은 같을 수 있어도, 속성은 다름)

[설계도]    [객체]

필드 ----->속성

메소드 --->동작

   new키워드


*설계도명 변수명 = new 설계도명();    <-- 객체 선언 형식.

   Car          c    = new Car();


--필드 : 클래스 안에 바로 만들어지는 변수

1
2
3
4
5
6
7
public class Car {
    // 필드 정의        객체의 해당 기능을 실행하기 위한 
    String modelName;    // 모델명을 담을 수 있는 그릇이 객체안에 만들어지게 함
    String maker;
    int price;
    int makeYear;
}
cs

(Car라는 클래스 소스와, Car클래스를 이용한 CarApp 소스입니다. 클래스를 다루는 이 시점부터는 여러 자바소스파일을

연동시켜서 코딩을 하게될 것입니다.)


위 소스를 보시면, 메인함수가 없습니다. 이 소스는 Car라는 객체를 만들기 위한 클래스입니다. 즉, 설계도 도면이죠.

Car라는 클래스 안에 있는 3,4,5,6행의 변수들은 필드라고 불리게 됩니다.


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
public class CarApp {
    public static void main (String[] args) {
        // Car 설계도로 객체 생성하기
        // new Car();
 
        // Car 설계도로 객체 생성하고, 생성된 객체의 주소값을 참조변수(리모콘)에 대입하기
        // Car c1 =new Car();
 
        Car c1 = new Car();
        Car c2 = new Car();
 
        // 생성된 객체의 속성(필드)에 값 담기
        c1.modelName = "제네시스";
        c1.maker = "현대자동차";
        c1.price = 70000000;
        c1.makeYear = 2019;
    
        c2.modelName = "XC40";
        c2.maker = "볼보자동차";
        c2.price = 54000000;
        c2.makeYear = 2018;
 
        //생성된 객체의 속성 사용하기
        System.out.println("1자동차이름 : " +c1.modelName);
        System.out.println("1자동차회사 : " +c1.maker);
        
        System.out.println("2자동차이름 : " +c2.modelName);
        System.out.println("2자동차회사 : " +c2.maker);
    }
}
cs


위에서 만든 Car클래스를 사용하기 위해9,10 행과 같이 Car클래스의 객체를 생성해줍니다. ( 이때 두 파일은 같은 디렉토리에 있어야합니다.)

9,10행으로 만들어진 c1, c2객체들은 Car클래스가 가진 필드(modelName~등등) 을 가지게 됩니다. 해서, 따로 변수 선언을 하지 않아도

12~21행처럼 각각의 객체들에게 있는 필드를 초기화할 수 있게 됩니다.


초기화 후, 24행 c1.modelName처럼 사용하게되면 c1이라는 객체의 modelName필드를 불러오는 뜻이 되게 되서, 제네시스라는 말이 출력됩니다.



아래는, 클래스를 이용하여 기존에 만들던 프로그램을 좀더 직관적으로 만든 소스입니다.

1
2
3
4
5
public class Item {    // Item이라는 객체를 만들 클래스.
    String name;
    int price;
    int amount;
}
cs

만들어서 쓸 Item이라는 클래스를 만들고,

Item의 필드를 입력받고, 출력받고, 종료하는 프로그램을 구현했습니다.

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
import java.util.Scanner;
 
public class ItemApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
 
        Item[] cart = new Item[3];
 
        for (;;) {
            System.out.println("------------------------------------");
            System.out.println("1.입력 | 2.출력 | 0.종료");
            System.out.println("------------------------------------");
 
            System.out.print("선택> ");
            int selectNo = scanner.nextInt();
            
            if (selectNo == 1) {
                for (int i=0; i<3; i++) {
                    System.out.print("상품명 입력> ");
                    String productName = scanner.next();
                    System.out.print("상품 수량 입력> ");
                    int productNum = scanner.nextInt();
                    System.out.print("구매 가격 입력> ");
                    int productPrice = scanner.nextInt();
                
                    Item item = new Item();        // 상품정보 저장용 Item객체 생성
                    item.name = productName;
                    item.amount = productNum;
                    item.price = productPrice;
                    cart[i] = item;                // for문안에서 item객체에 입력받은 값을 cart배열에 저장하는 작업을 반복.
                }                                //  (for문 후, item객체는 소멸=>값들은 cart배열에 저장되어 나온다.)
            } else if (selectNo == 2) {
                System.out.println("================출력================");
                System.out.println("상품명\t\t상품수량\t상품가격");
 
                for (Item x : cart) {            // cart배열의 타입에 맞춰서 반복되는 x인덱스의 타입역시 Item타입으로 한다.
                    System.out.println(x.name + "\t\t" + x.amount + "\t\t" + x.price + "원");
                }
            } else if (selectNo == 0) {
                System.out.println("프로그램 종료");
                break;
            }
        }
    }
}
cs

우선, 7행에서 Item객체를 사용하기 위한 선언을 해줍니다. 이때, 여러가지의 Item객체를 사용하기 위해서, 객체 배열로 만들어줍니다.

즉, Item객체를 사용할 cart라는 배열을 3개의 크기로 선언한 것입니다.


9~15행으로 입력,출력,종료 폼을 만들고 메뉴숫자 선택을 만들고, 본격적으로 아래를 보시겠습니다.

18행은 3개의 크기로 선언했으므로 3번 반복해야 해서 있는 것이고,

19~24행에서 상품명,수량,가격 등을 입력받을 변수를 만들어 입력받습니다.

26행은 위의 입력받은 변수들을 저장할 객체를 만들어줍니다.

27~29행 26행의 객체에 앞서 입력받은것들을 저장해주고, 30행, cart객체배열 i번째에 그 객체를 저장합니다.

3번 반복을 하고나면, cart[0], cart[1], cart[2]에 입력받은 각각의 객체들이 저장되겠죠.



36행을 보시면, enhanced-for문으로 cart객체배열을 크기만큼 반복해줍니다. 이때, 배열의 구성요소인 item객체 타입으로

반복이 되겠죠. 이 뜻은, 첫번째 반복때 x.name은 cart[0].name이 되고 이는, cart[0]에 담긴 item객체가 됩니다.


위의 클래스 응용 소스들을 몇가지 첨부해뒀습니다. 주석에 간단한 설명을 달아두었으니 참고하셔서 공부하시고,

혹 질문 사항있으시면 질문 해주세요.

classStudy.zip

day7.zip


연휴가 끼다보니 포스팅이 하루씩 밀려서 늦어졌습니다...내일 저녁에는 메소드와, 오버로딩, 생성자 강의 내용으로 찾아뵙겠습니다.