가독성이 많이 떨어져도 이해바랍니다..
메소드 오버로딩(Method Overloading)
- 메소드를 호출 할 때 참조하는 정보
> 메소드의 이름
> 메소드의 매개변수 정보
- 메소드 오버로딩의 조건
> 매개변수 선언이 달라야 한다.(매개변수의 수 또는 형(type))
> 반환형이 다른 경우에는 메소드 오버로딩이 성립하지 않는다. (반환형은 호출할 메소드를 서택하는데 있어서
의 판단 기준이 아니기 때문이다.
- 생성자도 오버로딩의 대상이 된다.
> 매개변수의 선언이 다르면 둘 이상 정의가 가능하다.
- 키워드 this를 이용한 다른 생성자의 호출
Person(int rnum, int pnum) {
regiNum = rnum;
passNum = pnum;
}
Person(int rnum){
this(rnum, 0); // rnum과 0을 인자로 받는 다른 생성자를 호출
}
위에서 사용된 this는 ‘오버로딩 된 다른 생성자’를 의미한다. 즉 rnum과 0을 인자로 받는 다른 생성자의 호출을 의미한다. 위와 같이 생성자를 정의하면 이 생성자는 초기화할 값을 전달받는 역할만 하고, 실제 초기화는 첫 번째로 정의된 생성자를 통해서 진행하는 형태가 된다. 이와 같이 this를 이용한 생성자의 정의를 통해 중복된 코드의 수를 줄이는 효과를 얻을 수 있다.
- 키워드 this를 이용한 인스턴스 변수의 접근
class SimpleBox{
private int data;
SimpleBox(int data){
this.data = data; // 매개변수 data의 같을 인스턴스 변수 data에 저장
}
this를 사용하여 인스턴스 변수에 접근하는 것은 많이 쓰인다.
String 클래스
- String 클래스의 목적은 문자열 표현에 있다.
- String 클래스의 인스턴스 생성
> String str = new String(“Simple String”);
> String str = “Simple String”; (보편적인 사용방법)
- new를 통한 인스턴스 생성방법과 “ ” 를 통한 인스턴스 생성방법의 차이점
> String 인스턴스는 Immutable(변경할 수 없는) 인스턴스이다. 즉, 인스턴스가 갖는 문자 열 내용을 변경할
수 없는 것이다.
> String str1 = “Simple String”;
String str2 = “Simple String”;
String str3 = new String(“Simple String”);
Stirng str4 = new String(“Simple String”);
일 때 str1과 str2는 동일한 인스턴스를 참조하고 3과 4는 서로 다른 인스턴스를 참조한다.
String 인스턴스를 이용한 switch문의 구성
- 각 case 영역을 설명하는 문장을 구성할 수 있다. (별로 이렇게 설정하진 않는다)
String 클래스의 메소드
- 문자열 연결시키기 : Concatenating / .concat
> String1.concat(String2); // String1과 String2을 연결한 결과를 반환
> concat 메소드는 이어서 호출 가능하다.
- 문자열의 일부를 추출하기 : Substring / substring(인덱스 숫자)
> String str = “abcdefg”;
str.substring(2); // 인덱스 2 이후의 내용으로 이뤄진 문자열 “cdefg” 반환
자바는 맨 앞 문자의 인덱스 값이 0이다.
> String str = “abcdefg”;
str.substring(2, 4); // 인덱스 2~3에 위치한 내용의 문자열 반환
주의할 점은 2번째 인자로 전달된 인덱스 4에 위치한 문자는 반한되는 문자열에 포함이 안된다,
- 문자열의 내용 비교 : comparing / .equals / compareTo / compareToIgnoreCase
> String st1 = “ABC”
String st2 = “DEF”
st1.equals(st2) 식으로 쓰는 것(결과는 서로 다르다.)
> 위 클래스에 인스턴스가 생성되었다고 가정하고 int cmp 변수를 추가로 넣어준 후
cmp = st1.compareTo(st2)를 사전순으로 비교한다.
cmp = 0 이면 두 문자열이 일치하고
cmp < 0 이면 사전의 앞에 위치하는 문자는 st1 이고
cmp > 0 이면 사전의 앞에 위치하는 문자는 st2 이다.
> st1.compareToIgnoreCase(st2) == 0 이면 두 문자열은 같다. (대소문자 상관 X)
- 기본 자료형의 값을 문자열로 바꾸기
> static String valueOf(boolean b)
> static String valueOf(char c)
> static String valueOf(double d)
> static String valueOf(float f)
> static String valueOf(int i)
> static String valueOf(long l)
> double e = 2.718281; 일때
String se = String.valueOf(e); 로 사용하면 된다.
기본 자료형의 값을 문자열의 형태로 나타내야 하는 경우가 종종 있다.
- 문자열을 대상으로 하는 + 연산과 += 연산
- 문자열 결합의 최적화 : Optimization of String Concatenation
StringBuilder 클래스
- StringBuilder 클래스는 내부적으로 문자열을 저장하기 위한 메모리 공간을 지닌다.
- 이 메모리 공간은 String 클래스의 메모리 공간과 달리 문자를 추가 및 삭제가 가능하다.
- 수정하면서 유지해야 할 문자열이 있다면 이 클래스에 그 내용을 담아서 관리하는 것이 효율적이다.
- StringBuilder의 대표적인 메소드
append(int i) : 기본 자료형 데이터를 문자열 내용에 추가(오버로딩 되어있음)
> append 메소드가 반환하는 것은 append 메소드가 호출된 인스턴스의 참조 값이다.
StringBuilder stb1 = new StringBuilder(“123”);
StirngBuilder stb2 = stb1.append(45678); 일 때
우리는 stb1 = 123이라고 생각하겠지만, stb2에서 123 에 45678을 추가하였다. append 메소드는 새
로 운 인스턴스를 생성하는 것이 아니라 한 인스턴스의 메소드를 이 어서 호출하기 때문에 stb2와 stb1은
같은 참조값을 가리키게 된다.
delete(int start, int end) : 인덱스 start에서부터 end 이전까지의 내용을 삭제
insert(int offset, String str) : 인덱스 offset의 위치에 str에 전달된 문자열을 추가
replace(int start, int end, String str) : 인덱스 start에서부터 end 이전까지의 내용을 str의 문자열로 대체
reverse() : 저장된 문자열의 내용을 뒤집는다.
substring(int start, int end) : 인덱스 start에서부터 end 이전까지의 내용만 담은 String 인스턴스를 생성 및
반환
String toString() : 저장된 문자열의 내용을 담은 String 인스턴스의 생성 및 반환
콘솔 출력(Console Output)
- System.out.println은 참조 값이 전달되면, 이 값의 인스턴스를 대상으로 toString 메소 드를 호출한다. 그리고
이때 반환되는 문자열을 출력한다.
- 문자열을 조합해서 출력하는 System.out.printf 메소드
> %d 10진수 정수형태의 출력
> %o 8진수 정수형태의 출력
> %x 16진수 정수형태의 출력
> %f 실수의 출력
> %e e 표기법 기반의 실수 출력
> %g 출력의 대상에 따라서 %e 또는 %f 형태의 출력
> %s 문자열 출력
> %c 문자열 출력
System.out.printf(“정수는 %d, 실수는 %f, 문자는 %c”, 12, 24.5, ‘A’)
콘솔 입력(Console Input)
- Scanner 클래스
> 생성자로 전달되는 대상으로부터 데이터를 추출하는 기능을 제공한다.
> Scanner sc = new Scanner(System.in);
> System.in은 키보드를 의미하는 인스턴스의 참조변수이다.
배열(Array)
- 1차원 배열
> 1차원 배열은 타입이 같은 둘 이상의 데이터를 저장할 수 있는 1차원 구조의 메모리 공 간이다.
> 자바에서는 배열도 인스턴스이다.
> int[] ref = new int[5]; // 길이가 5인 int형 1차원 배열의 생성문
> int[] ref // int형 1차원 배열 인스턴스를 참조할 수 있는 ‘참조변수의 선언’
> new int[5] // int형 값 5개를 저장할 수 있는 ‘배열 인스턴스의 생성’
> 인스턴스를 저장할 수 있는 배열의 생성도 가능하다.
> Box[] ar = new Box[5];
> Box 인스턴스 5개를 저장할 수 있는 참조변수의 배열이다. 즉, Box 인스턴스의 생성 과는 관계가 없다.
> 배열을 대상으로 한 값의 저장과 참조
> ar [0] = 7; // 배열 ar의 첫번째 요소에 정수 7 저장
> ar [0] = new Box(“First”); // 배열에 인스턴스 저장
> 배열을 생성과 동시에 초기화하기
> 예시 : int [] arr = new int[] {1, 2, 3};
> 참조변수 선언의 두 가지 방법
> 예시 : int[] ar = new int[3]; // 조금 더 선호하는 방법
> 예시 : int ar[] = new int[3];
> 배열의 참조 값과 메소드
> 배열도 인스턴스이므로 메소드 호출 시 참조 값의 전달이 가능하다.
> public static void main(String[] args){
int[] ar = {1, 2, 3, 4, 5, 6, 7};
int sum = sumOfAry(ar); // 배열의 참조 값 전달
}
static int sumOfAry(int[] ar) {
int sum = 0;
for(int i = 0; i < ar.length; i++){
sum += ar[i];
return sum;
}
> 배열의 초기화와 배열의 복사
> int[] ar = new int[10]; // 배열의 모든 요소 0으로 초기화
> String[] ar = new String[10]; // 배열의 모든 요소 null로 초기화
> public static void fill(int [] a, int val) : 두 번재 인자로 전달된 값으로 배열 초기화
> public static void fill(int [] a, int fromIndex, int toIndex, int val)
> 인덱스 fromIndex ~ (toIndex-1)의 범위까지 val의 값으로 배열 초기화
> public static void arraycopy(배열, 복사할원본위치, 복사대상배열, 복사대상위치, 복사수)
enhanced for문
for(요소 : 배열) {
반복할 문장들
}
예시
for(int e : ar){
System.out.println(e);
}
- 인스턴스 배열을 대상으로 하는 enhanced for문
> Box[] ar = new Box[10];
for(Box e : ar) {
내용내용내용
}