본문 바로가기
Language/Java

메소드 오버로딩과 String 클래스

by Zayne 2023. 2. 4.

호출할 메소드를 찾을 때 두 가지 정보를 참조하여 메소드를 호출

1. 메소드의 이름

2. 메소드의 매개변수 정보

■ 메소드 오버로딩

> 한 클래스 내에 이름이 같은 메소드가 둘 이상 존재하여도 매개변수의 선언이 다르면

메소드의 구분이 가능하다. 때문에 매개변수의 선언이 다르면 동일한 이름의 메소드 정의를

허용하는데 이를 가리켜 메소드 오버로딩이라고 한다.

구체적으로는 매개변수의 수 또는 형(type)이 달라야 한다.

※ 생성자도 오버로딩의 대상이 될 수 있다.

public class Person {
	private int regiNum; // 주민등록 번호
	private int passNum; // 여권 번호

	Person(int rnum, int pnum) {
		regiNum = rnum;
		passNum = pnum;
	}

	Person(int rnum) {
		regiNum = rnum;
		passNum = 0;
	}
}

■ 키워드 this를 이용한 다른 생성자의 호출

> 위 예시에서 두 번째로 위치한 생성자를 대신하여 다음과 같이 생성자를 정의할 수도 있다.

Person(int rnum) {
	this(rnum, 0);
}

여기서 사용된 this는 오버로딩 된 다른 생성자를 의미한다.

즉 rnum과 0을 인자로 받는 다른 생성자를 호출하여 값을 초기화한다.

■ 또한 this는 인스턴스 변수의 접근에서도 사용할 수 있다.

public class SimpleBox {
	private int data;

	SimpleBox(int data) {
		this.data = data;
	}

	void setData(int data) {
		this.data = data;
	}

	int getData() {
		return this.data;
	}
}

위 예시에서의 this.data는 인스턴스 변수 data를 의미하게 된다.

■ String 클래스의 생성 방법

String str = "Simple String";
String str= new String("Simple String");

위 두 가지 방식으로 생성된 String 인스턴스는

System.out.println(str);

로 호출이 가능하였는데, 이는 다음과 같이 메소드가 정의되어 있기 때문에 가능하다

public void println(String s) {...}

 

그렇다면 위 두 가지의 String 클래스 생성 방법의 차이점은 어떻게 될까?

String str1 = "Simple String";
String str2 = "Simple String";

String str3 = new String("Simple String");
String str4 = new String("Simple String");

위 예시에서 str1 == str2 는 true 이고, str3 == str4 는 false를 반환한다.

참조변수를 대상으로 비교를 하기 때문에, 참조변수의 참조 값에 대한 비교 연산을 진행한다.

하여 참조 값이 같은 str1과 str2는 true를 반환하고 서로 다른 인스턴스를 참조하고 있는

str3와 str4는 false를 반환한다.

그렇다면 왜 이러한 차이를 보이는 것일까?

이유는 String 인스턴스는 Immutable 인스턴스이기 때문이다.

즉. String str = "AtoZ"; 이라는 String 인스턴스를 생성하면 문자열인 'AtoZ'는

인스턴스가 소멸될 때까지 변경할 수 없다.

즉 위 예시의 str1과 str2는 다음과 같이 공유하는 방식으로 코드를 처리한다.

String str1 = "Simple String";
String str2 = str1;

※ 두 String 인스턴스의 문자열을 비교하고 싶다면 equals 메소드를 사용하면 된다.

 if(str3.equals(str4))

 

■ String 클래스의 메소드

// concat 메소드

String st1 = "Coffee";
String st2 = "Bread";
String st3 = st1.concat(st2);


// substring 메소드

String str = "abcdefg";
str.substring(2); // 인덱스 2 이후의 내용으로 이뤄진 문자열 "cdefg" 반환
str.substring(2, 4); // 인데스 2~3에 위치한 내용의 문자열을 반환

> 문자열 비교 메소드에는 equals가 있었고,

또한 사전 편찬 순서를 기준으로 비교하는 compareTo 메소드

1. 두 문자열의 내용이 일치하면 0을 반환

2. 호출된 인스턴스의 문자열이 인자로 전달된 문자열보다 앞서면 0보다 작은 값 반환

→ str1.compareTo(str2) 에서 str1의 문자열이 앞서는 경우

3. 호출된 인스턴스의 문자열이 인자로 전달된 문자열보다 뒤서면 0보다 큰 값 반환

→ str1.compareTo(str2) 에서 str1의 문자열이 뒤서는 경우

> 기본 자료형의 값을 문자열로 바꾸는 valueOf 메소드

double e = 2.12345;
String se = String.valueOf(e);

※ 클래스(static) 메소드이므로 위와 같이 호출 가능

'Language > Java' 카테고리의 다른 글

배열  (0) 2023.02.05
StringBuilder 클래스  (0) 2023.02.04
클래스 변수와 클래스 메소드  (0) 2023.02.03
클래스와 인스턴스  (0) 2023.02.02
변수의 스코프  (0) 2023.02.02