5/25일 [Java 문법 종합반] 3주차 : 클래스, 상속, 인터페이스

2023. 5. 25. 21:14개발자 공부/Java

객체 : 세상에 존재하는 물체를 뜻하며 식별이 가능한 것을 의미하며, 객체는 속성과 행위로 구성 
               Java에서는 이러한 속성과 행위를 필드와 메서드로 정의하여 구현합니다.

- 자동차는 회사, 모델, 색상, 가격, 속도 등의 속성을 가질 수 있습니다

- 자동차는 가속, 브레이크, 기어변속, 조명, 경적등의 행위를 가질 수 있습니다.

- 이처럼 현실 세계에 있는 객체를 소프트웨어의 객체로 설계하는 것을 '객체 모델링' 이라고 부릅니다. 

 객체 간의 협력

  - 현실세계에서 사람이라는 객체와 자동차라는 객체는 서로 행위를 통해 상호작용을 하며 협력 할 수 있습니다.

    상호작용 → 사람이 자동차의 가속 페달을 밟으면 자동차는 속도를 올리며 앞으로 이동, 사람이 브레이크 페달을 밟으면  자동차는 속도를 줄이며 정지 한다. 

      : 소프트웨어의 객체들 끼리 상호작용은 행위를 정의하는 Java의 메서드를 통해 이루어집니다.

 

- 매개값 : 사람 객체가 자동차에게 요청한 명시된 값

- 리턴값 : 사람 객체에게 실행 결과인 속도의 값으로 반환되는 값

 

 객체 간의 관계

- 사용관계 : 사람객체는 자동차 객체를 사용합니다. 

- 포함 관계 : 타이어 객체, 차문 객체, 핸들 객체는 자동차 객체에 포함되어있습니다.

- 상속 관계 : 하나의 공통된 기계시스템 객체를 상속받는 상속 관계 

 객체지향 프로그래밍의 특징

- 캡슐화 : 속성(필드)와 행위(메서드)를 하나로 묶어 객체로 만든 후 실제 내부 구현 내용은 외부에서 알 수 없게 감추는 것을 의미합니다.

 장점 : 1) 외부 객체에서는 캡슐화된 객체의 내부 구조를 알 수 없기 때문에 노출시켜 준 필드 혹은 메서드를 통해 접근할  없습니다 

           2) 필드와 메서드를 캡슐화 하여 숨기는 이유는 외부 객체에서 해당 필드와 메서드를 잘못 사용하여 객체가 변화  하지 않게 하는데 있습니다.

- 상속 : 필드와 메서드를 자식 객체에 물려주어 자식 객체가 이를 사용할 수 있도록 만들 수 있습니다.

장점

1) 각각의 객체들을 상속 관계로 묶음으로써 객체 간의 구조를 파악하기 쉬워집니다.

2) 필드와 메서드를 변경하는 경우 부모 객체에 있는 것만 수정하게 되면 자식 객체 전부 반영이 되기 때문에 일관성을 유지하기 좋습니다.

3) 자식 객체가 부모 객체의 필드와 메서드를 물려받아 사용할 수 있기 때문에 코드의 중복이 줄어들며 코드의 재사용성이 증가됩니다.

- 다양성 : 설계도에 따라 비슷하게는 만들지만 구현체는 각각 해당하는 메서드는 재정의 해서 사용가능합니다. 

- 추상화 : 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것을 추상화라고 합니다.

                 공통적이고 중요한 것을들 모아 객체를 모델링 합니다. 

 객체와 클래스 

 : 우리는 객체를 생성하기 위해서 설계도가 필요합니다. 

   클레스를 토대로 생성된 객체를 해당 클래스의 '인스턴스' 라고 부르며 이 과정을 '인스턴스화' 라고 부릅니다. 

 

 

● 클레스 설계

[ 클레스를 만들기 위한 4가지 Step ]

1. 만들려고 하는 설계도를 선언합니다. (클레스의 선언)

2. 객체가 가지고 있어야할 속성 (필드)을 정의합니다. 

3. 객체를 생성하는 방식을 정의합니다. (생성자)

4. 객체가 가지고 있어야할 행위(메서드)를 정의합니다. 

 

- 자동차 클래스 만들기 

- 클래스 선언

public class Car { } // 공개된 자동차 클래스 선언

- 필드 정의 

String company; // 자동차 회사
    String model; // 자동차 모델
    String color; // 자동차 색상
    double price; // 자동차 가격
    double speed;  // 자동차 속도 , km/h
    char gear; // 기어의 상태, P,R,N,D
    boolean lights; // 자동차 조명의 상태

- 클래스의 생성자 정의 

생성자 : 처음 객체가 생성될 때 (인스턴스화) 어떤 로직을 수핼 하며, 어떤 값이 필수로 들어와야 하는지 정의 

public Car() {} // 자동차 객체의 생성 방식을 선언 

                         //  생성자는 반환 타입이 없고 이름은 클래스의 이름과 동인하다 

- 매서드의 정의 

<상태데이터 영역>

double gasPedal(double kmh) {
    speed = kmh; // 자동차 속도 
    return speed;

double brakePedal() {
    speed = 0;
    return speed;
}

char changeGear(char type) {
    gear = type; 
    return gear;
}

boolean onOffLights() {
    lights = !lights; 
    return lights;
}

public car () {   

void horn() {
    System.out.println("빵빵");
}