객체란 무엇일까..?
현실에서는 객체는 세상에 존재하는 물체, 식별이 가능한것을 의미 한다.
(물리적으로 존재하는 사람,자동차,건물 등등.. 강의,배달,주문,운동 등 식별이 가능한 행위)
보통 자바에서 객체를 자동차에서 비유를 많이한다고 한다.
자동차를 예시로 들면
회사, 모델, 색상, 가격, 속도 등의 속성을 가질 수 있고
가속, 브레이크, 기어 변속, 조명, 경적 등의 행위를 가질 수 있다.
해당 객체를 자바식으로 표현을 하면 아래의 그림 처럼 나오고 이처럼 현실 세계에 있는 객체를 소프트웨어의 객체로 설계하는 것을 ‘객체 모델링’이라고 부른다.

그림출처 : https://teamsparta.notion.site/Java-3-1eb3937dd9114bfca9e00cefe8ee8cbb#3da5e03f7979454c9bdc5d922a9c5f3c
객체의 협력
예를 들어
현실에서 사람이 이동을 하기 위해 자동차를 운전하는 것처럼
사람 -> 자동차 이런 일방적인 관계를 사용관계
자동차안에 타이어, 핸들, 문 등등 자동차 안에 필요한 부품을 포함하고 있는 관계를 포함 관계
자동차 내에 엔진설계도가 다른 운송수단 엔진에 쓰일수 있는것 처럼 엔진에 대한 설계도를 상속 받는 관계를 상속 관계라고 한다.
클래스란
일단 간단하게 설명을 하면 객체를 찍어내기위한 틀이라고 생각하면 된다.
객체지향 프로그래밍의 특징
캡슐화 : 속성(필드)와 행위(메서드)를 하나로 묶어 객체로 만든 후 실제 내부 구현 내용은 외부에서 알 수 없게 감추는 것, 이렇게 하는 이유는 외부 객체에서 잘못 사용하여 해당 객체가 변화 하지 않기 위해서, Java에서는 접근제어가(Public,private등)을 통해 사용
상속 : 객체 지향 프로그램에는 부모객체 자식객체가 존재 하는데 부모 객체에서 사용하는 필드와 메서드를 자식에게 물려주어 자식이 부모객체를 사용할수있도록 해주는것, 이렇게 하면 일관성 유지 하기 좋고 코드의 중복이 줄어들어 재사용성이 증가 된다.
다형성 : 객체가 연산을 수행할 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 다른 여러 가지 형태로 재구성되는 것을 의미합니다. 동일한 클래스로 여러개의 객채를 생성을 하면 해당 객체내에 같은 메서드가 존재 하지만 결과 값이 다른경우를 의미 한다.
추상화 : 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것, 비유하면 기본 뼈대를 만들어서 서로다른 객체에 모델링하는것
인스턴스란
클래스를 구현하는 것?, Java에서 변수 선언을 하듯이 클래스를 불러서 선언을 하는 행위를 인스턴스,그 과정을 인스턴스 화 라고 한다.
클래스를 만들 때 유의 사항
1.만들려고 하는 클래스를 선언
2.객체가 가지고 있어야 할 속성(필드)을 정의
3.객체를 생성하는 방식을 정의합니다.(생성자)
4.객체가 가지고 있어야 할 행위(메서드)를 정의
필드란
필드는 객체의 데이터를 저장하는 역할, 객체의 필드는 크게 고유 데이터, 상태 데이터, 객체 데이터로 분류할 수 있습니다.
필드의 초기값과 초기화
필드를 생성 후 임의로 초기값을 설정안해 주면 자동으로 기본 값으로 초기화 된다.
메서드란?
객체의 행위를 뜻하며 객체 간의 협력을 위해 사용됩니다.
메서드 선언 하는 방법
리턴타입 메서드명(매개변수, ...) {
실행할 코드 작성
}
리턴 타입이란 메서드가 실행된 후 호출을 한 곳으로 값을 반환할 때 해당 값의 타입
반환할 값이 없을 때는 리턴 타입에 void를 작성해야한다.
메서드 오버로딩
클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도, 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름을 사용해서 메서드를 정의할 수 있다.
오버로딩의 조건
- 메서드의 이름이 같고, 매개변수의 개수, 타입, 순서가 달라야 합니다.
- '응답 값만' 다른 것은 오버로딩을 할 수 없습니다.
- 접근 제어자만 다른 것도 오버로딩을 할 수 없습니다.
- 결론, 오버로딩은 매개변수의 차이로만 구현할 수 있습니다.
기본형 매개변수
메서드를 호출할 때 전달할 매개값으로 지정한 값을 메서드의 매개변수에 복사해서 전달합니다.매개변수의 타입이 기본형일 때는 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 않습니다.
참조형 매개변수
메서드를 호출할 때 전달할 매개값으로 지정한 값의 주소를 매개변수에 복사해서 전달합니다.원본값도 같이 변경이 됩니다.
ex) 기본 class
//Car class 해당 클래스를 인스턴스 화 시킬려면 Main class에서
//Car car1 = new Car();로 생성하면 됩니다(Car클래스의 객체인 car1 인스턴스 생성 의미)
public class Car {
//필드 영역
//고유 데이터 영역
String company;//회사
String model ="Gv80";//자동차 모델
String color;//자동차 색상
double price;//자동차 가격
//상태 데이터 영역
double speed;//자동차 속도, km/h
char gear; //기어상태
boolean lights =true;// 조명상태
//객체 데이터 영역
Tire tire = new Tire();
Door door;
Handle handle;
//생성자 영역
//생성자 처음 객채가 생성될때 (instance화) 어떤 로직을 수행해야 하면, 어떤 값이 필수로 들어와야 하는지 정의
public Car(){
//logic
//기본 생성자 : 생략이 가능
//System.out.println("생성자가 호출되었습니다");
}
//매서드 영역 인스턴스화가 진행이 되면 도트(.) 연산자를 통해 메서드를 호출할수 있다.
//gasPedal
//input : km/h
//output : speed
double gasPedal(double kmh, char type){
speed = kmh;
chageGear(type);//가속도 페달을 밝으면 자동으로 기어가 변한다. (내부접근)
return speed;
}
//brealPedal
//input : X
//output : speed
double brealPedal(){
speed = 0;
return speed;
}
//changeGear
//input :Gear : char
//output :Gear
char chageGear(char type){
gear = type;
return gear;
}
//onOffLight
//input :x
//outout : lights
boolean onOffLight(){
lights = !lights;
return lights;
}
//horn
//input :x
//outout :x
void horn(){
System.out.println("빵빵");
}
//자동차의 속도 가변길이 메서드
void charSpeed(double ... speeds){
for (double speed1 : speeds) {
System.out.println("speed1: " + speed1);
}
}
}