[학습 목표]
객체란 무엇인지?
- 코드 재사용이 용이
남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있다.
- 유지보수가 쉬움
절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.
- 대형 프로젝트에 적합
클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를 개발할 때 업무 분담하기 쉽다.
객체지향의 단점
1) 캡슐화(Encapsulation)
2) 상속(Inheritance)
3) 추상화(Abstraction)
4) 다형성(Polymorphism)

클래스는 객체를 생성하기 위한 설계도
클래스를 만들기 위한 4가지 STEP
설계도 선언(클래스 선언) > 객체가 가지고 있어야할 속성(필드) 선언 > 객체를 생성
하는 방식을 정의(생성자) > 객체가 가지고 있어야 할 행위(메서드) 정의
1) 선언
public class Car {}
public class Car : 공개된 자동차 클래스 선언을 의미합니다.
2) 필드 정의
String company; // 자동차 회사
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
double speed; // 자동차 속도 , km/h
char gear; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태
필드는 객체의 속성으로써 데이터를 저장하는 역할을 합니다.
3) 생성자 정의
public Car() {}
public Car() : 자동차 객체의 생성 방식을 선언합니다.
4) 메서드 정의
double gasPedal(double kmh) {
speed = kmh;
return speed;
}
반환타입이 double 인 gasPedal(double kmh) 메서드를 선언합니다.
double brakePedal() {
speed = 0;
return speed;
}
반환타입이 double 인 brakePedal() 메서드를 선언합니다.
char changeGear(char type) {
gear = type;
return gear;
}
반환타입이 char 인 changeGear(char type) 메서드를 선언합니다.
boolean onOffLights() {
lights = !lights;
return lights;
}
반환타입이 boolean 인 onOffLights() 메서드를 선언합니다.
void horn() {
System.out.println("빵빵");
}
반환값이 없는 horn() 메서드를 선언합니다.
new Car(); // Car클래스 객체 생성
Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
Car car2 = new Car(); // Car클래스의 객체인 car2 인스턴스 생성
필드는 객체의 데이터를 저장하는 역할을 한다. 객체의 필드는 크게 고유한 데이터, 상태 데이터, 객체 데이터로 분류

1) 외부 접근
Car car = new Car();
2) 내부 접근
double brakePedal() {
speed = 0;
return speed;
}
메서드는 객체의 행위를 뜻하며 객체간의 협력을 위해 사용, 메서드의 행위를 정의하는 방법은 블록{ } 내부에 실행할 행위를 정의
1) 메서드 선언

double brakePedal() {...} // double 타입 반환
char changeGear(char type) {...} // char 타입 반환
boolean onOffLights() {...} // boolean 타입 반환
void horn() {...} // 반환할 값 없음
리턴타입이란 메서드가 실행된 후 호출을 한 곳으로 값을 반환할 때 해당 값의 타입을 의미. 주의할 점은 메서드에 리턴타입을 선언하여 반환할 값이 있다면 반드시 return 문으로 해당하는 리턴타입의 반환값을 지정해야한다.
반환할 값이 없을 때는 리턴타입에 void를 작성. 반환값이 없음으로 return문을 반드시 지정할 필요 X, 메서드는 실행할 때 return문을 만나면 그대로 종료하게 되는데 void 타입일 때 return; 이렇게 return문을 사용하여 원하는 지점에서 메서드를 종료할 수도 있다.
double gasPedal(double kmh, char type) {
speed = kmh;
return speed;
}
매개변수는 메서드를 호출할 때 메서드로 전달하려는 값을 받기 위해 사용되는 변수. 전달하려는 값이 없다면 생략 가능, 가변길이의 매개변수도 선언할 수 있다.
2) 메서드 호출
메서드는 정의하는 것만으로 실행되지 않는다. 메서드를 정의하는 것은 단순히 동작에 대한 처리 과정을 기술한 것이다. 따라서 메서드를 직접 사용하기 위해 다음과 같은 방법으로 호출해야 한다.
/*
메서드이름(값1, 값2, ...)
*/
method(value1, value2, ...);
3) 메서드 오버로딩
메서드 오버로딩은 같은 메서드여도 매개변수가 다르거나, 리턴받는 데이터타입이 다른 경우 여러 개를 선언할 수 있는 것을 의미
public class Method {
public static void main(String[] args) {
System.out.println("Overloading1 : " + Overloading("홍길동", "20살"));
System.out.println("Overloading2 : " + Overloading(10, 20));
}
// Overloading1 메서드 선언
public static String Overloading(String Name, String Age)
{
return Name + Age;
}
// Overloading2 메서드 선언
public static int Overloading(int a, int b)
{
return a + b;
}
}
멤버 = 필드 + 메서드
1) 인스턴스 멤버
2) 클래스 멤버
3) 지역변수
public class Main {
public static void main(String[] args) {
Main main = new Main();
// 메서드 호출 : main.getClass()
System.out.println("main.getClass() = " + main.getNumber());
System.out.println("main.getClass() = " + main.getNumber());
System.out.println("main.getClass() = " + main.getNumber());
}
public int getNumber() {
int number = 1; // 지역 변수
number += 1;
return number; // 메서드 종료되면 지역변수 제거됨
}
}
// 출력
//main.getNumber() = 2
//main.getNumber() = 2
//main.getNumber() = 2
4) final 필드와 상수
final 필드
final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없게 되는 필드이다.
final 타입 필드 = 초기값;
final int num = 123;
상수(static final)
상수는 불변의 값을 의미한다. 수학에서 쓰이는 파이 값이 대표적인 예이다. 자바에서는 불변의 값을 저장하는 필드를 상수(constant)라고 한다. final 필드는 한 번 초기화하면 수정할 수 없는 필드이다.
static final 타입 상수 = 초기값;