Java

[Java] 객체 지향 클래스 ( 클래스 / 모델링 / 자료형 참조변수 / 객체 할당 연산자 / instance )

소댓 2023. 3. 13. 19:09

* 클래스와 객체

- 클래스란 '객체를 정의해놓은 것' 또는 클래스는 '객체의 설계도 또는 틀'

- 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성됨

 

* 객체와 인스턴스

- 클래스의 인스턴스화 : 클래스로부터 객체를 만드는 과정

- 클래스의 인스턴스 : 어떤 클래스로부터 만들어진 객체

- 결국, 인스턴스는 객체와 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며,

  인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있음

 

* 객체의 구성요소 - 속성과 기능

- 속성(property)  : 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)

- 기능(function) : 메서드(method), 함수(function), 행위(behavior)

 

>> 같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(멤버변수)은 서로 다른 값을 유지할 수 있으며, 

     메서드의 내용은 모든 인스턴스에 대해 동일하다.

 


* 모델링

: 현실 세계의 사물을 컴퓨터 세계로 가져오는 과정

 

1. primitive type : 8
2. reference type : array, class, interface
> 객체를 생성하기 위한 틀, Template, 설계도

 

- 객체의 설계도 : class
> 구성요소
  1. member 변수, 멤버 필드(field)
  2. member method

  3. 생성자


- 생성자 : 특수 목적 메서드
> 멤버 변수의 초기화를 목적으로 가지고 있는 메서드
> 리턴하지도 않고 리턴 키워드도 없음
> void도 사용하지 않는다.
> 클래스명과 동일한 이름을 갖는다.
> 생성자를 따로 지정하지 않으면 
   기본생성자는(Marine()) 존재하는 것으로 간주

 

- 메모리에 올라와있는 변수 : instance
- c 참조값 : 객체

 

1 ) Car - myCar

 

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
package day08;
// 객체의 설계도 : class
// 구성요소
// 1. member 변수, 멤버 필드(field)
// 2. member method
 
// Car 클래스 시작
public class Car {
    // 속성, 특징
    int 핸들, 바퀴, 엔진, 문, 속도;
    String 차종, 제조사;
 
    // 행위, 동작
    // 멤버 메서드
    // 전진, 후진 정지, 가속, 감속
    
    void 전진() {
        System.out.println("부릉부릉~~~~");
    }
    void 후진() {
        System.out.println("띠리리~~~~");
    }
    void 정지() {
        System.out.println("끼익~~~");
    }
    void 가속() {
        System.out.println("슝~~~~");
    }
    void 감속() {
        System.out.println("~~~~ 감속 ~~~~");
    }
    
}
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
package day08;
// 현실 세계의 사물을 컴퓨터 세계로 가져오는 과정 : 모델링
 
// 1. primitive type : 8
// 2. reference type : array, class, interface
// 객체를 생성하기 위한 틀, Template, 설계도
public class TestMain01 {
    public static void main(String[] args) {
        
        // 설계도를 가지고 객체 만들기
        
        // 자료형 참조변수
        Car c;
        // 참조변수 = new 생성자();
        
        c = new Car();
        // new 객체 할당 연산자
        System.out.println("c : "+c);
        
        System.out.println("핸들 : "+c.핸들);
        System.out.println("바퀴 : "+c.바퀴);
        System.out.println("차종 : "+c.차종);
        
        // 바퀴 : 0
        // 차종 : null
        
        System.out.println("----------------------------");
        c.핸들 = 1;
        c.바퀴 = 4;
        c.문 = 4;
        c.차종 = "꼬마자동차 붕붕";
        c.제조사 = "엄마자동차";
        
        System.out.println("핸들 : "+c.핸들);
        System.out.println("바퀴 : "+c.바퀴);
        System.out.println("차종 : "+c.차종);
        
        c.전진();
        
        c.후진();
        c.정지();
        c.가속();
        c.감속();
        
        // 자료형 참조변수 = new 생성자();
        Car c2 = new Car(); 
        // c2는 Car 클래스의 instance
        
        System.out.println("c2 : "+c2);
        // 메모리에 올라와있는 변수 : instance
        // c 참조값 : 객체
        
        // 새로운 자동차 객체를 만들고 멤버변수의 값을 초기화 시키고
        // 전진, 후진 메서드를 호출해 보세요.
        // 이름 : myCar
        
        // 차종을 출력
 
        Car myCar = new Car();
        
        myCar.핸들 = 1;
        myCar.바퀴 = 4;
        myCar.엔진 = 1;
        myCar.문 = 4;
        // myCar.속도 = 0;
        myCar.차종 = "벤틀리";
        // myCar.제조사 = null;
        
        myCar.전진();
        myCar.후진();
        
        
    }
}
cs

 

 

