본문 바로가기
컴퓨터 프로그래밍/Java

[Java] 필드와 매서드

by 한33 2024. 7. 26.

객체의 속성 : 필드

필드는 객체의 데이터를 저장하는 역할을 함

 

  • 고유 데이터 : 자동차 고유한 정보
  • 상태 데이터 : 자동차 상태 정보 ( 자주 바뀜 )
  • 객체 데이터 : 자동차 구성 요소 ( 하나의 또 다른 객체 )
public class Tire {
    public Tire() {}
}

 

타이어 클래스를 만들고,

 

String company; // 자동차 회사
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격

double speed;  // 자동차 속도 , km/h
char gear; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태

Tire tire;

 

이와 같이 필드 생성할 때 객체 데이터를 선언.

 

필드의 초기값과 초기화

우리가 정의하여 선언한 클래스의 필드들은 따로 초기화 안 하면 기본값으로 세팅됨

필드 사용 방법

  • 필드의 값을 변경하고나 읽는 것을 "필드를 사용한다" 라고 함.
  • 필드를 클래스에 선언했다고 해서 사용가능한 것이 아님 (단순 설계했을 뿐)
  • 따라서 객체를 생성한 후에 필드를 사용할 수 있음

외부 접근

Car car = new Car();

 

먼저 이렇게 객체를 생성했다면 (인스턴스화) 참조 변수 car 을 이용하여 외부에서 객체 내부의 필드에 접근하여 사용할 수 있다.

car.color = "blue";

 

내부 접근

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

 

바로 대놓고 들어가서 사용하면 된다.

 


객체의 행위 : 메서드

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

 

  • return 값으로 반환할 값의 타입이 처음에 들어가게 된다.
  • 반환할 값이 없을 때는 리턴 타입이 void
    • 반환값이 없으니 return 생략 가능
    • 생략하지 않고 원하는 지점에서 종료하고 싶을 때 return  사용 가능

 

매개변수

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

 

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

gasPedal(100, 'D');

 

전달하려는 값이 없으면 생략 가능

가변 길이의 매개변수도 선언 가능

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

... 을 이용하면 

- `carSpeeds(100, 80);`
- `carSpeeds(110, 120, 150);`

 

이렇게 맘대로 변수를 넣을 수 있음

 

반환값 저장

매서드의 리턴 타입과 변수의 타입이 동일하거나 자동 타입 변환될 수 있다면 변수 안에 저장 가능

double speed = car.gasPedal(100, 'D');

 

메서드 오버로딩

한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도, 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름을 사용해서 메서드를 정의할 수 있다. ( 매개변수의 차이로만 구현 가능 )

 

장점

 

기본형 & 참조형 매개변수

매개변수의 타입이 기본형일 때는 값 자체가 복사되어 넘어감.

→ 매개값으로 지정된 변수의 원본 값이 변경되지 않음

 

매개변수를 참조형으로 선언하면 값이 저장된 곳의 원본 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는 것도 가능

 

매개변수 뿐 아니라 반환 타입도 참조형이 될 수 있음

 

기본형 매개변수

// 기본형 매개변수
char type = 'D';
car.brakePedal(type);

// 메서드 실행 완료 후 전달할 매개값으로 지정된 type 값 확인
System.out.println("type = " + type); // 기존에 선언한 값 'D' 출력, 원본 값 변경되지 않음
// 메서드 실행 완료 후 반환된 car 인스턴스의 gear 타입 확인
System.out.println("gear = " + car.gear); // 객체 내부에서 type을 변경하여 수정했기 때문에 'P' 출력

 

type 을 'D' 로 설정했고 brakePedal 메소드로 type 매개변수를 전달했다.

double brakePedal(char type) {
    speed = 0;
    type = 'P'; // 정지 후 매개변수 type을 어떤 타입으로 전달 받았는지 상관없이 'P'로 고정시키기
    changeGear(type);
    return speed;
}

brakePedal 메서드 안에서 type 을 'P' 로 변경했고 changeGear 메서드로 type 을 전달했다.

 

이렇게 해도 다시 Main.java 에서는 type 은 'D' 가 출력된다.

 

 

참조형 매개변수

// 참조형 매개변수
Tire tire = new Tire();
tire.company = "금호"; // 금호 타이어 객체 생성

// 차 객체의 타이어를 등록하는 메서드 호출한 후 반환값으로 차 객체의 타이어 객체 반환
Tire carInstanceTire = car.setTire(tire);

// 메서드 실행 완료 후 전달할 매개값으로 지정된 참조형 변수 tire의 company 값 확인
System.out.println("tire.company = " + tire.company); // "KIA" 출력
// 전달할 매개값으로 지정된 tire 인스턴스의 주소값이 전달되었기 때문에 호출된 메서드에 의해 값이 변경됨.

// 메서드 실행 완료 후 반환된 car 인스턴스의 tire 객체 값이 반환되어 저장된 참조형 변수 carInstanceTire의 company 값 확인
System.out.println("carInstanceTire.company = " + carInstanceTire.company); // "KIA" 출력
Tire setTire(Tire tireCompany) {
    tireCompany.company = "KIA"; // 금호 타이어를 전달 받았지만 강제로 KIA 타이어로 교체
    tire = tireCompany;
    return tire;
}
public class Tire {
    String company; // 타이어 회사
    public Tire() {}
}

 

Tire 클래스를 생성했고 company 변수가 안에 선언되어있다.

Main.java 에서 tire.company = "금호"; 로 초기화되어있고

Tire carInstanceTire = car.setTire(tire); 로 setTire 메서드가 호출되었다.

setTire 메서드는 tireCompany 매개변수를 받아 tireCompany.company = "KIA" 로 초기화되어있기 때문에

이는 밖에서 tire.company 를 출력했을 때 KIA 로 변경되어서 출력되는 것을 확인할 수 있다.

이렇게 참조형 변수로 변경된 carInstanceTire.company 역시 KIA 로 변경된 것을 확인할 수 있다.

 

이는 기본형 변수와 다르게 주소값을 전달하기 때문에 읽기만 가능한 게 아닌 변경까지 가능한 점을 확인할 수 있다.

 

어렵다...