1. 객체
: 객체란 세상에 존재하는 물체를 뜻하며 식별이 가능한 것을 의미한다. 강의,운동 등 개념적인 것 또한 식별이 가능하기 때문에 객체라 볼 수 있다.
-> 객체는 속성과 행위로 구성이 되어있다
- 자동차는 회사, 모델, 색상, 속도 등의 속성을 가진다.
- 자동차는 가속, 브레이크, 경적 등의 행위를 가진다.
-> Java에서는 이러한 속성과 행위를 필드와 메서드로 정의해 구현한다.
-> 이처럼 현실 세계에 있는 객체를 소프트웨어의 객체로 설계하는 것을 객체 모델링이라고 한다.
2. 객체 간 협력
-> 사람과 자동차는 객체끼리 서로 행위를 통해 상호작용을 하며 협력할 수 있다.
-> 소프트웨어의 객체들은 메서드를 통해 데이터를 주고받을 수 있다.
-> 예를 들어 사람이 자동차를 가속하기 위해 자동차가 가진 gasPedal(50) 메서드 괄호 안에 매개값 50을 넣어 호출한다고 하면, 사람은 자동차가 알아들을 수 있는 메서드를 사용해 자동차에게 메세지를 전달해야 한다. (명세서에 정해진 대로. api)
-> 그러면 자동차 객체는 gasPedal메서드로 입력받은 데이터를 속성인 속도의 값을 50으로 만들고 이 작업을 수행한 후에 사람 객체에게 실행 결과인 속도의 값을 반환한다. 이때 반환되는 값을 리턴값이라고 표현한다.
3.객체 간 관계
1) 사용
2) 포함
3) 상속 : 자동차와 기차는 기계시스템 클래스가 갖고있는 설계 청사진을 상속받아 각각의 객체가 필요할 때 사용할 수 있다. (오버라이딩이라는 개념)
-> 각각의 객체들을 상속 관계로 묶어 객체 간 구조를 파악하기 쉬워진다.
-> 코드의 중복이 줄고 재사용성 증가
4. 객체와 클래스
-> 객체를 생성하기 위해 설계도가 필요한다.
-> 클래스는 설계도에 해당한다.
-> 클래스를 토대로 생성된 객체를 해당 클래스의 인스턴스라고 부르며 이렇게 만드는 것을 인스턴스화 라고 한다.
-> 동일한 클래스로 여러 개의 인스턴스를 만들 수 있다.
-> 이렇게 만들어진 여러 인스턴스를 모아 어떠한 객체라고 이름붙인다.
<클래스 만들기 예제>
이제 메인화면 하나가 아니라 여러 클래스의 화면을 띄워야 하기 때문에 코드 복사가 의미가 없어질 것 같아 화면 캡쳐를 해왔다.
클래스 만들기 4단계
ⓐ 만들려고 하는 설계도를 선언 (클래스 선언)
ⓑ 객체가 가지고 있어야 할 속성(필드)을 정의 : 변수 형태로 선언 -> 메서드로 제어
ⓒ 객체를 생성하는 방식을 정의 (생성자) 어떤 인풋을 넣을지 어떤 로그를 출력할지 정의 생성자는 클래스 이름과 동일해야 한다.
ⓓ 객체가 가지고 있어야 할 행위(메서드)를 정의 -> 변수를 넣은 필드를 처음에 어떻게 정의할 것인지가 생성자
어려워보이지만 쉽게 말하면 자동차 여러 대를 생산하려고 하는데, 자동차마다 가속, 브레이크, 경적 등 공통적으로 들어가야 하는 기능들이 있다. 이것을 Car 클래스를 이용해 정리해준다. 즉 설계도면을 짜준다. 그리고 이렇게 만들어진 설계도를 이용해 메인 클래스에서 필요한 것을 뽑아오는 것이다.
왼쪽 메인 클래스에서 System.out.println(car1)을 해주면 이상한 값이 나오는데 이것이 car1 의 주소값이다. (기본형변수와 참조형변수 참고)
주소값이 출력이 되어서 궁금한 것이 생겼는데, 나는 아직 car1에 아무런 데이터도 할당하지 않았는데 왜 벌써 저장공간이 생겨버렸나 하는 것이었다.
new 키워드로 생성자를 호출 한 순간 컴퓨터에서는 미리 내가 데이터를 넣을 것을 준비해 넉넉하게 부지를 사서(메모리를 차지해) 생산 준비를 하는 것이라고 생각하면 된다.
package Week03;
public class Main {
public static void main(String[] args) {
//new키워드를 이용해 생성자를 호출. 메인에서 car를 호출할 수 있다.
// Car클래스를 이용해 만든 객체를 배열로서 관리가 될 수 있다.(확장성up)
Car[] carArray = new Car[3];
Car car1 = new Car();
car1.changeGear('P');//gear type과 changeGear라는 메서드에도 접근 가능
carArray[0] = car1;
Car car2 = new Car();
car2.changeGear('N');
carArray[1] = car2;
Car car3 = new Car();
car3.changeGear('D');
carArray[2] = car3;
for (Car car : carArray) {
System.out.println("car.gear = " + car.gear);
}
}
}
// 실행 결과
car.gear = P
car.gear = N
car.gear = D
-> Main클래스에서 생성자 Car를 호출해 gear 와 changeGear라는 메서드에 접근하고, 이를 변경해 변경된 값들을 배열에 담았다.
향상된 for문을 이용해 담긴 배열을 나열해봤는데 정상적으로 접근되어 데이터가 저장된 것을 볼 수 있다.