※ Chapter11 메소드 오버로딩과 String 클래스
※ 본문은 윤성우의 열혈JAVA를 정리한 글입니다.
※ 문제가 될시 비공개 처리하겠습니다.
원래 10단원까지 한 후 면접준비겸 복습한번 하고 넘어가려고 했다.
그러나, 코딩 테스트 문제들을 보니 13단원까진 한번 보고 복습해야 문제를 풀 수 있었다.
(특히 SW expert Academy 문제)
그래서 다시 정리를 시작하고, 13단원까지 마무리한뒤 다시한번 복습하기로 한다.
§메소드 오버로딩 (Metheod Overloading)
한 클래스 내에 동일한 이름의 메소드를 둘 이상 정의하는 것은 허용되지 않는다.
그러나, 매개변수의 선언이 다르면 가능하다. 이것을 메소드 오버로딩 이라고 한다.
■ 메소드 오버로딩의 조건
호출할 메소드를 찾을 때 다음 두 가지 정보를 참조하여 메소드를 찾는다.
- 메소드의 이름
- 메소드의 매개변수 정보
예를 들어 다음 메소드 호출문을 보자.
MyHome home = new Myhome();
home.mySimpleRoom(3 , 5);
위의 문장에서 호출하는 메소드를 찾을 때 다음 두 가지 정보가 사용된다.
- 메소드 이름이 mySimpleRoom 이다.
- 3,5를 인자로 전달받을 수 있는 메소드이다.
즉, 모양새는 다음과 같다.
void mySimpleRoom(int a, int b) {...}
따라서 다음과 같이 mySimpleRoom 메소드가 MyHome 클래스 내에
다음과 같이 둘 이상 선언되도 문제가 되지 않는다. 매개변수의 선언이 다르면 구분이 가능하기 때문이다.
class MyHome {
void mySimpleRoom(int n) {...}
void mySimpleRoom(int a, int b) {...}
void mySimpleRoom(double a, double b) {...}
}
매개변수의 선언이 다르면 동일한 이름의 메소드 정의를 허용하는데,
이를 가리켜 '메소드 오버로딩'이라 한다. (다시말하면, 매개변수의 수 또는 type이 달라야 함)
그러나, 다음과 같이 반환형이 다른 경우에는 메소드 오버로딩이 성립하지 않는다.
int simpleMethod() {...}
double simpleMethod() {...}
반환형은 호출할 메소드를 선택하는데 기준이 아니기 때문이다.
■ 생성자도 오버로딩의 대상이 된다.
이와 관련하여 예제를 확인해보자.



