본문 바로가기
study_java/java_수강정리(~10.29)

[JAVA]12일차

by developer_j 2020. 5. 26.
728x90
반응형

< 12일차 수업 >

 

1. 오버로딩 (Overloading)

 

자바는 사용자가 호출하는 메소드를 찾을 때 두가지 정보를 참조한다 : 메소드 이름과, 메소드 매개변수.

이 중에서도 메소드 매개변수의 형태를 가지고 다른 메소드를 정의하는 것이 가능한데, 이것이 메소드 오버로딩이다.

 

오버로딩은 같은 함수반환형과 같은 함수명 일때, 매개변수의 타입과 갯수를 달리하여 함수를 정의하는 것을 말한다.

우리가 사용하는 생성자 역시 오버로딩 예시 중 하나이다.

class AAA{
	void simple(int p1, int p2) {
	}
	
    void simple(int p1, double p2) {
	}
}

public class Lecture12 {
    public static void main(String[] args) {
		AAA inst = new AAA();
		inst.simple(5, 'A'); 
        //int p1에 유니코드 값이 들어감. char형이 2바이트 = 자동형변환됨. String이면 어림도없지
	}

}

 


2. this 키워드

 

this 키워드는 자기 자신을 나타낸다. 용도가 2가지로 나뉘는데,

① this.변수/함수명 → 자기자신이 가진 변수 혹은 함수를 가져온다. 객체의 인스턴스 변수 or 함수를 호출하는 함수

② this 함수 this(); 클래스 내에 매개변수에 맞는 생성자를 호출한다. 즉 생성자 호출 함수

 this 키워드는 개발자가 붙여주기도 하지만, 자바 컴파일러가 알아서 붙여주기도 한다. this 키워드는 생성자나 세터(setter)함수에서 인스턴스 변수의 값을 재할당 할때 인스턴스 변수에 접근하기 위해 사용하거나, return 값으로 인스턴스를 반환할 때 retrun this; 등등 호출한 객체가 자신의 인스턴스 멤버를 반환할 때 사용한다.

그니까 자기자신을 나타내는 여러가지의 경우에 사용한다.


3. String 클래스

 

String은 자바가 정의한 문자열을 나타내는 클래스이다. 연속된 문자(char)의 집합이며, 문자 집합 메모리 공간을 가지고 있어서 문자열이 할당되면 메모리 공간에 집어넣고 그 첫주소를 반환한다. 문자열의 끝에는 끝을 나타내는 NULL값으로 채워준다.

String 자료형은 대문자로 시작하므로 참조형 변수임을 알 수 있다. String형 변수에는 문자열이 저장된 공간의 주소값이 반환된다.

String의 특성을 알아보기 위해, 먼저 아래의 예제를 보자.

 

 

class Lecture12{
	public static void main(String[] args) {
                       String str1 = "Simple String";
                       String str2 = "Simple String";
                     
                       String str3 = new String("Simple String");
                       String str4 = new String("Simple String");
                      
                       if(str1 == str2)    //변수에 저장되어 있는 첫 주소값들의 비교
                                  System.out.println("str1과 str2는 동일 인스턴스 참조");   //주소가 같다.
                       else
                                  System.out.println("str1과 str2는 다른 인스턴스 참조");

                       if(str3 == str4)
                                  System.out.println("str3과 str4는 동일 인스턴스 참조");
                       else
                                  System.out.println("str3과 str4는 다른 인스턴스 참조");   //주소가 다르다.
                      
	}
}

<결과>
str1과 str2는 동일 인스턴스 참조
str3과 str4는 다른 인스턴스 참조

 

코드와 결과를 보면, str1과 str2는 같은 주소값을 가지는 것을, 그리고 str3과 str4는 다른 주소값을 가지는 것을 알 수 있다.

str1과 str2에 할당되고 있는 것은 문자열 리터럴(상수)이다. 왜냐하면 우리는 코드를 수정하면서 할당하는 값을 바꿀 수는 있겠지만, 이미 할당 되고 난 후에는 다른 추가 코드를 통해 중간수정을 할 수 없다. 그래서 String 인스턴스는 immutable(변경이 불가능한) 인스턴스라고도 한다.

