컴퓨터 프로그래밍/Java

[Java] 클래스 (설계도) 설계하고 객체 생성 (인스턴스화)

한33 2024. 7. 26. 11:48

객체는 속성(필드) 과 행위(메서드) 로 구성

 

ex ) 자동차

속성 : 회사, 모델, 색상, 가격, 속도 등

행위 : 가속, 브레이크, 기어 변속, 조명, 경적 등

현실 세계에 있는 객체를 소프트웨어의 객체로 설계하는 것을 ‘객체 모델링’

 

객체 간의 관계

 

사람 객체는 자동차 객체를 사용

 

 

타이어 객체, 차 문 객체, 핸들 객체는 자동차 객체에 포함

 

자동차와 기차 객체는 하나의 공통된 기계 시스템 객체를 토대로 만들어진다고 가정하면 자동차 객체와 기차 객체는 기계 시스템 객체를 상속받는 상속관계가 됨


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

캡슐화

  • 캡슐화란 속성(필드)와 행위(메서드)를 하나로 묶어 객체로 만든 후 실제 내부 구현 내용은 외부에서 알 수 없게 감추는 것을 의미.
  • 외부 객체에서는 캡슐화된 객체의 내부 구조를 알 수 없기 때문에 노출시켜 준 필드 혹은 메서드를 통해 접근할 수 있음.
  • 필드와 메서드를 캡슐화하여 숨기는 이유는 외부 객체에서 해당 필드와 메서드를 잘못 사용하여 객체가 변화하지 않게 하는 데 있음.
  • Java에서는 캡슐화된 객체의 필드와 메서드를 노출시킬지 감출지 결정하기 위해 접근 제어자를 사용.

상속

  • 각각의 객체들을 상속 관계로 묶음으로써 객체 간의 구조를 파악하기 쉬워짐.
  • 필드와 메서드를 변경하는 경우 부모 객체에 있는 것만 수정하게 되면 자식 객체 전부 반영이 되기 때문에 일관성을 유지하기 좋음.
  • 자식 객체가 부모 객체의 필드와 메서드를 물려받아 사용할 수 있기 때문에 코드의 중복이 줄어들며 코드의 재사용성이 증가.

다형성

객체가 연산을 수행할 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 다른 여러 가지 형태로 재구성되는 것을 의미

 

추상화

객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것


클래스 설계

클래스 만들기 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);
    }

 

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


객체 생성과 참조형 변수

객체 생성

참조형 변수

 

클래스를 만들었으니 객체를 생성할 수 있다. ( = 인스턴스화 )

Car car = new Car(); // 객체 생성 ( 인스턴스화 )

 

  • new 연산자를 통해서 객체가 생성되면 해당 인스턴스의 주소가 반환되기 때문에 해당 클래스의 참조형 변수를 사용하여 받아줄 수 있다.

 

객체 배열

 

객체를 배열로도 만들 수 있다.

        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