컴퓨터 관련/JAVA 강의

java #11 객체지향프로그래밍

승명 2016. 12. 18. 19:26

java #11 객체지향프로그래밍

 
* OOP(Object Oriented Programming)

- 실생활에 존재하는 사물을 객체로 보고 그 객체를 컴퓨터에서 구현하여 사용하는 데 적합한 언어
- 3대 특징 : 상속(클래스의 계층화 등), 다형성, 캡슐화


* 클래스(설계도)

- 참조형 데이터형 : 실제 데이터는 메모리의 다른 곳에 저장이 되고 그 주소를 저장하는 데이터형
- 사용자 정의 자료형 : Java에서 제공하는 데이터형을 조합하여 이름을 부여하고 사용하는 데이터형


* 클래스 작성순서

1. 대상선정
2. 추상화(객체 모델링) : 공통 특징 뽑는 일
마카펜 명사적 특징(보이는 특징) : 뚜껑, 몸체, 색 -> 변수로
           동사적 특징(사용상의 특징) : 쓴다. -> 메소드로 구현
3. Class 작성 : 사용자정의자료형, 참조형데이터형
4. 객체화

new 생성자();

클래스명 객체명 = new 생성자(=클래스명)();
is a 객체화부모클래스명 객체명 = new 자식생성자();

new 생성자().메서드();
inner class1. 바깥클래스 생성
1
2
바깥클래스명 객체명 = new 바깥클래스생성자();
Outer out = new outer();
cs

2. 안쪽 클래스 생성
1
2
바깥클래스명.안쪽클래스명 객체명 = 바깥클래스객체명.new 안쪽클래스생성자();
Outer.Inner in = out.new Inner();
cs
- 컴파일하면 outter.class와 outter$Inner.class가 생성된다.

5. 기능사용
     객체명,메서드();


* 마커펜을 객체 모델링한 코딩 예제

※ 기호 설명 - +:public, #:protected, -:private(default)
클래스 명+Maker
field-int cap, body
-String color                     //변수는 메소드를 통해서만 값을 입력받아야 하므로 private
method+ setCap(int):void
+ setBody(int):void              SETTER // 클래스 밖에서 불러야 하므로 public
+ setColor(String):void


+ getCap():int
+ getBody():String               GETTER
+ getColor():String


+write(String):String - 기능

+Usemaker

+static main(String[]):void

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package day0217;
 
/**
* Marker펜을 대상으로 선정하여 추상화 한 후 만들어낸 클래스 <br?>
* 마카펜은 뚜껑, 몸체, 색이 명사적인 특징이고, 동사적인 특징은 쓴다. 동사적인 특징은 '쓴다'.
*/
public class Marker {
     private int cap; // 마카펜의 뚜껑, 몸체의 갯수를 저장
     private int body;
     String color; // 마카펜의 색을 저장
 
     /**
     * 생성된 마카펜의 뚜껑의 갯수를 설정하는 일.
     *
     * @param cap
     *            설정할 뚜껑의 갯수
     */
     public void setCap(int cap) {
          this.cap = cap;
     }// setCap
 
     /**
     * 마카펜의 몸체를 설정하는 일
     *
     * @param body
     *            설정할 몸체의 갯수
     */
 
     public void setBody(int body) {
          this.body = body;
     }// setBody
 
     /**
     * 마카펜의 색을 설정하는 일
     *
     * @param color
     *            설정할 색
     */
     public void setColor(String color) {
          this.color = color;
     }
 
     /**
     * 생성된 마카펜객체가 가지고 있는 뚜껑의 갯수를 반환
     *
     * @return 뚜껑의 갯수
     */
     public int getCap() {
          return cap;
     }// getCap(){
    
     /**
     * 몸체의 갯수 반환
     * @return 몸체의 갯수
     */
     public int getBody() {
          return body;
     }// getBody(){
    
     /**컬러 반환
     * @return 컬러
     */
     public String getColor() {
          return color;
     }// getColor
    
     ////동사적인특징/////
     /**
     * 마카펜의 동사적인 특징을 정의한 메서드<br/>
     * 칠판에 parameter로 들어온 메세지를 쓰는일을 한다.
     * @param message 쓰고싶은 메세지
     * @return 쓰고난 결과
     */
     public String write(String message){
          return color+"색인 마카펜으로 칠판에 "+message+"를 쓴다.";
     }//write
}// class
 
/*
* 내가 만든 클래스로 API문서 만들기(내 클래스의 설명서)
* 사용법 : java파일이 있는 위치에서
* prompt> javadoc -d. API를만들소스파일
* javadoc -d . Marker.java
*/
 
cs
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
 package day0217;
 