2)  Person - p1, p2

 

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
package day08;
 
public class Person {
 
    String name;
    int age;
    int eye;
    int nose;
    int mouth;
    String gender;
    String job;
    String tel;
    
    Person() {
        eye = 2;
        nose = 1;
        mouth = 1;
        System.out.println("Person 클래스의 기본 생성자");
    }
    
    void eating() {
    System.out.println("맛난 걸 먹어요 냠냠");
    }    
    
    void sleeping() {
        System.out.println("쿨쿨~~~");
    }
    
    void talking() {
        System.out.println("쏙닥쏙닥...");
    }
    
    void thinking() {
        System.out.println("나는 생각한다 고로 존재한다...");
    }
    
}
 
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
package day08;
 
public class TestMain02 {
 
    public static void main(String[] args) {
        // 클래스도 자료형, 사용자정의 자료형ㅇ
        Person p1 = new Person();
        
        p1.name = "홍길동";
        p1.age = 20;
        p1.eye = 2;
        p1.nose = 1;
        p1.mouth = 1;
        p1.gender = "남";
        p1.job = "도적";
        
        // p1의 멤버변수 출력
        System.out.println("p1 : "+p1);
        // 이름, 나이, 눈
        System.out.println("이름 : "+p1.name);
        System.out.println("나이 : "+p1.age);
        System.out.println("눈 : "+p1.eye);
        
        p1.eating();
        p1.sleeping();
        p1.thinking();
        
        System.out.println("----------------------------");
    
        // Person 클래스의 기본 생성자를 만들고 멤버 변수의 값을 초기화
        
        Person p2 = new Person();
        
        p2.name = "IU";
        p2.age = 29;
//        p2.eye = 2;
//        p2.nose = 1;
//        p2.mouth = 1;
        p2.gender = "여";
        p2.job = "가수";
        
        System.out.println("이름 : "+p2.name);
        System.out.println("나이 : "+p2.age);
        System.out.println("눈 : "+p2.eye);
        System.out.println("job : "+p2.job);
        
        p2.eating();
        p2.sleeping();
        p2.thinking();
        
        
        
    }
}
cs

 

 

3) Marine / Medic - m1, m2

 

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
package day08;
 
public class Marine {
    // 클래스의 전역변수
    int hp, x, y, 사거리, 공격력, 방어력;
    int 공격속도, 이동속도;
    
//    Marine() {
//        hp = 100;
//        x = 0;
//        y = 0;
//        사거리 = 4;
//        공격력 = 5;
//        방어력 = 3;
//        공격속도 = 3;
//        이동속도 = 4;
//    }
    
    
    Marine() { 
        // 생성자 : 특수 목적 메서드
        // 멤버 변수의 초기화를 목적으로 가지고 있는 메서드
        // 리턴하지도 않고 리턴 키퉈드도 없음
        // void도 사용하지 않는다.
        // 클래스명과 동일한 이름을 갖는다.
        // 생성자를 따로 지정하지 않으면 
        // 기본생성자는(Marine()) 존재하는 것으로 간주
        
        hp = 100;
        x = 0;
        y = 0;
        사거리 = 4;
        공격력 = 5;
        방어력 = 3;
        공격속도 = 3;
        이동속도 = 4;
        System.out.println("마린 기본생성자 호출");
        // return XXX
    }
    
    
    void 공격하기() {
        System.out.println("뚜뚜뚜뚜뚜");
    }
    
