# 연습문제 D - 객체지향 프로그래밍
## 09 클래스와 객체
---
### 이론 요약
![클라우드스터딩-자바-클래스와-객체-요약](https://i.imgur.com/zi6B90d.png)
#### 객체 지향 프로그래밍
- OOP라고 한다. 프로그램을 객체의 조립으로 만드는 방식이다.
- OOP는 프로그램의 관리/재사용/확장에 좋다.
#### 클래스 vs 객체
- 클래스는 객체를 만들기 위한 설계도이다.
- 객체의 또 다른 표현으로는 인스턴스(instance)가 있다.
- 때문에 클래스로 객체를 만드는 것을 "인스턴스화"라고 한다.
#### 클래스 설계 및 구현
- 클래스는 필드(상태)와 메소드(동작)로 구성된다.
- 클래스를 도식화한 것을 "클래스 다이어그램"이라 한다.
- 클래스 다이어그램 보고 코드를 작성할 줄 알아야 한다.
### 실습 리뷰
정사각형 객체의 넓이를 구하는 예.
```
public class SquareTest {
public static void main(String[] args) {
/* 1. 객체 생성 */
Square s = new Square();
/* 2. 필드 초기화(값 변경) */
s.length = 4;
/* 3. 결과 출력 */
System.out.printf("한 변의 길이가 %d인 정사각형의 넓이: %d", s.length, s.area());
}
}
/* 4. 정사각형 클래스 구현 */
class Square {
int length; // 길이
// 넓이 반환
int area() {
return length * length;
}
}
```
## 10 생성자
---
### 이론 요약
![클라우드스터딩-자바-생성자-요약](https://i.imgur.com/pMmmkPn.png)
#### 생성자
- 생성자는 객체를 만드는 특별한 메소드다.
- 생성자는 역할은, 객체 생성과 필드 초기화이다.
#### 생성자 특징
- 생성자는, 호출과 정의로 나뉜다.
- 생성자명은, 클래스명과 같아야 한다.
- 리턴 타입은 표기하지 않는다. (void 아님)
### 실습 리뷰
마린과 메딕 객체의 상호 작용
```
public class Starcraft {
public static void main(String[] args) {
// 객체 생성
Marine marine = new Marine("마린", 80);
Medic medic = new Medic("메딕", 60);
// 마린 스팀팩 버프~
marine.stimpack();
// 메딕의 치료 -> 마린
medic.heal(marine);
}
}
// 마린 클래스
class Marine {
// 필드
String name;
int hp;
// 생성자
public Marine(String name, int hp) {
this.name = name;
this.hp = hp;
}
// 메소드
public void stimpack() {
System.out.printf("[%s]의 스팀팩! HP: %d -> ", name, hp);
hp -= 10;
System.out.printf("%d\n",hp);
}
}
// 메딕 클래스
class Medic {
// 필드
String name;
int hp;
// 생성자
public Medic(String name, int hp) {
this.name = name;
this.hp = hp;
}
// 메소드
public void heal(Marine target) {
System.out.printf("[%s]의 치유! %s HP(%d -> ", name, target.name, target.hp);
target.hp += 10;
System.out.printf("%d)\n", target.hp);
}
}
```
## 11 레퍼런스 변수와 static
---
### 이론 요약
![클라우드스터딩-자바-레퍼런스와-static-요약](https://i.imgur.com/8SjXUXO.png)
#### 레퍼런스 변수
- 레퍼런스 변수란, 객체를 가리키는 변수다.
- 기본형 변수는 값을 직접 저장하나, 레퍼런스 변수는 객체의 위치를 가리킨다.
#### static 키워드
- static 키워드는 필드와 메소드에 적용될 수 있다.
#### 클래스 변수
- 클래스 변수란, 클래스 영역에 존재한다.
- 인스턴스 변수란, 객체 내부에 존재한다.
#### 인스턴스 변수
- 클래스 메소드란, 주체 객체가 없이 수행되는 메소드다.
- 인스턴스 메소드란, 주체 객체가 실행하는 메소드다.
### 실습 리뷰
두 점 사이의 거리
```
public class PointTest {
public static void main(String[] args) {
// 객체 생성
Point p1 = new Point(0, 0);
Point p2 = new Point(3, 4);
// 거리 계산
double dist = Point.distance(p1, p2);
// 결과 출력
System.out.printf("두 점 A%s, B%s 사이의 거리: %.2f", p1.toStr(), p2.toStr(), dist);
}
}
class Point {
int x;
int y;
Point (int _x, int _y) {
x = _x;
y = _y;
}
String toStr() {
return String.format("(%d, %d)", x, y);
}
static double distance(Point p, Point q) {
double dX = p.x - q.x; // x좌표의 변화량
double dY = p.y - q.y; // y좌표의 변화량
return Math.sqrt((dX * dX) + (dY * dY));
}
}
```
## 확인하기
---
<div class="interact_responsive_padding" style="padding:100% 0 0 0;position:relative;margin-bottom:5px;"><div class="interact_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><iframe id="interactApp5cecec051077800014b551cd" width="100%" height="100%" style="border:none;max-width:100%;margin:0;" allowTransparency="true" frameborder="0" src="https://quiz.tryinteract.com/#/5cecec051077800014b551cd/q/1?method=iframe"></iframe></div></div>
## 도서구매
<a href="http://www.yes24.com/Product/Goods/104740689"><img src="http://image.yes24.com/goods/104740689/XL" width="50%" /></a>