* call by reference
- 주소 전달(주소는 유일)
- method의 매개변수가 참조형을 가진다면 주소(유일: 어떤 method 안에서 사용하더라도 해당 객체를 사용하게 된다.)가 그대로 전달된다.
public class CallByReference{
int i;
int j;
public void swap(CallByReference cbr){
int temp = 0;
temp = cbr.i;
cbr.i = cbr.j;
cbr.j = temp;
System.out.println("swap 안 i: " + cbr.i + ", j: " + cbr.j); // 1, 2024
}
public static void main(String[] args){
CallByReference cbr = new CallByReference();
cbr.i = 2024;
cbr.j = 1;
System.out.println("swap 전 i: " + cbr.i + ", j: " + cbr.j); // 2024, 1
cbr.swap(cbr);
System.out.println("swap 후 i: " + cbr.i + ", j: " + cbr.j); // 1, 2024
}
}

public class Test{
int i;
public void setI(int i){
i = i;
} // setI
public static void main(String[] args){
Test t = new Test();
t.setI(2024);
System.out.println(t.i); // 2024
} // main
} // class

* this
- 키워드 형식, method 형식으로 사용할 수 있다.
* this의 키워드 형식
- method를 호출하는 instance(객체)의 주소로 변환하는 일.
- 객체가 생성된 후 호출되는 instance 영역에서만 사용할 수 있다. (static 영역에서는 사용 불가)
- instance 변수와 parameter가 같은 이름을 가질 때, 두 변수를 식별하기 위해 사용.
- 상속 관계에서는 자식의 변수나 method를 식별하기 위해 사용.
사용법)
- 변수 사용
this.변수명
this.변수명=값;
- method 호출(상속관계)
this.method();
class Test{
int i;
public void setI(int i){
this.i = i; // method를 호출한 객체의 주소로 변환
}
public static void main(String[] args){
Test t = new Test();
t.setI(100);
Test t2 = new Test();
t2.setI(100);
}
}
* this의 method 형식
- 하나의 클래스 안에서 다른 생성자를 호출할 때 사용.
- 생성자의 첫 번째 줄에서만 사용 가능.
- 재귀호출 가능성이 있다면 error 발생.
문법)
this();
this(값);
public class Test{
public Test(){
this(10); // 하나의 객체를 생성하여 여러 생성자를 호출한다. => 객체가 하나만 생성된다.
}
public Test(int i){
}
public static void main(String[] args){
new Test();
}
}
public class Test{
public Test(){
new Test(10){ // 여러 개의 객체를 생성하여 여러 생성자를 호출한다. => 객체가 여러 개 생성된다.
}
public Test(int i){
}
public static void main(String[] args){
new Test();
}
}
* 객체화
- 클래스에서 정의된 기능을 사용하기 위해 메모리(heap 메모리)에 올려놓는 것.
- 5가지 문법)
1) 객체명으로 변수나 method를 사용하기 위한 객체화
클래스명 객체명 = new 생성자();
2) 객체명으로 변수나 method를 사용하지 않는 객체화
new 생성자();
3) 객체 생성 후 하나의 method만 호출하는 객체화
new 생성자().method명;
4) is a 관계의 객체화(객체 다형성 사용)
부모클래스명(또는 인터페이스명) 객체명 = new 자식클래스의생성자();
5) anonymous inner class의 객체화 - 객체를 arguments로 사용할 때
호출할 method(new 부모클래스명(또는 인터페이스명)(){
자식클래스에서 정의할 method()들
});
* String(문자열)
- "묶여진" 여러 문자 들.
- 문자열은 문자열 저장소(String literal)에 유일하게 생성된다.
- 문자열 저장소에 저장된 문자열의 시작 주소를 저장하기 위한 데이터 형으로 java.lang.String 클래스를 제공한다.

- 참조형 데이터 형.
사용법)
- 기본형 형식으로 사용) new 를 사용하지 않음.
String str = "문자열";
- 참조형 형식으로 사용) new를 사용.
String str = new String("문자열");
public static void main(String[] args){
String str = "ABC";
String str1 = new String("ABC");
}

* 문자열의 비교
- 같은지만 비교 가능.
- == 연산자) 기본형 데이터 형: 값이 같은지? / 참조형 데이터 형: 주소가 같은지?
기본형 형식)
str == "ABC" // 200번지와 200번지가 같은지? true
참조형 형식)
str1 == "ABC" // 10번지와 200번지가 같은지? false
- equals method의 사용) String 객체 안의 값을 찾아가서 주소를 비교

기본형 형식)
str.equals("ABC") // 200번지와 200번지가 같은지? true
참조형 형식)
str1.equals("ABC") // heap안에 저장된 200번지와 200번지가 같은지? true
* java.lang.String 클래스에서 제공하는 기능
String str = "heLlo";
- 문자열의 길이
int leng = str.length();
// 반환형과 일치하는 데이터형으로 변수를 선언하고, method에서 return되는 값을 받아서 사용.

- 대문자 얻기
String temp = str.toUpperCase(); // HELLO
- 소문자 얻기
String temp = str.toLowerCase(); // hello
- 특정 인덱스의 문자 얻기
char c = str.charAt(인덱스);
// 문자 L을 얻으려면
char c = str.charAt(2);
- 특정 문자열의 인덱스(L -> R)
int index = str.indexOf("문자열");
// "L"의 인덱스인 2를 얻기
int index = str.indexOf("L");
- 문자열 안에 "eLl"이 존재하는지?
int ind = str.indexOf("eLl"); // eLl이 존재하므로 문자열의 시작 인덱스인 1을 얻는다.
int ind = str.indexOf("eLT"); // eLT는 존재하지 않으므로 -1을 얻는다.
- 특정 문자열의 인덱스(R -> L)
int ind = str.lastIndexOf("문자열");
- 문자열 합치기
str.concat("합칠 문자열");
String str = "abc";
String str1 = str.concat("DEF");
// String str1 = str + "DEF";은 concat method 사용보다 객체가 더 많이 생성
- 자식 문자열(substring) 얻기
String str = "ABCDEFG"; // Super string(부모 문자열)
//01234567 -> String index, 눈에 보이지 않는 문자열의 끝 기호가 들어있다.
System.out.println(str); // String literal에 시작주소만 입력
str.substring(시작인덱스, 끝인덱스+1)
// CDE를 자르자
String temp = str.substring(2, 4); // CD
String temp = str.substring(2, 5); // CDE
// 시작인덱스만 설정하면 문자열의 끝까지 잘라낸다.
str.substring(시작인덱스);
- 문자열이 같은지 비교
boolean flag = str.equals("비교할 문자열");
- 특정 문자열로 시작했는지?
String str = "java는 완벽한 OOP 언어";
boolean flag = str.startsWith("java"); // true
boolean flag = str.startsWith("Java"); // false
- 특정 문자열로 끝났는지?
String addr = "서울시 강남구 역삼동";
boolean flag = addr.endsWith("동"); // true
- 특정 문자열을 포함하는지?
boolean flag = str.contains("문자열");