    void 공격하기(Marine x) {
        System.out.println("공격하기 메서드 내부 x : "+x);
        x.hp -= 공격력;
        System.out.println("적 캐릭터 공격!!!");
    }
    
    void 이동하기() {
        System.out.println("GOGOGO~~~");
    }
    
    void 정지() {
        System.out.println("정지");
    }
    
    void 스팀팩() {
        System.out.println();
        if(hp >3 ) {
        System.out.println("오우예~~~");
        hp -= 3;
        공격속도 += 2;
        이동속도 += 2;
    } else {
        System.out.println("체력이 부족합니다.");
    }
    }
    
    void 패트롤() {
        System.out.println("순찰중~~~");
    }
    
    void status() {
        System.out.println("---------------------");
        System.out.println("체력 : "+hp);
        System.out.println("x : "+x+" , y : "+y);
        System.out.println("공격속도 : "+공격속도);
    }
}
 
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
package day08;
 
// 클래스의 구성요소
// 1. 멤버변수(멤버 필드)
// 2. 생성자
// 3. 멤버메서드 
 
public class Medic {
    
    int hp, x, y, 사거리, 치료력, 방어력;
    int 치료속도, 이동속도;
    
    Medic() {
        hp = 100;
        x = 0;
        y = 0;
        사거리 = 4;
        치료력 = 5;
        방어력 = 3;
        치료속도 = 3;
        이동속도 = 4;
    }
    
    void 치료하기(Marine x) {
        if(x.hp <= 100-치료력) {
            System.out.println("호 해줄게~~~");
            x.hp += 치료력;
        }
    }
    void 이동하기() {
        System.out.println("GOGOGO~~~");
    }
    void 정지() {
        System.out.println("정지");
    }
    void 패트롤() {
        System.out.println("순찰중~~~");
    }
 
    void status() {
        System.out.println("---------------------");
        System.out.println("체력 : "+hp);
        System.out.println("x : "+x+" , y : "+y);
        System.out.println("치료속도 : "+치료속도);
    }
}
 
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
83
84
package day08;
 
public class TestMain03 {
 
    public static void main(String[] args) {
 
        Marine m1 = new Marine();
        
        System.out.println(m1.hp);
        
//        m1.hp = 100;
//        m1.x = 0;
//        m1.y = 0;
//        m1.사거리 = 4;
//        m1.공격력 = 5;
//        m1.방어력 = 3;
//        m1.공격속도 = 3;
//        m1.이동속도 = 4;
//        
        System.out.println(m1.hp);
 
        m1.status();
        m1.공격하기();
        m1.이동하기();
        m1.패트롤();
        m1.정지();
        
//        for(int i=1; i<100;i++) {            
//            m1.스팀팩();
//        }
        
        m1.status();
        
        
        
        Marine m2 = new Marine();
        // 초기화를 쉽게 하기 위한 메서드
//        m2.hp = 100;
//        m2.x = 0;
//        m2.y = 0;
//        m2.사거리 = 4;
//        m2.공격력 = 5;
//        m2.방어력 = 3;
//        m2.공격속도 = 3;
//        m2.이동속도 = 4;
        
        m2.status();
        
        
        System.out.println("--------------------------");
        
        m1.공격하기(); // 허공에 발사 중
        
        m2.status(); 
        
        // 대상을 지정해서 공격하기
        System.out.println("m2 : "+m2);
        m1.공격하기(m2);
        
        
        // 1. call by value : 값을 복사해 주고 호출
        // 2. call by reference : 참조값에 의한 호출 -> 참조값을 전달해 주고 호출
        
        m2.status();
        
        // m3 마린의 체력을 500으로 생성하고
        Marine m3 = new Marine();
        m3.hp = 500;
        // m1이 m3를 공격하도록 코드로 작성하기
        m1.공격하기(m3);
        // m3 상태 정보 보기
        m3.status();
        
        
        Medic me1 = new Medic();
        
        me1.치료하기(m2);
        
        m2.status();
        
    }
 
}
 
