본문 바로가기

카테고리 없음

클래스

어이가 없다. 내가 오늘 쭉 작성했던게 다 날아갔다. 임시저장은 믿을게 못된다. 코드블럭을 만들었더니 밑에 글이 전혀 안써져서 임시저장을 믿고 새로고침을 했는데 다 날아간게 저장됬다. 이게 말이 되는 현상이냐??

 

그냥 중요했던거만 쓴다. 

 

상속이 제일 중요하다. 상속은 부모객체를 자식이 그대로 쓰게 하는거고, 자동차 안에 타이어, 문 이런게 부모 자식이다.

  1. 필드와 메서드를 변경하는 경우 부모 객체에 있는 것만 수정하게 되면 자식 객체 전부 반영이 되기 때문에 일관성을 유지하기 좋습니다.
  2. 자식 객체가 부모 객체의 필드와 메서드를 물려받아 사용할 수 있기 때문에 코드의 중복이 줄어들며 코드의 재사용성이 증가됩니다.

이게 상속을 쓰는 이유다.

 

클래스는 설계도, 객체는 인스턴스라고도 불리며 클래스로 생성된 생산품이다.

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;
    } // 인풋은 kmh 아웃풋은 speed

    double brakePedal() {
        speed = 0;
        return speed;
    }// 브레이크라 인풋은 없고 아웃풋은 스피드

    char changeGear(char type) {
        gear = type;
        return gear;
    }// 인풋은 기어의 4개 타입, 아웃풋은 기어

    boolean onOffLights() {
        lights = !lights;
        return lights;
    }// 브레이크처럼 끄는것 뿐이니 인풋 없음
    void horn() {
        System.out.println("빵빵");
    }//마찬가지로 인풋 없음 아웃풋도 없음 지속이 아니라서

}

이렇게 자동차 클래스를 만들고

 

메인을

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

 

이러면 car클래스에 연결되어 거기의 기어가 불러와져서 쓴데로 출력이 되는걸 확인할수있다.

public class Door {
    public Door() {
        System.out.println("문이 생성되었습니다.");
    }
}
public class Handle {
    public Handle() {
        System.out.println("핸들이 생성되었습니다.");
    }
}

 

public class Tire {
    public Tire() {
        System.out.println("타이어가 생성되었습니다.");
    }
}

 

이렇게 생성해주고

 

Tire tire;
Door door;
Handle handle;

 

이걸 카 클래스에 넣는다.

그런데, 기본적으로 초기값을 제공하지 않을 경우 객체가 생성될 때 자동으로 기본값으로 초기화가 된다.

 

byte
0
char
\u0000 (공백)
short
0
int
0
long
0L
float
0.0F
double
0.0
boolean
false
배열
null
클래스
null
인터페이스
null

 

 

  • 외부 접근
    • Car car = new Car();
      • 이렇게 객체를 생성했다면 우리는 참조 변수 car를 이용하여 외부에서 객체 내부의 필드에 접근하여 사용할 수 있습니다.
      • 이때 객체의 내부 필드에 접근하는 방법은 도트(.) 연산자를 사용하면 됩니다.
        • car.color = "blue";
  • 내부 접근
    • 도트 연산자를 사용하여 외부에서 객체 내부에 접근할 수 있을 뿐만 아니라 객체 내부 메서드에서도 내부 필드에 접근할 수 있습니다.
      • 이처럼 brakePedal() 메서드 내부에서 객체의 필드 speed를 바로 호출해서 사용할 수 있습니다.
    • double brakePedal() { speed = 0; return speed; }

 

String model = "Gv80"; 

이렇게 모델명을 정하고

boolean lights = true; // 자동차 조명의 상태

 

이렇게 조명을 항상켜둔다.

Tire tire = new Tire();

 

타이어도 새것으로

 

public class Main {
    public static void main(String[] args) {
        Car car = new Car(); // 객체 생성

        // 초기값과 기본값 확인하기

        System.out.println("car.model = " + car.model); // 초기값 "Gv80"이 출력됩니다.
        System.out.println("car.color = " + car.color); // 기본값 null이 출력됩니다.
        System.out.println();

        System.out.println("car.speed = " + car.speed); // 기본값 0.0이 출력됩니다.
        System.out.println("car.gear = " + car.gear);  // 기본값 \u0000(공백)이 출력됩니다.
        System.out.println("car.lights = " + car.lights); // 초기값 true가 출력됩니다.
        System.out.println();

        System.out.println("car.tire = " + car.tire); // 초기값 인스턴스의 주소가 출력됩니다.
        System.out.println("car.door = " + car.door); // 기본값 null이 출력됩니다.
        System.out.println();

        // 필드 사용

        car.color = "blue"; // 필드 color에 "blue" 데이터를 저장합니다.
        car.speed = 100;    // 필드 speed에 100 데이터를 저장합니다.
        car.lights = false; // 필드 lights에 false 데이터를 저장합니다.

        System.out.println("car.color = " + car.color); // 저장된 "blue" 데이터가 출력됩니다.
        System.out.println("car.speed = " + car.speed); // 저장된 100.0 데이터가 출력됩니다.
        System.out.println("car.lights = " + car.lights); // 저장된 false 데이터가 출력됩니다.

    }
}

 

