yoni

[11][OOP] 클래스 선언, 객체 생성, 필드(변수)의 사용, 필드(변수)의 사용 실습 본문

java of educational by contents

[11][OOP] 클래스 선언, 객체 생성, 필드(변수)의 사용, 필드(변수)의 사용 실습

yoni-1117 2018. 12. 1. 12:30

[01] 클래스(CLASS:반, 학급, 그룹, 분류)
1) 데이터 표현 방법의 변화(진화)
    . OOP(Object Oriented Programming) 이전 시대: 문자 숫자 기반의 단순한 데이터 처리
      예) String 성명
           String 기술력
           String 프로젝트
           int 경력
           String 자격증
           int salary, int tax

           C언어의 구조체는 데이터를 묶어서 처리 지원   

    . OOP 시대: 의미 있는 데이터의 집합, 개발자가 새로운 데이터 타입을 생성하는 구조
     예) 개발자{
                   String 성명,
                   String 기술력,
                   String 프로젝트,
                   int 경력,
                   String 자격증}
         노트북{
                   String brand,
                   float cpu,
                   int hdd,
                   float lcd,
                   boolean wifi,
                   boolean bluetooth} 
         리조트{
                   String 객실,
                   Date 입실,
                   Date 퇴실,
                   Option 바베큐,
                   Option 요트}
         영화{
                String 제목,
                int 년도,
                String  장르,
                int 상영 시간,
                String 국가...}   

옥션
상품
- 상품 번호
- 이미지
- 상품명
- 설명
- 주문수량
- 가격
- 할인 가격
- 포인트
- 택배비
 
기사
- 기사 번호
- 제목
- 입력 시간
- 수정 시간
- 댓글 수
- 내용
- 이미지
- 조회수
- 도메인
- 추천수
- 저작권자
- 기사 출력 시간
- 기사 닫는 시간
 
노트북
- CPU
- HDD
- RAM
- display
- GPU
- brand
- price
- case
- weight
- hangle
- usb port
- hdmi
- bluetooth
 
회원
- 회원 번호
- 아이디
- 성명
- 전화번호
- 이메일
- 주소
- 패스워드
- 등급
- 호봉
- 직책

 

         배우{....

   
 
2) 데이터 처리 방법의 변화(진화)
   전통적인 프로그램은 순차식으로 구현되어 간결한 문법과 이해가 쉬웠습니다. 예) GW-BASIC...
   하지만 코드 라인수가 100라인만 지나가도 이해하기 어려워,
   소스 변경이 매우 힘들었습니다.
   
   순차 처리보다 발전된 프로그래밍 모델이 있는데 그것은 함수 기반 언어인
   C언어가 대표적입니다. 예) Fortran, C, COBOL, Pascal...
   C언어는 함수기반언어로 반복되는 코드를 그룹화해서 실행 할 수
   있었으나 같은 메모리의 데이터가 여러 함수들에 의해서 접근되어
   로직의 구분이 명확하지 않게되어 대규모 프로젝트를 진행하는데
   어려움이 많았습니다. 메모리 에러를 잡기 어려운 문제 발생.
   메모리 관련 코드의 분석이 어렵습니다.
        
   이를 개선한 OOP 모델은 각각의 기능과 데이터를 클래스라고 하는
   독립적인 코드 파일로 나누어, 서로간의 간섭을 줄이고,
   마치 레고블럭처럼 SW를 개발하는 모델을 말합니다.
   SW를 포함하여 이미 대부분의 산업이 레고처럼 블럭 구조기반으로 변경되고 있습니다.

   예) C++(OS, Tensorflow), Win32 API(Windows OS), MFC, JAVA, .NET....

   예) OOP 기반 SW는 코드 교체가 수월함.
        RAM: Samsung, Hynix, HP, 한미반도체...
        타이어 23560R17: 한국 타이어 HL3, 금호 크루젠 프리미엄, 넥센 RU50.....
   
3) CLASS: 변수와 메소드의 집합, 메모리에 데이터를 저장하기위한 구조를 제공.

   

 문자열, 숫자 ?

 
 다양한 성질의 문자열, 숫자, 이미지 -> CLASS, 기사 1000건 = 1000 CLASS
 CLASS: 변수 구성 설계도
 CLASS의 메모리할당: 객체
 
 Article article = new Article();
 
 article 객체로 메모리에 접근
 구성 요소에 멤버연산자 '.'을 이용하여 접근
 

 
