클래스 내에 동일한 이름의 메소드를 둘 이상 정의하는 것은 불가능. 하지만 매개변수 선언이 다르다면 가능! 이것을 메소드 오버로딩이라고 한다.
조건
메소드의 이름
메소드의 매개변수 정보
MyHome home = new MyHome ();
home.mySimpleRoom(3, 5);
메소드 이름이 home.mySimpleRoom
3과 5를 인자로 받을 수 있는 메소드
Void mySimpleRoom (int n1, int n2) {
}
매개변수가 2이상 존재해도 문제 X
매개변수 선언이 다르다면 호출된 메소드의 구분이 가능
매개변수의 선언이 다르다면 동일한 이름의 메소드 정의를 허용, -> 메소드 오버로딩 이라고 한다. 다만 반환형이 다를 경우 메소드 오버로딩이 성립하지 않는다. 또한 매개변수의 수는 같지만 매개변수 형이 다르기 때문에 메소드 오버로딩이 성립.
생성자도 오버로딩 대상이 된다.
public class Main1 {
public static void main(String[] args) {
Person hwang = new Person(335577, 112233);
Person ik = new Person(775544);
hwang.showPersonalInfo();
ik.showPersonalInfo();
}
}
class Person{
private int regiNum;
private int passNum;
Person(int rnum, int pnum){
this.regiNum = rnum;
this.passNum = pnum;
}
Person(int num){
regiNum = num;
passNum = 0;
}
void showPersonalInfo(){
System.out.println("주민번호 :" + regiNum);
if (passNum != 0){
System.out.println("여권번호 :" + passNum);
} else {
System.out.println("여권 없음");
}
}
}
매개변수 선언이 다르면 둘 이상의 정의가 가능. 즉 생성자도 오버로딩을 할 수 있다는 것
Person(int rnum, int pnum){
this.regiNum = rnum;
this.passNum = pnum;
}
Person(int num){
regiNum = num;
passNum = 0;
}
둘은 매개변수 선언이 다르므로, 둘은 오버로딩 관계에 있다고 볼 수 있다.
키워드 this를 이용한 다른 생성자 호출
Person(int rnum, int pnum){
this.regiNum = rnum;
this.passNum = pnum;
}
This는 오버로딩 된 다른 생성자를 의미. 초기화 할 값만 전달 받고, 실제 초기화는 정의된 생성자를 통해서 진행.
This를 이용한 인스턴스 변수의 접근
public class Main2 {
public static void main(String[] args) {
SimpleBox box = new SimpleBox(99);
System.out.println(box.getData());
box.setData(77);
System.out.println(box.getData());
}
}
class SimpleBox{
private int data;
SimpleBox(int data){
this.data = data;
}
void setData(int data){
this.data = data;
}
int getData(){
return this.data;
}
}
private int data;
SimpleBox(int data){
this.data = data;
}
매개변수 이름이 인스턴스 변수의 이름과 동일하게 선언된 경우, 선언된 지역 내에서 해당 이름은 매개변수를 의미 => this를 이용하면 위와 같이 사용 가능
String 클래스
String 클래스의 인스턴스 생성
public class Main3 {
public static void main(String[] args) {
String str1 = new String("simple String");
String str2 = "The Best String";
System.out.println(str1);
System.out.println(str1.length());
System.out.println();
System.out.println(str2);
System.out.println(str2.length());
System.out.println();
showString("Funny");
}
public static void showString(String str){
System.out.println(str);
System.out.println(str.length());
}
}
“ “ 를 사용해서 문자열을 표현하면, String 인스턴스 생성으로 이어진다.
String str1 = new String("simple String");
String str2 = "The Best String";
System.out.println(str1.length());
정의된 length 메소드를 호출하여 문자열의 길이를 반환 출력.
메소드 println은 인자를 전달하지 않고 호출이 가능, -> “개 행”을 하게 된다.
Println은 메소드 보다는 다양한 인자를 전달받을 수 있도록 오버로딩,
showString("Funny");
인스턴스의 참조 값이 문자열 선언을 대신하게 된다 매개변수 선언이 String형 참조변수로 선언된 메소드는 문자열을 인자로 전달.
public static void showString(String str){
System.out.println(str);
System.out.println(str.length());
}
문자열 생성을 위한 두가지 방법 차이점?
public static void main(String[] args) {
String str1 = "S";
String str2 = "S";
String str4 = new String("S");
String str5 = new String("S");
if (str1 == str2){
System.out.println("str1과 str2는 동일 인스턴스 참조");
} else {
System.out.println("다른 인스턴스 참조");
}
if (str5 == str4){
System.out.println("동일 인스턴스");
} else {
System.out.println("다른 인스턴스 참조");
}
}
}
참조변수를 대상으로 한 == 연산은 참조변수의 참조값에 대한 비교 연산을 진행. Str1과 str2가 참조하는 인스턴스는 같은 인스턴스.
String str4 = new String("S");
String str5 = new String("S");
Str4 와 str5은 다른 인스턴스
핵심은 String은 Immutable이다. 인스턴스가 소멸될 때까지 변경이 불가능하다.
문자열 내용이 같기 때문에, 하나의 인스턴스를 생성해서 공유하는 방식으로 처리
String str1 = “Simple String”
String str2 = str1
이렇게 사용한 경우 문제가 되지는 않는다. 문제가 되는 상황이라면 new 라는 키워드 사용.
String인스턴스를 이용한 switch
String 인스턴스를 이용한 switch문 사용 가능해짐
String 클래스의 메소드
문자열 연결시키기 (Concatenating)
두 문자열을 연결시킨 문자열을 결과로 얻을 수 있다. 물론 새로운 문자열은 String 인스턴스의 형태로 만들어지고, 인스턴스의 참조값이 반환.
public class Main5 {
public static void main(String[] args) {
String str1 = "Coffee";
String str2 = "Bread";
String str3 = str1.concat(str2);
System.out.println(str3);
String str4 = "Fresh".concat(str2);
System.out.println(str4);
}
}
문자열 일부 추출하기 (SubString)
Public String substring(int beginIdx) -> beginIdx 부터 끝까지 추출. 문자열의 뒷부분을 별도의 문자열로 추출 가능. 메소드 subString의 인자로 전달되는 숫자는 문자열 “인덱스 값이다”
Public String substring(int beginIdx, int endIdx)
참고로 endIdx는 반환되는 문자열에 포함 안된다.
public class Main6 {
public static void main(String[] args) {
String str1 = "abcdefg";
String str2 = str1.substring(2);
System.out.println(str2);
String str3 = str1.substring(2,4);
System.out.println(str3);
}
}
문자열의 내용 비교 (comparing)
String 클래스의 메소드를 이용하면 두 개의 String 인스턴스가 지나는 문자열의 내용 비교 가능
Public Boolean equals (Obj obj) -> 같으면 true, 다르면 false
사전편찬순서를 기준으로 조금더 구체적 진행하고 싶다면
Public int comapreTo (String anotherString)
두 문자열의 비교는 순서를 비교.
Public int comapreToIgnoreCase (String str)
문자열에 비교에 있어서 대소문자를 구분하지 않는다. 사전편찬상 대문자는 소문자보다 앞에 위치.
public class Main7 {
public static void main(String[] args) {
String str1 = "Lexicographically";
String str2 = "lexicographically";
int cnt;
if (str1.equals(str2))
System.out.println("같음");
else
System.out.println("다름");
cnt = str1.compareTo(str2);
if (cnt == 0)
System.out.println("두문자열 일치합니다");
else if (cnt < 0){
System.out.println("사전앞에 위치하는 문자:" + str1);
} else {
System.out.println("시전 앞에 위치하는 문자:" + str2);
}
if (str1.compareToIgnoreCase(str2) == 0){
System.out.println("깉음");
} else {
System.out.println("다름");
}
}
}
기본 자료형의 값을 문자열로 변경
Static String valueOf ( )
String 클래스에 정의되어 있는 다른 메소드들 호출, 기본 자료형의 값을 문자열로 변경 가능
문자열을 대상으로 하는 + 와 = dustks
<문제>
1.
public class Main8 {
public static void main(String[] args) {
String s = "990925".concat("1012999");
System.out.println(s);
String s1 = "990925-1012999";
String s2 = s1.substring(0,6) + " " + s1.substring(7);
System.out.println(s2);
}
}
문자열 결합의 최적화 (Optimization of String Cincatenation)
String birth = "<앙>" + 7 + ',' + 16;
System.out.println(birth);
String birth1 =
"<양>".concat(String.valueOf(7)).concat(String.valueOf(',')).concat(String.valueOf(16));
}
많은 형 변환을 거쳐야 한다.
StringBuilder
클래스는 내부적으로 문자열을 저장하기 위해 메모리 공간을 갖는다. 이때 메모리 공간은 String 클래스의 메모리 공간과 달리 문자를 추가하거나 삭제하는 것이 가능하다. 또한 수정을 요한다면 내용을 담아서 관리
public class Main9 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("123");
sb.append(45678);
System.out.println(sb.toString());
sb.delete(0, 2);
System.out.println(sb.toString());
sb.replace(0,3,"AB");
System.out.println(sb.toString());
sb.reverse();
System.out.println(sb.toString());
String sub = sb.substring(2,4);
System.out.println(sub);
}
}
public StringBuilder append(int i) – 문자열 내용을 추가
public StringBuilder delete(int start, int end) – start 부터 end 이전 까지 내용을 삭제
public StringBuilder insert(int offset, String str) – offset 위치에 str 전달된 문자열 추가
public StringBuilder replace(int start, int end, String str) – start 부터 end 이전의 내용을 str 문자열로 대체
public StringBuilder subString(int start, int end) – start 부터 end이전 까지 내용만 담은 String 인스턴스 생성 및 반환.
Public String toString() – 저장된 내용을 담은 String 인스턴스 반환 및 생성
StringBuilder 인스턴스 내부에서는 문자열을 관리를 위한 메모리 공간이 존재.
StringBuilder sb1 = sb.append(45678);
( )안에 숫자를 쓰면 메모리 공간을 확보, 적절한 크기를 만들면, 그만큼의 성능 향상을 기대 하 수 있다.
public class Main10 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("123");
StringBuilder sb1 = sb.append(45678);
System.out.println(sb1.toString());
System.out.println(sb.toString());
sb1.delete(0,5);
System.out.println(sb1.toString());
System.out.println(sb.toString());
if (sb == sb1){
System.out.println("같은 인스턴스 참조");
} else {
System.out.println("다른인스턴스 참조");
}
}
}
이는 새로운 인스턴스를 생성하는 것이 아니라, 한 인스턴스의 메소드를 이어서 호출하는 결과를 갖게 된다.
StringBuilder vs StringBuffer
<공통점>
생성자를 포함한 메소드의 수
메소드의 기능
메소드의 이름과 매개변수 선언
StringBuffer는 쓰레드에 안전, StringBuilder는 쓰레드에 안전하지 않는다
StringBuffer는 멀티 쓰레드 환경에서 안전 하지만, 속도가 느려진다.
<문제>
public class Main11 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("990925-1012999");
sb.replace(6,7, " ");