2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

20240809_TIL_캠프 4주차 5일_자바의 객체지향 프로그래밍과 클래스 설계

2024. 8. 9. 14:38ㆍ내배캠_Java 6기/Java 문법 종합반


객체 지향 프로그래밍 

 

레고 블록을 조립해 하나의 레고를 만드는 것처럼 프로그램도 필요한 부품을 만들고 하나씩 조립해 완성해 가는 것을 객체지향 프로그래밍이라고 한다,

 

✅ 객체 : 소프트웨어에서의 부품 

 

 

 

객체란?

객체 : 식별 가능한 세상에 존재하는 물체이며 자동차, 계산기, 사람도 될 수 있다 

 

객체의 특징 : 객체는 속성과 행위로 이루어져 있다. 자바에서는 필드와 메서드라고 정의한다.

 

✓ 자동차의 회사명, 모델, 색상, 가격, 속도 등이 속성, 즉 필드에 해당한다

 

✓ 자동차의 가속, 브레이크, 기어 변속, 조명, 경적 등의 기능은 행위. 즉 메서드에 해당한다, 

 

 

➡️ 현실 세계에 있는 객체를 소프트웨어의 객체인 클래스로 설계하는 것이  ‘객체 모델링'

 

 

 

객체 간의 협력 관계 

사람 객체와 자동차 객체는 행위를 통해 상호작용을 하면서 협력할 수 있다.

 

✓  사람이 자동차의 가속 페달을 밟으면 자동차는 반응해 속도를 올리며 앞으로 이동

✓  사람이 자동차의 브레이크 페달을 밟으면 자동차는 이에 반응하여 속도를 줄이며 정지

 

 

소프트웨어의 객체들은 어떻게 상호작용?

 

바로 행위를 정의하는 Java의 메서드를 통해 이루어진다.

 

사람 객체는 자동차 객체가 가지고 있는 가속 페달이라는 메서드 gasPedal();를 호출

➡️  그러면 자동차 객체는 속도 속성의 값을 증가

 

사람 객체는 자동차 객체가 가지고 있는 브레이크 페달이라는 메서드 brakePedal();를 호출

➡️  그러면 자동차 객체는 속도 속성의 값을 감소

 

사람 객체는 메서드를 호출할 때 괄호( ) 안에 데이터를 넣어 호출할 수 있는데 괄호 안에 넣는 데이터를 ‘파라미터’ 혹은 ‘매개변수’ 라고 표현한다.

 

사람 객체는 gasPedal(50); 이렇게 메서드 괄호 안에 50의 매개값을 넣어 호출

➡️ 자동차 객체는 해당하는 50의 데이터를 전달받아 객체의 속성인 속도의 값을 50으로 설정

➡️ 메서드에서 속도를 바꾸는 작업을 수행한 후 실행 결과인 속도의 값을 반환할 수 있는데 이것을 리턴 값이라고 한다, 

 

 

 

객체 간의 관계

 

 

상속 : 자동차와 기차 객체는 기계시스템 객체를 상속받는 상속 관계 

 

 

 

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

 

캡슐화 : 객체의 속성과 행위를 하나로 묶고 외부에 보이지 않게 감추는 것을 의미

➡️ 외부에서 함부로 필드와 메서드를 잘못 사용해서 객체가 변화하지 않게 해서 보안에 뛰어남

➡️ 캡슐화된 객체의 필드와 메서드를 노출시킬지의 여부를 접근제어자(ex. public, private) 가 결정함 

 

상속 : 부모 객체에서 가지고 있는 필드와 메서드를 자식 객체가 사용할 수 있게 물려준다. 

 

상속을 하는 이유

 

1. 부모 객체의 필드와 메서드를 수정하면 자식 객체에 전부 반영이 되서 일관성을 유지하기 좋다

 

2. 자식 객체가 부모 객체의 필드와 메서드를 물려받아 사용해서 코드 중복이 줄어들어 재사용성이 좋다

 

다형성 : 각 객체가 가지고 있는 고유한 특성에 따라 여러 가지 형태로 재구성 가능

➡️ A 자동차 객체와 B 자동차 객체의 경적 소리가 다르면 경적 메서드를 다르게 정의할 수 있다.

 

추상화 : 공통적으로 가지고 있는 기능을 모아 상위 개념으로 새로 선언하는 개념. 휴대폰, 아이폰 등을 전자제품이라는 상위 개념으로 통일할 수 있다. 

 

 

클래스 설계 

 

클래스 만들기 4단계

 

1. 클래스 선언  →  설계도 이름 선언 

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() {}



4. 클래스의 메서드 정의

// gasPedal
double gasPedal(double kmh, char type) {
    changeGear(type); //  가속도 페달을 밟으면 자동으로 기어가 변한다
    speed = kmh;
    return speed;
}

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

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

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

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

// 자동차의 속도 .. 가변길이 메서드
void carSpeeds (double ... speeds) {
    for (double v : speeds) {
        System.out.println("v = " + v);
    }

 

입력값이 없는 경우, 반환 값이 없는 경우, 입력값이 여러 개인 경우 등 다양하게 메서드를 선언할 수 있다.

 

 

 

객체 생성과 참조형 변수 

객체 생성 : new 클래스명 ()  키워드를 통해 클래스(설계도) 로부터 객체를 생성할 수 있다. 
객체는 참조형 변수이므로 힙 ( Heap ) 메모리 영역에 객체 인스턴스의 주소가 저장된다. 

 

객체 배열 

 

객체는 참조형 변수이므로 배열, 컬렉션에도 저장해 관리할 수 있다.

public class Main {
    public static void main(String[] args) {
        Car[] carArray = new Car[3];
        Car car1 = new Car();
        car1.changeGear('P');
        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

 

 

⭐ 느낀점과 다음 할 일 

팀프로젝트가 마무리 된 주의 금요일이라 기운이 빠지고 공부를 하기 싫지만
스프링 개인과제가 시작되었으므로 자바 개념을 확실히 알고 가야 하기에 열심히 강의를 들으려고 노력해야 겠다

 

 

 

728x90