객체

김나영·2023년 6월 12일
0

Java 문법 종합반

목록 보기
12/21

1. 객체

  • 객체란 세상에 존재하는 물체를 뜻하며 식별이 가능한 것을 의미

  • 필드와 메서드로 정의하여 구현

    • 속성 : 필드, 행위 : 메서드
  • 인스턴스 : 클래스를 기반으로 객체화 시킨 것

    • 이 과정을 '인스턴스화'
  • 클래스 이름 : 객체를 만들기 위한 설계도

2. 클래스 설계

  • 만들려고 하는 설계도를 선언(클래스 선언)

  • 객체가 가지고 있어야할 속성(필드) 정의 -> 변수 형태로 선언

  • 객체를 생성하는 방식 정의(생성자(Constructor))

  • 객체가 가지고 있어야할 행위(메서드) 정의

public class Car{}
  • 클래스 선언
// <필드 영역>
    String company; // 자동차 회사
    String model; // 자동차 모델
    String color; // 자동차 색
    double price; // 자동차 가격
    double speed; // 자동차 속도(km/h)
    char gear; // 기어 상태(P, R, N, D)
    boolean lights; // 자동차 조명 상태
  • String 타입의 company 변수 선언

  • String 타입의 model 변수 선언

  • String 타입의 color 변수 선언

  • double 타입의 price 변수 선언

  • double 타입의 speed 변수 선언

  • char 타입의 gear 변수 선언

  • boolean 타입의 lights 변수 선언

// <생성자 영역>
public Car () {
        // 아무것도 없는 이 형태를 기본생성자라고 함 -> 생략 가능
    }
  • 생성자

    • 처음 객체가 생성될 때(instance화) 어떤 로직을 수행해야 하며, 어떤 값이 필수로 들어와야 하는지 정의
    • 반환 타입 X, 클래스 이름과 동일해야함
 // <메서드 영역>
// gasPedal
// input : km/h
// output : speed
double gasPedal(double kmh){
   speed = kmh;
   return speed; // 매개변수인 kmh을 통해 매개값을 전달받아 자동차의 속성인 speed 필드에 해당 값을 저장
}
// brakePedal
// input : X
// output : speed
double brakePedal(){
   speed = 0;
   return speed; // 메서드가 호출되면 자동차의 속성인 speed 필드의 값을 0으로 바꾼후 speed의 값을 반환
}
// changeGear
// input : gear(char 타입)
// output : gear
char changeGear(char type){
    gear = type;
    return gear; // 매개변수인 type을 통해 매개값을 전달받아 메서드가 호출되면 자동차의 속성인 gear 필드에 해당 값을 저장
    }
// onOffLight
// input : X
// output : lights(boolean 타입)
boolean onOffLight(){
    lights = !lights;
    return lights; // 메서드가 호출되면 자동차의 속성인 lights의 현재 논리 값을 반전 시킨 후 lights의 값을 반환
}
// horn
// input : X
// output : X
void horn(){ // 반환 값이 없을 땐 void
   System.out.println("빵빵"); // 메서드가 호출되면 자동차의 경적소리인 “빵빵”이 출력
}

3. 객체 생성과 참조형 변수

1) 객체 생성

new Car();
  • Car 클래스 객체 생성

2) 참조형 변수

package week03;
public class Main {
    public static void main(String[] args) {
        Car car1 = new Car(); // 생성자를 호출하기 위해 new 키워드 사용(새로운 객체를 만드는 명령어)
        Car car2 = new Car(); 
        System.out.println(car1); // week03.Car@682a0b20(car1이 가지고 있는 주소) 출력
  • Car클래스의 객체인 car1, car2 인스턴스 생성

3) 객체 배열

package week03;
public class Main {
    public static void main(String[] args) {
        Car[] carArray = new Car[3]; // 길이가 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); // P N D 출력
        }
    }
}

4. 객체의 필드

  • 데이터를 저장하는 역핳

  • 클래스에 필드를 정의하여 선언했다고 해서 바로 사용할 수 있는 것이 아니라 인스턴스화를 해야 사용 가능

  • 클래스는 실체가 아닌 설계도!!! 잊지 말기!!!

1) 초기화

String model = "Gv80";
boolean lights = true;
  • 필드타입 필드명 = 값;

  • 필드 타입별 기본값

데이터 타입기본값
byte0
char\u0000 (공백)
short0
int0
long0L
float0.0F
double0.0
booleanfalse
배열null
클래스null
인터페이스null

2) 사용법

  • 객체 생성 후 필드 사용 가능
Car car = new Car(); // 객체 생성
car.color = "blue"; // 내부로 접근
  • 외부 접근

    • 접근 방법 : 참조변수 car를 이용하여 외부에서 객체 내부 필드에 접근하여 사용
  • 내부 필드에 접근하기 위해서 도트(.) 연산자 사용