리터럴을 비롯한 상수들은 상수 풀(constant pool)이라는 메모리 공간에 저장된다. 참고로 상수 풀은 Method 영역 내에 있다. 상수 풀에는 리터럴 값이 하나만 저장된다. 메모리를 절약하기 위함이다. 어차피 상수는 정해져있는 값이므로 수정할 필요가 없을 때 선언하는 것이니까 따로 공간을 두어 한번만 저장하는 것이다.

따라서 str1과 str2에 중복 할당되고 있는 문자열 상수는 상수 풀 내의 한 메모리 공간에 저장되어 있고, 그 곳에서 반환하고 있는 주소값을 참조한다. 즉, 문자열 내용이 일치하는 문자열 상수가 저장된 공간을 str1과 str2이 같이 참조하고 있다.

반면 str3과 str4는 각각 String 객체를 새롭게 생성하고 있으며, String 인스턴스 생성자를 초기화할 값으로 문자열 "Simple String"을 넘겨주고 있다. 따라서 str3과 str4는 각각의 인스턴스 주소를 참조한다.

 

그니까, "String"이든, new String("String")이든 둘 다 인스턴스가 만들어지고 그 인스턴스의 주소값을 가리킨다는 거시다. 위치한 데이터 영역만 다를 뿐!

 

결론 : 참조형 변수 str1, str2, str3, str4는 반환된 주소를 참조하고 있으며, 주소가 가리키는 데이터 영역이 다르기 때문에 위와 같은 결과가 출력된 것이다.

 


 

+ 한편, 1.5버전 자바부터는 switch()문에서 매개변수로 string을 사용할 수 있다.

 

class Lecture12{
	public static void main(String[] args) {
                       String str = "two";
                                 
                       switch(str) {
                       case "one":
                                  System.out.println("one");
                                  break;
                      
                       case "two":
                                  System.out.println("two");
                                  break;
                      
                       default:
                                  System.out.println("default");
                                  break;
                      }
           }
}

 

case 는 위치를 표시해주는 레이블이고, 숫자가 들어가야한다. 그런데 어떻게 문자열이 저 자리에 들어갈 수 있을까?

그 이유는 String형 변수에는 4바이트 짜리 주소값이 저장되기 때문이다. 따라서 String형의 바이트 크기가 4 바이트다. 고로, 주소값을 가지고 정수처럼 처리할 수 있다.


4. String 클래스의 Method

String 클래스의 Method를 몇 개 소개하고자 한다.

 

3번의 내용에서, "String"이든, new String("String")이든 둘 다 인스턴스가 만들어지고 그 인스턴스의 주소값을 가리킨다는 거시다. 라고 했다. 따라서 함수를 사용할 때도, "String".함수명 으로 접근하든 객체명.함수명 으로 접근하든 다 사용이 가능하고 똑같다!

 

① public String concat(String str){ ... }

사용법 - str1.concat(str2);

설명 - str1과 str2를 합친 문자열 결과를 반환한다.

비고 - str1.concat(str2).concat(str3). ... 처럼 연속 호출이 가능하다.

 

② public String substring(int start) { ... }

사용법 - str1.substring(1);

설명 - 문자열 인덱스 번호 중 1번 이후부터 반환한다. (예) str1="hello"일 때, str1(1);  == ello 반환

비고 - 오버로딩 된 함수가 있다.

 

public String substring(int start, int end) { ... }

사용법 - str1.substring(1, 3);

설명 - 인덱스 번호 1번부터 3번 이전까지 반환한다. 1번부터 2번까지를 반환한다는 뜻이다. (예) 위의 예시를 적용 : str1(1,3); == el 반환

 

③ public boolean equals(Object o) { ... }

사용법 - str1.equals(str2);

설명 - str1과 str2의 문자열 내용이 같은 지 확인한다.

 

④ public String toString(){ ... }

사용법 - arr.toString();

설명 - 변수가 가지고 있는 String을 리턴함. 즉 주소값이 아니라 할당된 문자열을 반환한다. 이 메소드는 클래스 안에 지정해주면, 해당 클래스로 접근하고자 할 때 자동으로 스스로 호출한다.

< 예제 코드 5.27 추가 >

class Box{
	private String conts;
	
	Box(String cont){
		this.conts = cont;
	}
	
	public String toString () {	
	//String 을 반환하는 함수 toString 오버라이딩. 이 함수를 선언해두면 자동으로 발동된다.
	//이 함수를 지우게 되면 System 출력 함수는 주소값을 출력된다.
		return conts;
	}
}