이렇게 하면 카 클래스에 나온 요소들을 전부 출력이 가능하다.

 

타이어가 생성되었습니다.
car.model = Gv80
car.color = null

car.speed = 0.0
car.gear =  
car.lights = true

car.tire = Tire@15aeb7ab
car.door = null

car.color = blue
car.speed = 100.0
car.lights = false

이렇게 나온다.

 

 

리턴이란

 

메서드에 리턴 타입을 선언하여 반환할 값이 있다면 반드시 return 문으로 해당하는 리턴 타입의 반환값을 지정해야 하는데

 

반환할 값이 없을 때는 리턴 타입에 void를 작성해야 하고 반환값이 없음으로 return문을 반드시 지정할 필요는 없다.

 

메서드는 실행할 때 return문을 만나면 그대로 종료하게 되는데 void 타입일 때 return; 이렇게 return문을 사용하여 원하는 지점에서 메서드를 종료할 수도 있다.

 

double gasPedal(double kmh, char type) {
    speed = kmh;
    return speed;
}

 

이때  gasPedal(double kmh, char type) 메서드의 매개변수는 double 타입의 kmh, char 타입의 type이 매개변수.

 

순서와 타입에 맞춰 값을 넣어야 하는데, gasPedal(100, 'D');여야 한다. 100은 kmh, D는 char 라서 100이 앞이여야 한다.

D, 100이면 인식이 제대로 안된다.

 

void carSpeeds(double ... speeds) 이렇게 ...을 쓰면

- `carSpeeds(100, 80);`
- `carSpeeds(110, 120, 150);` 이런식으로 두개 세개 이렇게 여러개 사용 가능하다

 

매서드 호출

 

  • 외부 접근
    • Car car = new Car();
      • 이렇게 객체를 생성했다면 우리는 참조 변수 car를 이용하여 외부에서 객체 내부의 메서드에 접근하여 호출할 수 있습니다.
      • 이때 객체의 내부 메서드에 접근하는 방법은 도트(.) 연산자를 사용하면 됩니다.
        • car.brakePedal();
      • 또한 메서드가 매개변수를 가지고 있다면 반드시 호출할 때 매개변수의 순서와 타입에 맞게 매개값을 넣어줘야 합니다.
        • car.gasPedal(100, 'D');
  • 내부 접근
    • 도트 연산자를 사용하여 외부에서 객체 내부에 접근할 수 있을 뿐만 아니라 객체 내부 메서드에서도 내부 메서드에 접근하여 호출할 수 있습니다.
      • 이처럼 gasPedal(double kmh, char type) 메서드 내부에서 해당 객체의 changeGear(type); 메서드를 호출할 수 있습니다.
    • double gasPedal(double kmh, char type) { changeGear(type); speed = kmh; return speed; }

 

다시 자동차 클래스로 돌아와

double gasPedal(double kmh, char type) {
        changeGear(type);
        speed = kmh;
        return speed;
    }

 

 

이렇게 char type를 넣어주고 char이 기어에 대한거였으니 기어도 넣어준다.

 

void carSpeeds(double ... speeds) {
        for (double v : speeds) {
            System.out.println("v = " + v);
        }
    }

 

이렇게 ...으로 스피드를 새로 추가해서 속도들을 하나씩 할당하는게 가능하다.

 

 

 

 

메인은

 

public class Main {
    public static void main(String[] args) {
        Car car = new Car(); // 객체 생성

        // 메서드 호출 및 반환값 저장
        double speed = car.gasPedal(100, 'D');
        System.out.println("speed = " + speed);

        boolean lights = car.onOffLights();
        System.out.println("lights = " + lights);

        System.out.println();
        // gasPedal 메서드 내부에 호출된 changeGear(type); 메서드의 결과 확인
        // gear의 초기값은 'P'
        System.out.println("car.gear = " + car.gear); // 'D' 출력

        System.out.println();
        // 가변길이 매개변수 확인
        car.carSpeeds(100, 80);
        System.out.println();
        car.carSpeeds(110, 120, 150);
    }
}

 

이러면

타이어가 생성되었습니다.
speed = 100.0
lights = false

car.gear = D

v = 100.0
v = 80.0

v = 110.0
v = 120.0
v = 150.0으로 정상적으로 출력된다.