위의 Person 클래스에 정의된 두 생성자는 오버로딩 관계에 있다.
■ 키워드 this를 이용한 다른 생성자의 호출
앞서 예제에서 정의한 다음 Person 클래스를 관찰해보자.
class Person {
private int regiNum;
private int passNum;
Person(int rnum, int pnum) {
regiNum = rnum;
passNum = pnum;
}
Person(int rnum) {
regiNum = rnum;
passNum = 0;
}
void showPersonalInfo() {
System.out.println("주민등록 번호: " + regiNum);
if(passNum != 0)
System.out.println("여권 번호 : " + passNum + '\n');
else
System.out.println("여권을 가지고 있지 않습니다. \n");
}
}
이 중에서 두 번째로 위치한 생성자를 대신해 다음 생성자를 정의할 수도 있다.
Person(int rnum) {
this(rnum, 0)
}
위에서 사용된 this는 '오버로딩 된 다른 생성자'를 의미한다.
이와같이 this를 이용하면 코드의 수를 줄이는 효과를 얻을 수 있다.
■ 키워드 this를 이용한 인스턴스 변수의 접근
예제를 보면서 설명을 하도록 하겠다.
class SimpleBox {
private int data;
simpleBox(int data) {
this.data = data;
}
...
이런 코드가 있다.
클래스 안에는 인스턴스 변수로 data가 선언되었다.
인스턴스 메소드 내에서, 그리고 생성자 내에서 data 라는 이름의 변수에 접근하면,
인스턴스 변수 data의 접근으로 이어진다.
그러나 매개변수로 data라는 이름의 변수가 선언되면 상황이 달라진다.
class SimpleBox {
private int data;
simpleBox(int data) {
여기서의 data는 매개변수 data를 의미함
여기서의 this.data는 인스턴스 변수 data를 의미함
}
...
따라서 다음의 this.data = data;는 다음과 같이 해석된다.
매개변수 data의 값을 인스턴스 변수 data에 저장한다.
§ String 클래스
자바에서는 String이라는 이름의 클래스를 정의하여 제공하고 있다. (목적은 문자열 표현)
■ String 클래스의 인스턴스 생성
문자열 표현을 위한 String 인스턴스의 생성 방법은 다음과 같다. = 일반적인 인스턴스 생성 방법
String str = new String("Simple String");
이렇게 인스턴스가 생성되면 str이 참조하는 String 인스턴스의 내부에는 문자열이 담기고
이는 다음과 같이 출력하면 된다.
System.out.println(str);
보편적인 String 인스턴스의 생성 방법은 다음과 같다.
String str = "Simple String";
■ 문자열 생성을 위한 두 가지 방법의 차이점은?
String str1 = new String("My String");
String str2 = "Your String";
다음 예제를 통해서 방금 생선한 인스턴스 차이를 보자.


참조변수를 대상으로 한 == 연산은 '참조변수의 참조 값'에 대한 비교 연산을 진행한다.
따라서 예제는 str1과 str2가 같은 인스턴스이고, str3와 str4는 다른 인스턴스임을 알게 해준다.
이러한 차이를 보이는 이유는 무엇일까?
"String 인스턴스는 Immutable 인스턴스입니다."
즉, 변경할 수 없다는 뜻이다.
예를 들어서 String str1 = "AtoZ"; 라고 한다ㄴ면
이때 생성된 인스턴스는 내부에 문자열 AtoZ를 지니게 되고, 이 내용은 인스턴스가 소멸될 때까지 바꿀 수 없다.
때문에 String str2 = "AtoZ";를 바로 같이 선언한다면 '문자열 내용이 같기 때문에'
하나의 인스턴스를 생성해서 공유하는 방식으로 코드를 처리한다.
String str1 = "Simple String";
String str2 = str1;
§ String 클래스의 메소드
자바의 JDK 문서를 자주 참고해서 개발을 이뤄야 한다.
String 클래스는 많은 메소드가 정의되어 있는데 그것을 다 다루지는 못하기 때문이다.
필요할 때마다 들어가서 찾아보는 습관을 들이는게 가장 중요하다.
지금부터는 간단한 메소드만 살펴보고, 필요한 부분이 있다면 검색해서 사용하자.
■ 문자열 연결시키기: Concatenating
String 클래스의 다음 메소드를 이용하면 두 문자열을 연결시킨 문자열을 결과로 얻을 수 있다.
public String concat(String str)
이 메소드의 사용 방법은 다음과 같다.
String1.concat(String2); // String1과 String2을 연결한 결과를 반환
예문을 함께 보자.


■ 문자열의 일부를 추출하기 : Substring
String 클래스의 다음 메소드를 이용하면 문자열의 뒷부분을 별도의 문자열로 추출할 수 있다.
public String substring(int beginIndex)
메소드 사용방법은 다음과 같다.
String str = "abcdefg";
str.substring(2); //인덱스 2 이후의 내용으로 이뤄진 문자열 "cdefg" 반환
(참고로 인덱스는 0부터 시작한다.)
다음과 같은 방법으로도 사용 가능하다
String str = "abcdefg";
str. substring(2,4) ; // 2~3에 위치한 내용의 문자열 반환
위의 메소드 호출을 통해서 얻게 되는 문자열은 "cd"이다.
예제를 보자.


■ 문자열의 내용 비교: comparing
String 클래스의 다음 메소드를 이용하면 문자열을 비교할 수 있다.
public boolean equals(Object anObject)
이 메소드의 사용 방법은 다음과 같다.
String str = "my house";
boolean isSame = str.equals("my house");
문자열이 같으면 true, 다르면 false를 반환한다.
'JAVA' 카테고리의 다른 글
| 자바 기초부터 차근차근...(13) (0) | 2020.04.28 |
|---|---|
| 자바 기초부터 차근차근...(12) (0) | 2020.04.26 |
| 자바 기초부터 차근차근...(10) (0) | 2020.04.24 |
| 자바 기초부터 차근차근...(9) (0) | 2020.04.23 |
| 자바 기초부터 차근차근...(8) (0) | 2020.04.22 |