double brakePedal(){
   speed = 0; // 내부 접근
   return speed;
}
  • 객체 내부 메서드에서도 내부 필드에 접근 가능

  • brakePedal() 메서드 내부에서 객체의 필드 speed를 바로 호출해서 사용 가능

public class Car {
    String company; // 자동차 회사
    String model = "Gv80"; // 자동차 모델
    String color; // 자동차 색
    double price; // 자동차 가격
    double speed; // 자동차 속도(km/h)
    char gear; // 기어 상태(P, R, N, D)
    boolean lights = true; // 자동차 조명 상태
    Tire tire = new Tire(); // 인스턴스화
    public Car () {
        // 아무것도 없는 이 형태를 기본생성자라고 함 -> 생략 가능
    }
    // gasPedal
    // input : km/h
    // output : speed
    double gasPedal(double kmh) {
        speed = kmh;
        return speed;
    }
    // brakePedal
    // input : X
    // output : speed
    double brakePedal(){
        speed = 0; // 내부 접근
        return speed;
    }
    // changeGear
    // input : gear(char 타입)
    // output : gear
    char changeGear(char type){
        gear = type;
        return gear;
    }
    // onOffLight
    // input : X
    // output : lights(boolean 타입)
    boolean onOffLight(){
        lights = !lights;
        return lights;
    }
    // hom
    // input : X
    // output : X
    void horn(){
        System.out.println("빵빵");   
}
  • 위 코드를 토대로 Main 메서드로 테스트 해보기
package week03;
public class Main {
    public static void main(String[] args) {
        Car car = new Car(); // 객체 생성
        // 초기값과 기본값 확인 : 초기값을 준 것은 그 값이 들어가고, 아닌 값은 default value가 set
        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); // 초기값 : week03.Tire@5b480cf9(주소)
        System.out.println("car.door  = " + car.door); // 기본값 : null
        // 필드 사용
        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
    }
}
  • defalut value를 잡아주면 객체가 생성 될 때부터 무조건 Gv80, lights는 켜져 있는 것

메서드

1) 메서드 선언

리턴타입 메서드명(매개변수, ...) {
	실행할 코드 작성
}

2) 리턴 타입

  • 메서드가 실행된 후 호출을 한 곳으로 값을 반환할 때 해당 값의 타입

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

    • return; 이렇게 return문을 사용하여 원하는 지점에서 메서드를 종료할 수도 있음
double brakePedal() {...} // double 타입 반환
char changeGear(char type) {...} // char 타입 반환
boolean onOffLights() {...} // boolean 타입 반환
void horn() {...} // 반환할 값 없음

2) 매개 변수

  • 메서드를 메서드로 전달하려는 값을 받기 위해 사용되는 변수 즉, 호출할 때 매개체가 되는 변수

  • 매개변수에 값을 전달하기 위해서는 순서와 타입에 맞춰 값을 넣어주면 됨

double gasPedal(double kmh, char type){
        changeGear(type); // 가속도 페달을 밟으면 자동으로 기어가 변한다.
        speed = kmh;
        return speed;
void carSpeeds(double ... speeds) { // 가변길이의 매개변수 선언
        for(double v : speeds) {   //  … 을 사용하면 아래처럼 매개값을 , 로 구분하여 개수 상관없이 전달 가능
            System.out.println("v = " + v);
        }
    }
  • double 타입의 kmh

  • char 타입의 type

double speed = car.gasPedal(100,'D');
    System.out.println("speed = " + speed); // 100
  • 가변길이의 매개변수 선언 가능
car.carSpeeds(100, 80); // v = 100.0, v = 80.0
car.carSpeeds(110, 120, 150); // v = 110.0, v = 120.0, v = 150.0

3) 호출

  • 메서드명(매개변수) : 먀개변수를 올바르게 입력해야함
double gasPedal(double kmh, char type){
    changeGear(type); // 가속도 페달을 밟으면 자동으로 기어가 변한다.
    speed = kmh;
    return speed;
}
  • gasPedal(double kmh, char type) 메서드 내부에서 해당 객체의 changeGear(type); 메서드를 호출 가능
package week03;
public class Main {
    public static void main(String[] args) {
        Car car = new Car(); // 객체 생성
        System.out.println("페달 밟기 전 car.gear = " + car.gear); // null
        // 메서드 호출 및 반환값 저장
        double speed = car.gasPedal(100,'D'); // 빈환 값 저장
        System.out.println("speed = " + speed); // 100
        boolean lights = car.onOffLight();
        System.out.println("lights = " + lights); // false
        System.out.println();
        System.out.println("페달 밟은 후 car.gear = " + car.gear); // D
    }
}
  • 리턴타입과 변수의 타입이 동일하거나 자동 타입 변환이 될 수 있어야함

0개의 댓글