Project type: Java Project 
        name: oop


 


1. OOP 기반 클래스의 형태
   - 필드(변수, 인스턴스 변수, 멤버 변수, 전역 변수, property): 처리할 데이터를 나타냄.
   - 메소드(함수, 인스턴스 메소드, 멤버 메소드): 필드(데이터)를 처리하는 기능.
   - 하나의 클래스는 메모리 할당시 다양한 값을 가지게 되며 객체라고  부릅니다.
   - new를 이용하여 만든 하나의 객체는 독립적으로 사용됩니다.
 
     예)

     // 클래스의 구성: 필드 + 메소드의 집합
     public class Actor {         // 클래스의 선언, 첫자를 대문자로 선언
       private String name;     // 필드, 인스턴스 변수, 멤버 변수, property, 전역 변수 
       private String position;     
  
       public void setName(String name){ // 메소드, 인스턴스 메소드, 함수...
         this.name = name;               
       }
  
       public void setPosition(String position){
         this.position = position;
       }
 
     }

   - new 명령어: 객체의 생성(참조 변수), 필드에 메모리 할당 
     Actor  rik = new Actor();  : rik 객체, 메모리 접근에 사용
     Actor  kal = new Actor();  : kal 객체, 메모리 접근에 사용
     Actor  mison = new Actor(); : mison 객체, 메모리 접근에 사용
     Actor  glen = new Actor();   : glen 객체, 메모리 접근에 사용

  - 객체명 rik, kal, mison, glen은 할당된 메모리를 접근하는 용도로 사용.


 


2. 필드(변수)로만 구성되어 있는 클래스
   - 클래스 이름의 지정: 목적이나 의미를 나타내는 클래스 이름을 지정할 것, 첫자는 대문자.


1) SSD라는 상품을 클래스로 나타낸 경우
   - 필드(변수)만 존재하는 경우
   - 필드(변수)에 값을 할당하지 않으면 기본값으로 자동으로 할당(초기화)됩니다.

   - //: 라인 주석, 단어/문장 주석
   - /* */: 블럭 주석
   - /** 상품명 */: 블럭 주석이면서 Documentation 주석
 

▷ /src/oop/SSD.java
- 다른 클래스에의해서 이용되어지는 클래스(부속, 콤포넌트)
- 실행시 소스 memory 영역에 저장된후 new 명령어에 의해서 메모리 할당을 받고 사용됨.
-------------------------------------------------------------------------------------
package oop;
 
// SSD class 선언
public class SSD {


 
 
}
 
  
-------------------------------------------------------------------------------------



2) SSD.java class를 사용하는 방법: new 명령어를 이용하여 필드에 메모리 할당
    - SSD ssd = new SSD();

      SSD: 클래스명
      ssd: 할당된 메모리에 붙는 이름, 객체
      new: RAM 메모리 할당, 클래스의 필드들이 메모리에 할당됨.
      SSD(): 생성자

     

[실행 화면]

128 GB
50000 원
45000 원
1 개
-------------------
256 GB
70000 원
65000 원
2 개
 

▷ /src/oop/SSDMain.java
- .: 멤버 연산자
- 다른 클래스를 이용하는 클래스

-------------------------------------------------------------------------------------
package oop;
 
public class SSDMain {
 
  public static void main(String[] args) {
    SSD ssd = new SSD(); // ssd 객체 생성
    System.out.println(ssd.hashCode()); // .: 멤버 연산자
    // 2018699554
    System.out.println(ssd.name); // ssd 객체의 name 변수
    System.out.println(ssd.price + " 원");
    System.out.println(ssd.dc + " 원");
    System.out.println(ssd.count + " 개");
    System.out.println("-------------------");
    ssd.name = "256 GB";
    ssd.price = 70000;
    ssd.dc = ssd.price - 5000;
    ssd.count = 2;
 
    System.out.println(ssd.name);
    System.out.println(ssd.price + " 원");
    System.out.println(ssd.dc + " 원");
    System.out.println(ssd.count + " 개");
  }
 
}
 
 
 
 
-------------------------------------------------------------------------------------
 
  
 
