열혈 Java 11차시

미래·2022년 11월 27일
0

열혈 Java

목록 보기
11/12

11-1 메소드 오버로딩

  • 메소드 호출할때 참조하는 정보 1. 메소드이름 2. 매개변수정보
  • 메소드 오버로딩이란 메소드의 이름이 같은 것을 허용하는 것
  • 매개변수 목록의 자료형이 다르거나 또는 수가 다르면 성립
  • 메소드의 이름과 더불어 매개변수 정보까지 참조하기 때문에 가능하다
  • 반환형만 다른 경우는 오버로딩이 성립하지 않는다
  • 오버로딩을 피해야하는 애매한 상황이 존재한다 이런 모호한 상황 만들지 말자
class AAA {
	void s(int p1, int p2) {
     	...
    }
    void s(int p1, double p2) {
    	...
    }
}
AAA inst = new AAA();
inst s(7,'k'); 
// char는 double보다 int와 가까우므로 s(int p1, int p2)가 호출된다
// 무슨 메소드가 호출될지 모호하므로 인자로 전달되기 전 (int)로 강제 형변환을 해주는 것이 옳다
// 이런 모호한 상황을 애초에 만들지 말자
  • 생성자의 오버로딩을 통해 생성되는 인스턴스의 유형을 구분할 수 있다
  • ex) 여권을 소지한 사람과 여권이 없는 사람 , 운전 면허가 있는 사람과 운전 면허가 없는 사람
  • 키워드 this를 이용한 다른 생성자 호출
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.(rnum, 0);
}
  • rnum과 0을 인자로 받는 다른 생성자를 호출한다 중복 코드를 줄이는 효과!
  • 키워드 this를 이용한 인스턴스 변수 접근
class SimpleBox() {
	private int data;
    
    SimpleBox(int data) {
    	this.data = data;
    }
}
  • this.인스턴스변수는 어느 위치에서든 인스턴스 변수를 의미한다

11-2 String 클래스

  • String 인스턴스 생성하는 두 가지 방법의 차이점
  • 우리가 쓰는 String은 자바가 제공하는 String 클래스의 인스턴스
  • 둘다 String 인스턴스가 생성되고 참조값이 반환된다
String st1 = new String("apple");
String st2 = "apple";
  • String 인스턴스와 println 메소드
void println() {...};
void println(int i) {...};
void println(String str) {...};
  • println 메소드가 다양한 인자를 받을 수 있는 이유는 메소드 오버로딩
  • 문자열 생성 방법 두 가지의 차이점
class ImmutableString {
	public static void main(String[] args) {
    	String str1 = "Simple String";
        String str2 = "Simple String";
        
        String str3 = new String ("Simple String");
        String str3 = new String ("Simple String");
    }   
}
  • str1과 str2은 동일한 인스턴스를 참조한다
  • new 쓰면 무조건 새 인스턴스 생성됨
  • str3 str4는 서로 다른 인스턴스 참조
  • String 인스턴스 immutable 인스턴스이다
  • 따라서 생성되는 인스턴스의 수를 최소화한다
  • 한 번 결정되면 변경 허용하지 않는 인스턴스라는 뜻
public static void main(String[args]) {
	String str1 = "Simple String";
    String str2 = str1;
}
  • 인스턴스의 데이터 변경이 애당초 안되니까
    하나의 인스턴스를 여러 변수가 참조할 수 있다
public static void main(String[args]) {
	String str1 = "Simple String";
    String str2 = new String("Simple String");
}
  • 이런 특성이 있으므로 new로 새로운 인스턴스를 만들 필요가 없다
  • String 인스턴스 기반 switch문 구성
public static void main(String[args]) {
	String str = "two";
    switch(str) {
    case "one":
    	...
        break;
    case "two":
    	...
        break;
    }
    default:
    	...
    }
}

11-3 String 클래스의 메소드

  • 문자열 연결
class StringConcat {
	public static void main(String[args]) {
    	String str1 = "Coffee";
        String str2 = "Bread";
        String str3 = str1.concat(str2);
        String str4 = "Fresh".concat(str3);
    }
}
  • concat 쓰면 새로운 인스턴스가 생성된다
  • 문자열 일부 추출
String str = "abcdefg";
str.substring(2); // "cdefg"
str.substring(2, 4); // "cd"
  • substring 쓰면 새로운 인스턴스가 생성된다
  • 문자열의 내용 비교
  • '=='은 참조값을 비교하는 연산
  • 두 인스턴스가 지니고 있는 문자열의 내용이 같은지 비교한다
public static void main(String[args]) {
	String st1 = "Lexicographically";
    String st2 = "lexicographically";
    int cmp;
    
    if(st1.equls(st2))
    	...
    else
    	...
    
    cmp = st1.compareTo(st2);
    
    if(cmp == 0) // 일치
    	...
    else if(cmp < 0) // 사전의 앞에 위치하는 문자열 : st1
    	...
    else // 사전의 앞에 위치하는 문자열 : st2
    
    if(st1.compareToIgnoreCase(st2) == 0) // 대소비교는 하지 않는다
    	...
    else 
    	...
}
  • 기본자료형 값을 String 인스턴스로
double e = 2.718281;
String se = String.valuOf(e);
  • "2.718281" 문자열을 지닌 String 인스턴스가 생성된다
  • 문자열 대상 +연산과 +=연산
System.out.println("funny"+camp");

위의 코드를 컴파일러가 아래 코드로 바꿔준다

System.out.println("funny".concat("camp"));
String str = "funny";
str += "camp" 
  • str += "camp";을 컴파일러가 str.concat("camp"); 로 바꾼다
  • 문자열과 기본자료형의 +연산
  • string str = "age" + 17;이 아니라
  • string str = "age".concat(String.valueOf("17"));
  • concat은 이어서 호출 가능
  • String str = "AB".concat("CD").concat("EF");
  • 문자열 결합 최적화
  • 문자열 결합의 최적화를 하지 않으면 인스턴스가 엄청 늘어난다
String birth = "<>"+7+"."+"16";
  • 이 경우 인스턴스가 6개 더 생긴다
  • 따라서 다음과 같이 최적화 한다
String birth = (new StringBuilder("<>").append(7).append('.').append(16)).toString();
  • 처음에 "<양>" 인스턴스가 만들어지고 그 인스턴스에서 결합이 이루어진다
  • toString()을 호출 했을 때, 최종적으로 결합된 문자열이 담긴 새 인스턴스가 만들어지고
  • 변수는 새 인스턴스를 참조하게 된다
  • StringBuilder로 만들어지는 인스턴스는 not immutable이다
  • append(), delete(), replace(), substring() 이런 메소드들을 사용할 수 있다
  • StringBuffer는 StringBuilder와 기능적으로는 완전히 동일하다
  • StringBuffer는 쓰레드에 안전하다
  • 쓰레드 안전이 불필요한 상황에서 StringBuffer를 쓰면 성능이 저하될 수 있다

0개의 댓글