반응형
이전에 배운 내용
[JAVA] 객체의 필드와 메서드
이전 내용 [JAVA] 객체 생성 방법 [JAVA] 객체 생성 방법 이전에 만든 class Car로 객체를 만들어봅시다. [JAVA] 클래스 설계 방법 [JAVA] 클래스 설계 방법 클래스의 구성 필드(속성), 생성자(어떻게 만들
dev-story93.tistory.com
메서드를 배울 때는 항상 오버로딩을 배운다.
오버로딩이란?
함수가 하나의 기능만을 구현만 하는 게 아니라 하나의 메서드 이름으로 여러 기능을 구현하도록 하는 기능
한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도, 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름을 사용해서 메서드를 정의할 수 있다.
동일한 메서드지만 매개변수의 타입과 순서가 다르면 동일한 이름의 메서드를 사용가능하다.
오버로딩의 조건
- 메서드의 이름이 같고, 매개변수의 개수, 타입, 순서가 달라야 합니다.
- '응답 값만' 다른 것은 오버로딩을 할 수 없다.
- 접근 제어자만 다른 것도 오버로딩을 할 수 없다.
- 결론, 오버로딩은 매개변수의 차이로만 구현가능
오버로딩의 장점
- 메서드 하나로 상황에 따른 여러 동작을 할 수 있다.
- 예를 들면 메시지 출력할 때 쓰는 println() 이 있습니다.
- println()의 매개변수로는 int, double, String, boolean 등 다양하게 넣을 수 있습니다.
- 메서드 이름을 절약할 수 있다.
- 만약 오버로딩이 안된다면 println( )는 printlnInt( ), printlnDouble( )처럼 메서드명이 길어지고 낭비되었을 것입니다.
- 오버로딩된 println( ) 확인해 보자
printStream
public class PrintStream extends FilterOutputStream
implements Appendable, Closeable
{
...
public void println() {
newLine();
}
public void println(boolean x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(char x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(int x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(long x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(float x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(double x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(char[] x) {
if (getClass() == PrintStream.class) {
writeln(x);
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(String x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(Object x) {
String s = String.valueOf(x);
if (getClass() == PrintStream.class) {
// need to apply String.valueOf again since first invocation
// might return null
writeln(String.valueOf(s));
} else {
synchronized (this) {
print(s);
newLine();
}
}
}
...
}
기본형 & 참조형 매개변수
기본형 매개변수
메서드를 호출할 때 전달할 매개값으로 지정한 값을 메서드의 매개변수에 복사해서 전달합니다.
- 매개변수의 타입이 기본형일 때는 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 않습니다.
- 기본형 매개변수는 읽는 것만 가능하다.
참조형 매개변수
메서드를 호출할 때 전달할 매개값으로 지정한 값의 주소를 매개변수에 복사해서 전달합니다.
- 매개변수를 참조형으로 선언하면 값이 저장된 곳의 원본 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는 것도 가능합니다.
- 메서드의 매개변수뿐만 아니라 반환타입도 참조형이 될 수 있습니다.
- 반환타입이 참조형이라는 것은 반환하는 값의 타입이 “실제값의 주소”라는 의미입니다.
- 참조형 매개변수는 읽고 변경까지 가능하다. 이유는 원본값의 주소를 복사하여 객체가 생성되기 때문에 복사된 값을 바꿀 수 있기 때문? 원본값은 변하지 않는다.
ex)
car 클래스
public class Car {
String company; // 자동차 회사
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
double speed; // 자동차 속도 , km/h
char gear; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태
Tire tire;
Door door = new Door();
Handle handle = new Handle();
public Car() {} // 기본 생성자
double gasPedal(double kmh, char type) {
changeGear(type);
speed = kmh;
return speed;
}
double brakePedal(char type) {
speed = 0;
type = 'P'; // 정지 후 매개변수 type을 어떤 타입으로 전달 받았는지 상관없이 'P'로 고정시키기
changeGear(type);
return speed;
}
char changeGear(char type) {
gear = type;
return gear;
}
boolean onOffLights() {
lights = !lights;
return lights;
}
void horn() {
System.out.println("빵빵");
}
Tire setTire(Tire tireCompany) {
tireCompany.company = "KIA"; // 금호 타이어를 전달 받았지만 강제로 KIA 타이어로 교체
tire = tireCompany;
return tire;
}
}
tire 클래스
public class Tire {
String company; // 타이어 회사
public Tire() {}
}
Main 클래스
public class Main {
public static void main(String[] args) {
Car car = new Car(); // 객체 생성
// 기본형 매개변수
char type = 'D';
car.brakePedal(type);
// 메서드 실행 완료 후 전달할 매개값으로 지정된 type 값 확인
System.out.println("type = " + type); // 기존에 선언한 값 'D' 출력, 원본 값 변경되지 않음
// 메서드 실행 완료 후 반환된 car 인스턴스의 gear 타입 확인
System.out.println("gear = " + car.gear); // 객체 내부에서 type을 변경하여 수정했기 때문에 'P' 출력
System.out.println();
// 참조형 매개변수
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" 출력
}
}
다음은 인스턴스 멤버와 클래스 멤버에 대해 알아보자!
반응형
'언어(language) > 자바(Java)' 카테고리의 다른 글
| [JAVA] 지역변수와 상수 (0) | 2023.10.19 |
|---|---|
| [JAVA] 인스턴스 멤버와 클래스 멤버 (2) | 2023.10.19 |
| [JAVA] 객체의 필드와 메서드 (0) | 2023.10.18 |
| [JAVA] 객체 생성 방법 (2) | 2023.10.18 |
| [JAVA] 클래스 설계 방법 (0) | 2023.10.18 |