[실습 1] 초기값을 지정하지 않은 필드(변수)로만 구성되어 있는 클래스의 출력
- char타입은 값이 없으면 공백 한칸이 할당됩니다.


[실행 화면]

0
null
0
0.0
false
> <
-----------------
2016
노트북
600000
3.5
true
A
 


▷ /src/oop/Field.java
- 필드 6개 선언, 연산 없음.
-------------------------------------------------------------------------------------

package oop;
 
public class Field {


 
}
 
   
-------------------------------------------------------------------------------------




▷ /src/oop/FieldUse.java 
- null: 메모리를 할당받지 못한 변수에 부여되는 기호.
-------------------------------------------------------------------------------------

package oop;
 
public class FieldUse {
 
   public static void main(String[] args) {
      // field: 객체
      Field field = new Field();
      
      System.out.println(field.year); // 0
      System.out.println(field.product); // null
      System.out.println(field.price); // 0
      System.out.println(field.dc); // 0.0
      System.out.println(field.as); // false
      System.out.println(">" + field.grade + "<");
      System.out.println("-----------------");
      
      // 객체에 새로운 값 할당
      field.year = 2016;
      field.product = "노트북";
      field.price = 600000;
      field.dc = 3.5;
      field.as = true;
      field.grade = 'A';
      
      System.out.println(field.year); 
      System.out.println(field.product); 
      System.out.println(field.price);
      System.out.println(field.dc);
      System.out.println(field.as);
      System.out.println(field.grade);
      
   }
 
}
   
 
 
-------------------------------------------------------------------------------------
 

 
 

[실습 1] 도서 클래스를 선언하고 객체를 만들어 데이터를 출력하는 클래스를 작성하세요.

① Book.java 클래스 선언, 필드(변수) 선언, 값을 할당하지 않습니다.
② BookUse.java 클래스 선언
③ BookUse 클래스에서 Book 클래스 객체 생성
④ Book 클래스의 객체에 값을 할당
⑤ Book 클래스 객체의 필드 값 출력
⑥ 판매가: 정가 - (정가 * 할인율/100), (int)실수 --> 정수


[실행 화면]

자바 프로그래밍 기초  ←  도서명
교학사                     ← 출판사
20000 원                  ← 가격
10.0 %                     ← 할인율
18000 원                  ← 판매가


▷ /src/oop/Book.java
- 필드(변수)만 선언합니다. 값을 할당하지 않습니다.
- 필드(변수)의 갯수는 5개로하세요.
-------------------------------------------------------------------------------------

package oop;
 
public class Book {


 
}
 
   
 
-------------------------------------------------------------------------------------
 
▷ /src/oop/BookUse.java
- Book 클래스 객체 생성, Book 클래스의 객체에 값을 할당,
  Book 클래스 객체의 필드 값 출력
-------------------------------------------------------------------------------------

package oop;
 
public class BookUse {
 
  public static void main(String[] args) {
    Book book = new Book();
 
    book.name = "자바 프로그래밍 기초";
    book.publisher = "교학사";
    book.price = 20000;
    book.dc = 10.0;
    book.sale = (int)(book.price - (book.price * book.dc/100));
 
    System.out.println(book.name);
    System.out.println(book.publisher);
    System.out.println(book.price + " 원");
    System.out.println(book.dc + " %");
    System.out.println(book.sale + " 원");
 
  }
 
}
 
 
 
 
-------------------------------------------------------------------------------------
 
 
 

[실습 2] 한우 클래스를 선언하고 객체를 만들어 데이터를 출력하는 클래스를 작성하세요.

 

① Hanwoo.java 클래스 선언, 필드 선언, 값을 할당하지 않습니다.
② HanwooUse.java 클래스 선언
③ HanwooUse 클래스에서 Hanwoo 클래스 객체 생성
④ Hanwoo 클래스의 객체에 값을 할당
⑤ Hanwoo 클래스 객체의 필드 값 출력
⑥ 가격: 100 g X 8000
    할인가: 가격의 10% 할인된 가격


[실행 화면]

꽃등심    ← 상품명
횡성       ← 원산지
200 g      ← 무게  
16000 원  ← (무게/100) X 8000
14400 원  ← 가격의 10% 할인된 가격 