class Test12{
   public static void main(String[] args) {
	   Box[] ar = new Box[3];
	   
	   ar [0] = new Box("First");
	   ar [1] = new Box("Second");
	   ar [2] = new Box("Third");
	   System.out.println(ar [0]);
	   System.out.println(ar [1]);
	   System.out.println(ar [2]);
   }
}

 

< 3번과 비슷한 함수 >

3-1. public int compareTo(String str) { ... }

사용법 - str1.compareTo(str2);

설명 - 문자열 내용들의 사전 상 순서 비교. 대소문자 반영. str1이 str2보다 앞서면 0보다 작은 값을 / str1이 str2와 순서가 같으면(문자열이 일치하면) 0을 / str1이 str2보다 순서가 뒤처지면 0보다 큰 값을 반환한다.

 

3-2. public int compareToIgnoreCase(String str) { ... }

사용법 - str1.compareToIgnoreCase(str2);

설명 - 3-1과 똑같다. 다만 대소문자를 반영하지 않는다.

 


5. StringBuilder 클래스

 

String 인스턴스는 추가 코드를 통한 값 변경이 불가능하다. 수정 유지해야 하는 문자열 변수형이 필요하다면 이 클래스를 이용하자!

이 클래스는 문자열을 저장하는 메모리 공간을 가진다. 공간의 크기는 생성자를 호출 할 때 매개변수로 정해줄 수 있다.

new StringBuilder();는 16개의 문자를 저장할 수 있고,

new StringBuilder(int size);는 size만큼의 문자를 저장할 수 있으며,

new StringBuilder(String str);은 문자열 + 문자 16개를 저장할 수 있는 공간이 설정된다.

그리고 이 클래스 안에는 문자열을 수정변경할 수 있는 메소드가 정의되어 있다.

 

① public StringBuilder append(int i or 기본 자료형...) { ... }

사용법 - str1.append(10);

설명 - str1에 저장된 문자열 뒤에 문자 10을 추가한다.

 

② public StringBuilder delete(int start, int end) { ... }

사용법 - str1.delete(0, 2);

설명 - start 인덱스부터 end 이전까지의 문자들을 제거한다.

 

③ public StringBuilder insert(int offset, String str) { ... }

사용법 - str1.insert(0, str2);

설명 - str1의 문자열 인덱스 중 0번에 str2 문자열을 끼워넣는다. 그러면 해당 인덱스 위치 뒤의 나머지 문자들은 밀리게 된다.

 

④ public StringBuilder replace(int start, int end, String str) { ... }

사용법 - str1,replace(0,2,str2);

설명 - start 인덱스(0) 부터 end(2) 이전까지의 내용을 str2로 대체한다.

 

⑤ public StringBuilder reverse() { ... }

사용법 - str1.reverse();

설명 - str1의 문자열 내용을 거꾸로 뒤집는다.

 

⑥ public StringBuilder substring(int start, int end) { ... }

사용법 - str1.substring(0,2);

설명 - str1의 문자열 중 start 인덱스부터 end 이전까지의 내용을 반환한다.

 

⑦ public StringBuilder toString() { ... }

사용법 - StringBuilder str5 = str1.toString();

설명 - str1에 저장된 문자열 내용을 담은 String 인스턴스를 복사 생성하고 주소값을 str5 변수에 반환한다.

 

+ ) String형 함수나, StringBuilder형 함수나 참조값을 반환하는 반환형을 가지면 주소값을 반환한다는 점을 유념하도록 하자. 또한, 함수를 사용하려면 클래스 형도 맞춰줘야 한다는 사실!

+ ) String 클래스 함수와 StringBuilder 클래스 함수의 내용이 같은 것도 있지만, 다른 것도 있다. 따라서 반환하는 클래스 형에 따라 잘 맞춰서 사용해줘야한다. 예를 들어 String 객체를 가지고 StringBuilder 함수를 사용하게 되면 이렇게 오류가 뜬다. 

"이 함수는 String 클래스에 정의되어 있지 않습니다."

728x90
반응형

'study_java > java_수강정리(~10.29)' 카테고리의 다른 글

[JAVA]14일차  (1) 2020.05.31
[JAVA]13일차  (0) 2020.05.27
[JAVA]11일차  (0) 2020.05.25
[JAVA]10일차  (0) 2020.05.22
[JAVA]9일차  (1) 2020.05.21