/**
* Marker클래스를 객체로 만들고 동사적인 특징을 사용하는 클래스
*
* @author SiSt
*
*/
public class UseMarker {
     public static void main(String[]args){
          //참조형 데이터형은 heap의 주소를 할당받으려면 new 키워드를 
          //사용하여 객체를 생성하여야만 할당받을 수 있다.
          //black은 Stack에 만들어지고, heap에 있는 
          //Marker클래스의 변수크기를 정하며 변수의 주소를 참조함.
          Marker black=new Marker(); 
          //instance변수의 값이 자동초기화된다.
          //black.cap=10; //instance변수의 접근지정자가 private이 아닌 경우에는 
          //클래스 외부에서 값을 마음대로 바꿀수 있다.(개발자가 원하는 값이 ㄹ니ㅏㅇ 수도 있다.
          //System.out.println(black.cap);
          //System.out.println(black.getColor());
          //마카펜의 뚜껑의 갯수를 설정
          black.setCap(1);
          black.setColor("검은");
          black.setBody(1);
          System.out.println("마카펜의 뚜껑 : " +black.getCap()+ "개, 몸체 : "+black.getBody()+"개, "+black.getColor()+"색");
          System.out.println(black.write("안녕하세요"));
    
          //파란색마카생성, 사용
          Marker blue = new Marker();
          blue.setCap(1);
          blue.setBody(1);
          blue.setColor("파란");
          System.out.println("마카펜의 뚜껑 : " +blue.getCap()+ "개, 몸체 : "+blue.getBody()+"개, "+blue.getColor()+"색");
          System.out.println(blue.write("하하하"));
         
         
         
     }
}
cs


* 사람을 객체 모델링한 코딩 예제

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package day0217;
 
/**
* 사람을 객체모델링하여 만든 클래스<br/>
* 사람의 명사적 특징 : 눈,코,입,이름<br/>
* 사람의 동사적특징 : 먹는일<br/>
* 사용예) 객체화 Person p = new Person();
* @author SiSt
*/
public class Person {
     private int eye,nose,mouth;
     private String name;
    
     /**
     * 사람객체의 눈의 개수
     * @param eye 설정할 눈의 개수
     */
     public void setEye(int eye){
          this.eye=eye;
          }
     /**
     * 사람객체의 코의 개수
     * @param nose 설정할 코의 개수
     */
     public void setNose(int nose){
          this.nose=nose;
     }
/**
* 사람객체의 입의 개수
* @param mouth 설정할 입의 개수
*/
public void setMouth(int mouth){
     this.mouth=mouth;
}
/**
* 사람의 이름
* @param name 설정할 이름
*/
public void setName(String name){
     this.name=name;
     }
/**사람 눈의 갯수
* @return 눈의 갯수
*/
public int getEye(){
return eye;
}
/**코의 갯수
* @return 코의 갯수
*/
public int getNose(){
return nose;
}
/** 입의 갯수
* @return 입의 갯수
*/
public int getMouth(){
return mouth;
}
 
public String getName(){
     return name;
}
/**
* 사람이 집에서 밥을 먹는다.
* @return
*/
public String eat(){
     return name+"이(가) 집에서 밥을 먹는다.";
}
/**
* Overload된 메소드<br/>
* 사람이 밖에서 음식을 사먹는 일.
* @param menu 사먹는 음식의 종류
* @param price 사먹는 음식의 가격
* @return 사먹는 일
*/
public String eat(String menu, int price){
     return name+"이 식당에서 "+menu+"인 음식을 " + price+"원 내고 사먹는다.";
}
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 package day0217;
 
public class UsePerson {
 
     public static void main(String[] args) {
          Person ducksu = new Person();
          ducksu.setEye(2);
          ducksu.setNose(1);
          ducksu.setMouth(1);
          ducksu.setName("김덕수");
         
          System.out.println(ducksu.eat());
          System.out.println(ducksu.eat("탕수육",4500));
          System.out.println(ducksu.getName()+"객체는 눈 : "+ducksu.getEye()+"개, 코 : "+ducksu.getNose()+" 개, 입 : " + ducksu.getMouth()+"개로 설정되어 있습니다.");
     }
}
cs

* 주석 (comment)

- 코딩시 코드의 부연설명, 만들어진 코드의 실행을 막을 때 사용
- 소스코드에만 들어가고 byte code(x.class) 에는 들어가지 않는다.
- 종류
     = jvadoc.exe로 api만들때 쓰는 닥주석
     /**
     API 주석, Java doc 주석.
     */

     - 여러줄 주석
     /*
     */
     - 한줄 주석 
     //
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
package day0217;
 
/**
* 주석의 사용법
* @author SiSt
*/
 
/**
* API주석, javadoc주석:class위, canstant위, method위에 설정하는 주석으로서 여러줄을 사용할 수 있고, java파일(source코드)을 javadoc.exe를 가지고
* 들어가는 주석이다.
*/
public class Comment {
 
     /**
     * API주석 : alt+shift+j
     */
     public static void main(String[] args) {
          // 한줄 주석 : 코드의 부연설명이 짧거나 한줄코드의 수행을 막을 때.
         
          /*
          * 여러줄 주석:코드의 부연설명이 길거나, 여러줄 코드의 수행을 막을 때
          */
 
     }
 
}