▷ /src/oop/Hanwoo.java
- 필드(변수)만 선언합니다. 값을 할당하지 않습니다.
- 필드(변수)의 갯수는 5개로하세요.
-------------------------------------------------------------------------------------

package oop;
 
public class Hanwoo {

 
 
}
  
 
-------------------------------------------------------------------------------------
 
▷ /src/oop/HanwooUse.java
- Hanwoo 클래스 객체 생성, Hanwoo 클래스의 객체에 값을 할당,
  Hanwoo 클래스 객체의 필드 값 출력
-------------------------------------------------------------------------------------

package oop;
 
public class HanwooUse {
 
  public static void main(String[] args) {
    Hanwoo hanwoo = new Hanwoo();
    
    hanwoo.name = "꽃등심";
    hanwoo.productor = "횡성";
    hanwoo.weight = 200;
    hanwoo.price = (hanwoo.weight/100)*8000;
    hanwoo.dc = hanwoo.price - (int)(hanwoo.price * 0.1);
    
    System.out.println(hanwoo.name);
    System.out.println(hanwoo.productor);
    System.out.println(hanwoo.weight + " g");
    System.out.println(hanwoo.price + " 원");
    System.out.println(hanwoo.dc + " 원");
  }
 
}
 
 
-------------------------------------------------------------------------------------
 
 
 
 
[과제 3] 데이터 클래스(Book, Hanwoo)를 이용하는 클래스(BookUse, HanwooUse)를
           삭제후 다시 제작해보세요.
 
  
   
[참고] 메소드를 사용하지 않은 경우 반복 코드 문제 발생


package oop;
 
public class HanwooUse2 {
 
  public static void main(String[] args) {
    Hanwoo hanwoo = new Hanwoo();
    
    hanwoo.name = "꽃등심";
    hanwoo.productor = "횡성";
    hanwoo.weight = 400;
    hanwoo.price = (hanwoo.weight/100)*8000;
    hanwoo.dc = hanwoo.price - (int)(hanwoo.price * 0.1);
    
    System.out.println("상품명: " + hanwoo.name);
    System.out.println("원산지: " + hanwoo.productor);
    System.out.println("무   게: " + hanwoo.weight + " g");
    System.out.println("가   격: " + hanwoo.price + " 원");
    System.out.println("할인가: " + hanwoo.dc + " 원");
    System.out.println("------------------------------");
    
    hanwoo.name = "부채살";
    hanwoo.productor = "횡성";
    hanwoo.weight = 400;
    hanwoo.price = (hanwoo.weight/100)*12000;
    hanwoo.dc = hanwoo.price - (int)(hanwoo.price * 0.1);
    
    System.out.println("상품명: " + hanwoo.name);
    System.out.println("원산지: " + hanwoo.productor);
    System.out.println("무   게: " + hanwoo.weight + " g");
    System.out.println("가   격: " + hanwoo.price + " 원");
    System.out.println("할인가: " + hanwoo.dc + " 원");
    System.out.println("------------------------------");
    
    hanwoo.name = "채끝";
    hanwoo.productor = "산외한우 마을";
    hanwoo.weight = 400;
    hanwoo.price = (hanwoo.weight/100)*6000;
    hanwoo.dc = hanwoo.price - (int)(hanwoo.price * 0.1);
    
    System.out.println("상품명: " + hanwoo.name);
    System.out.println("원산지: " + hanwoo.productor);
    System.out.println("무   게: " + hanwoo.weight + " g");
    System.out.println("가   격: " + hanwoo.price + " 원");
    System.out.println("할인가: " + hanwoo.dc + " 원");
    System.out.println("------------------------------");
    
    hanwoo.name = "갈비살";
    hanwoo.productor = "홍성";
    hanwoo.weight = 400;
    hanwoo.price = (hanwoo.weight/100)*10000;
    hanwoo.dc = hanwoo.price - (int)(hanwoo.price * 0.1);
    
    System.out.println("상품명: " + hanwoo.name);
    System.out.println("원산지: " + hanwoo.productor);
    System.out.println("무   게: " + hanwoo.weight + " g");
    System.out.println("가   격: " + hanwoo.price + " 원");
    System.out.println("할인가: " + hanwoo.dc + " 원");
    
    
  }
 
}
 


Comments