C나 파스칼 같은 언어는 절차적/구조적(Procedural/Structured) 프로그래밍을 했다.
객체지향 프로그래밍은
객체지향언어의 장점은 다음과 같다.
객체지향언어의 단점
Aeroplane (비행기)
airline, make, type, position //data
takeoff(), land(), cruise() //actions
AirHostess (승무원)
name, address //data
wish(), serve() //actions
Passenger (탑승객)
name, address //data
takeCab(), checkin(), walk(), smile() //actions
객체 지향적으로 생각한다는 것은, 현재 가진 문제에 연관된 여러 요소를 확인하는 것이다.
비행기, 승무원, 탑승객을 확인하고 연관된 것을 보고, 내가 사용하고자 하는 것이 무엇인지 확인하는 것이다.
비행기의 정보를 확인하고, 할 수 있는 행위를 확인하는 것이다.
Class Planet {
name, location, distanceFromSun //data/state/fields
revolve(), rotate() //actions/behavior/methods
}
Planet earth = new Planet();
Planet venus = new Planet();
Class: 클래스는 템플릿이다. 객체가 갖고 있는 데이터와, 객체에 행할 수 있는 동작이 무엇인지 규정 할 수 있다. 행성을 정의한다.
Object(Instance): 밑에 earth, venus와 같이 서로 속성은 다르지만, 클래스로부터 만들어진다. 템플릿의 인스턴스라고 한다.
Member Data/State/Fields: 모든 객체에 있는 데이터이다.
Actions/Methods/Behaviour: 특정 객체에 행할 수 있는 동작.
Customer
name, address
login(), logout(), selectProduct(product)
Shopping Cart
items
add(item), remove(item)
Product
name, price, quantityAvailable
order(), changePrice()
Build a Motor Bike Class -adjust speed and gears.
We would want to create a few objects and play with them
- Understand concepts of Class, Object, State, Behavior
- Understand basics of Encapsulation and Abstraction


MotorBike.java가 Class를 만들고, 그 안에 행위인 start를 만들었다.
MotorBikeRunner는 Object인 ducati와 honda를 만들었다.
Book 클래스 세가지를 만들어 본다.

인스턴스의 상태는 아래와 같이 지정할 수 있고, 계속 변화시킬 수 있다.

캡슐화
- 이 클래스만이 특정 클래스의 데이터에 접근해야 한다는 개념.
- 다른 클래스는 이 데이터에 접근하려면, 해당 클래스의 동작, 즉 메서드를 통해 접근해야 한다.
- 캡슐화는 특정 데이터에 접근해 값을 설정하는 데이터와 메서드이다.
위에서 MotorBike.speed로 접근한 예시는, 외부에서 데이터에 접근한 것이므로 캡슐화를 파괴했다. 해당 코드를 다음과 같이 수정한다.

변수를 비공개로 만들면, 클래스 외부에서 접근이 불가능하다.

외부에서 접근 했을 때, 컴파일 오류가 나는 것을 확인 할 수 있다.
MemberVariable : 메소드 밖에서 선언된 변수, 객체에 소속된 해당 개체 고유의 것.
LocalVariable : 메소드 안에서 선언된 변수


setSpeed라는 메서드를 통해서 접근했다.
캡슐화란?
한 개체를 다른 개체로부터 보호하는 것.
외부 개체가 직접 개체 내 데이터를 제어하지 못하도록 한다.
메서드를 거쳐야만 개체 내 데이터를 제어할 수 있다.
이번에 만들어 볼 것은, 메서드를 거쳐서 오토바이의 속력을 출력할 것이다.


[source]-[GenerateGattersAndSetters] 를 통하여 이클립스에서 생성 가능하다.
Setter : 값을 지정해준다.
Getter : 값을 출력해준다.


차의 속도가 -100처럼 음수로 입력되는 것을 막아 줄 수 있다.


다만 위 코드의 방식으로 새롭게 Speed를 set하는 것은 문제가 존재한다.
코딩이 너무 길어진다는 것이다. 따라서 Speed의 증가, 감소에 관한 것도 캡술화 시킨다.


이렇게 검증 단계까지 제작해였으나, 위의 set과정과 decrease 과정에서 검증이 겹치므로 해당 문제를 해결해 본다.

이렇게 객체 내 로직을 캡슐화하면 외부 코드를 많이 수정할 필요 없이 쉽게 로직을 바꿀 수 있다.
- 초기값을 설정하는 도구이다.
- 생성자는 반환하는 타입이 필요 없다.
- 생성자의 메서드 명칭은 클래스 명과 동일하다. (여기서는 MotorBike(parameter))
package com.in28minutes.oops;
public class MotorBike {
//state
private int speed; //member variable
MotorBike() {
this.speed = 0; //파라미터가 없는 경우, 초기 속도가 0으로 지정된다.
}
MotorBike(int speed) { //생성자, 파라미터를 받는다.
this.speed = speed; //입력한 파라미터를 초기 속도로 설정해준다.
}
void start() {
System.out.println("Bike Started");
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
if(speed > 0) {
this.speed = speed;
}
}
public void increaseSpeed(int howMuch) {
setSpeed(this.speed + howMuch);
}
public void decreaseSpeed(int howMuch) {
setSpeed(this.speed - howMuch);
}
}
new로 새 개체를 만들 떄, 생성자가 호출되며, 생성자를 직접 만들지 않으면 자바 컴파일러가 디폴트 생성자를 제공한다. 생성자를 만들면, 아무것도 입력 안했을시에 작동할 인자 없는 생성자를 만들어 줘야 한다.
에 관해 배웠다.