cs

 

 

4) Man - m

 

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
package day08;
 
public class Man {
 
    int eye, arm, age;
    String  name, gender, job, 종특;
    
    Man() {
    name = "홍길동";
    eye = 2;
    gender = "남";
    arm = 2;
    age = 20;
    job = "도적";
    종특 = "스틸";
    
    }
    
    void 스틸() {
        System.out.println("내꼬내꼬 다 내꼬얌!!!");
    }
    void 달리기() {
        System.out.println("헛둘헛둘");
    }
    void 빠르게달리기() {
        System.out.println("땀나게 달려요");
    }
    void 축지법() {
        System.out.println("동에 번쩍 서에 번쩍");
    }
    
}
 
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
package day08;
 
public class TestMain {
 
    public static void main(String[] args) {
        
        Man m = new Man();
        
        System.out.println(m.name);
        System.out.println(m.eye);
        System.out.println(m.gender);
        System.out.println(m.arm);
        System.out.println(m.job);
        System.out.println(m.종특);
        
        m.스틸();
        m.달리기();
        m.빠르게달리기();
        m.축지법();
        
    }
    
}
 
cs

 

 

5) GuGuDan - g1

 

1
2
3
4
5
6
7
8
9
10
package day08;
 
public class GuGuDan {
    
    void print() { 
    for(int i=1;i<=9; i++) {
        System.out.println("5 * "+i+" = "+5*i);
        }
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package day08;
 
public class GuGuTest {
 
    public static void main(String[] args) {
 
        GuGuDan g1 = new GuGuDan();
        
        g1.print();
    }
 
}
 
cs

 

 

 

더보기

[ 응용 ]

 

 

Q01.

TestMain 클래스

Man m = new Man();

System.out.println(m.name); // 홍길동

System.out.println(m.eye); // 2

System.out.println(m.gender);// 

System.out.println(m.arm); // 2

System.out.println(m.age); // 20

System.out.println(m.job); // 도적

System.out.println(m.종특);// 스틸

m.스틸(); // 내꼬내꼬 다 내꼬얌!!!

m.달리기(); // "헛둘 헛둘"

m.빠르게달리기(); // "땀나게 달려요

m.축지법(); // 동해 번쩍 서해 번쩍

package day08;

public class Man {

	int eye, arm, age;
	String  name, gender, job, 종특;
	
	Man() {
	name = "홍길동";
	eye = 2;
	gender = "남";
	arm = 2;
	age = 20;
	job = "도적";
	종특 = "스틸";
	
	}
	
	void 스틸() {
		System.out.println("내꼬내꼬 다 내꼬얌!!!");
	}
	void 달리기() {
		System.out.println("헛둘헛둘");
	}
	void 빠르게달리기() {
		System.out.println("땀나게 달려요");
	}
	void 축지법() {
		System.out.println("동에 번쩍 서에 번쩍");
	}
	
}
 

 

package day08;

public class TestMain {

	public static void main(String[] args) {
		
		Man m = new Man();
		
		System.out.println(m.name);
		System.out.println(m.eye);
		System.out.println(m.gender);
		System.out.println(m.arm);
		System.out.println(m.job);
		System.out.println(m.종특);
		
		m.스틸();
		m.달리기();
		m.빠르게달리기();
		m.축지법();
		
	}
	
}
 

 

 

 

Q2. 구구단 클래스를 작성하시오

GuGuTest 클래스

GuGuDan g1 = new GuGuDan();

g1.print();// 5단 출력

 

package day08;

public class GuGuDan {
	
	void print() { 
	for(int i=1;i<=9; i++) {
		System.out.println("5 * "+i+" = "+5*i);
		}
	}
}
 

 

package day08;

public class GuGuTest {

	public static void main(String[] args) {

		GuGuDan g1 = new GuGuDan();
		
		g1.print();
	}

}