study/Java

[sist] 2024.01.11_Java : call by reference, this, 객체화, String(문자열)

듀2 2024. 2. 3. 17:01

* 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("문자열");
728x90