[Java] 2020.11.04. day_11 기본형데이터형, 참조형데이터형, this, String class, String class method

2020. 11. 4. 19:32Web_Back-end/Java SE

◎ this

  this
method형식
추후에 배울 예정 this(); 기본생성자를 호출
this(값); 매개변수 있는 생성자를 호출
직접호출불가
new를 사용해서만 호출가능(객체화를 할 때만 호출된다)
자신클래스의 다른 생성자를 호출할 때 사용

생성자의 첫 번째 줄에서만 사용가능
재귀호출에 상황이 발생하면 error
keyword형식
  this.변수명
this.method명();
this는 생선된 객체의 주소를 가지고 있는 키워드다
(Test t=new Test();    t를 this로 바꿔서 사용할 수 있다)
생성된 객체의 instance 변수나 instance method를 호출할 때 사용
instance 영역에서만 사용가능 (객체명. method() )
static영역에서는 사용불가 (static 영역은 instacne 영역보다 먼저 실행된다)
class Test{
  public Test(){
  this(11);
  //객체는 생성되지 않고 다른 생성자를 호출
  //객체가 생성될 때 가져야 할 기본 값
  //객체가 생성될 때 처리되어야할 코드
  }

  public Test(int i){
  //객체가 생성될 때 가져야할 기본값
  //객체가 생성될 때 처리되어야할 코드
  }
}

  instance화 (객체화) : 클래스의 인스턴스 변수를 heap 메모리에 적재하는 일
객체를 생성한 후 여러번의 method호출을 해야할 때
클래스명 객체명=new 생성자();
객체를 생성한 후 method를 호출할 필요가 없을 때
(객체를 이름으로 사용할 필요가 없음)
new 생성자();

◎ method 호출

  method 호출
Call By Value method를 호출할 때 매개변수가 기본형 데이터형이면 값이 복사되어 넘어간다
  class Test{
   public static void swap(int i, int j){
      int temp=0;
      temp=i;
      i=j;
      j=temp;
      System.out.println("swap method i =" + i + ", j = " + j );
   }

   public static void main(String[] args){
      int i=11;
      int j=4;
      System.out.println("i =" + i + ", j= " + j );
      swap(i,j);
      System.out.println("i =" + i + ", j= " + j );

   }//main
}//class
Call By Reference method를 호출할 때 매개변수가 참조형 데이터형이면 주소가 그대로 전달된다 //주소는 유일하다
(참조형 데이터형:class,String,array)
  class Test{
   int i, j; //instance 변수 
   public void swap( Test t ){
       int temp=0;
       temp=t.i;
       t.i=t.j;
       t.j=temp;
       System.out.println(“swap t.i=“+ t.i+”, t.j=“+ t.j);   //t.i=200, t.j=100
   }

   public static void main(String[] args){ 
      Test t=new Test();
      t.i=100;
      t.j=200;
      System.out.println(“t.i=“ +t.i+”, t.j=“+t.j);   //t.i=100;, t.j=200
      t.swap( t ); //주소(유일)가 전달 
      System.out.println(“t.i=“ +t.i+”, t.j=“+t.j);   //t.i=200, t.j=100
   }
}

○ this keyword 사용

class Test{
   int i;

   public void setI(int i){
         this .i=i;   //heap에 i에 static i를 할당
                      //this는 method를 호출한 객체의 주소로 변경
   }
  
   public static void mein(String[] args){
         Test t=new Test();
         t.setI(1000, t);
         System.out.println(t.i);
   }
}

 

○ 문자열(문자가 나열된 것)형

  • 같은 문자열은 문자열저장소에 하나만 생성된다
  • 문자열저장소에 저장하기 위해 "를 사용한다
  • 문자열저장소의 주소는 java.lang.String 클래스를 사용하여 저장하고, 사용할 수 있다
  • 문자열을 다루기 위한 클래스가 4개 지원
    1. java.lang.String
    2. java.lang.StringBuffer
    3. java.lang.StringBuilder
    4. java.util.StringTokenizer
  • 사용법 "안녕"
    • java.lang.String 을 사용하여 문자열을 저장할 수 있다
    • String 클래스 : 참조형 데이터형이지만 기본형 형식으로 사용할 수 있다
      • 기본형 형식의 사용 : new를 사용하지 않는 방법
      • String s="문자열";
      • 참조형 형식의 사용 : new를 사용하는 방법
      • String s=new Strin("문자열");
    • 문자열의 같은지에 대한 비교
      • 기본형 데이터형에 == 을 사용하면 이 같은지 비교한다
      • 참조형 데이터형에 == 을 사용하면 주소가 같은지 비교한다

▼ 기본형 데이터형, 참조형 데이터형 예시

public class UseString {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String str = "ABCD"; //기본형 형식의 사용
		String str1 = new String("ABCD"); //참조형 형식의 사용
		
		//문자열 비교 ==에 대한 비교
		
		//1. 기본형형식은 변수에 문자열 저장소의 주소를 그대로 저장
		System.out.println("기본형 형식 == 비교");
		if(str == "ABCD") {
			System.out.println("같다");
		}
		else {
			System.out.println("다르다");
		}
			
		System.out.println("참조형 형식 == 비교");
		if(str1 == "ABCD") {
			System.out.println("같다");
		}
		else {
			System.out.println("다르다");
		}
    }//main
}//class

예시 콘솔창


◎ String class 사용법

 

  String class 사용법
1. 생성자를 확인
  String str = "ABCD"; //기본형형식의 사용
String mail = new String("jjiny-bbany@tistory.com"); //참조형형식의 사용
2. method호출하여 필요한 일을 수행
2-1 문자열의 길이
한글,영어,특수문자,숫자,공백
1글자로 계산
: length();
int leng = str.length();   //4
int leng = mail.length(); //23
2-2 문자열의 내용을 모두 대문자로 변환
toUpperCase();
str="AbcDeF"'
String temp = str.toUpperCase();   //"ABCDEF"
2-3 문자열의 내용을 모두 소문자로 변환
toLowerCase();
str="AbcDdF"
String temp = str.toLowerCase();   //'abcdef"
2-4 문자열에 인덱스 얻기(String Index)
: 모든 문자열은 인덱스를 가지고 있다

//찾는방향 L→R
: indexOf("찾을문자열"); 
//찾는방향 R→L
: lastIndexOf("찾을문자열");
String str = "AbcdEF"
[0] = "A", [1] = "b", ... , [5] = "F"  ==> String Index

int index = str.indexOf("c");   // 2
int index = str.indexOf("K");   // -1  찾는 문자열이 없다면 -1이 반환
2-5 인덱스 해당하는 문자 하나 얻기
: charAt(인덱스);
String str="AbcdEF";
char ch=str.charAt(2);  // c
2-6 자식 문자열 얻기

: substring(시작인덱스, 끝인덱스+1)
String str = "식 .  "; 
//   : 모든문자열의 끝에는 문자열의 끝임을 알려주는 문자가 숨어있다
//가장 마지막 문자 자리에 문자열의 끝기호가 들어간다 
//끝 인덱스에 해당하는 문자가 잘려지지 않는다
//substring(시작인덱스, 끝인덱스+1)

String temp = str.substring(4,7);

System.out.println(str); //맛있게
2-7 문자열 붙이기

: concat("문자열");
String temp = "오늘은";
String temp1 = temp + "수요일"; //오늘은 수요일
String temp1 = temp.concat("수요일"); //오늘은 수요일
2-8 문자열의 앞뒤 공백 자르
: trim()
String temp = "    ja  va    ";
String temp1 = temp.trim();

System.out.println(temp1);   //ja  va  : 앞뒤 공백만 잘라진다
2-9 문자열이 완전히 같은지 비교
: equals("비교할문자열")
String temp = "ABC";
boolean flag = temp.equals("비교할문자열");
2-10 입력한 문자열로 시작했는지
: startsWith("문자열")
String temp = "서울시 마포구";
boolean flag = temp.startsWith("서울시");  //true
2-11 입력한 문자열로 끝나는지
: endsWith("문자열")
String temp = "서울시 성북구 안암동";
boolean flag = temp.endsWith("동")
2-12 문자열을 포함하고 있는지
: contains("문자열")
String temp = "오늘은 목요일입니다.";
boolean flag = temp.contains("요일");
2-13 문자열이 비어있는지
: isEmpty()
String str = null; //초기화 ==> method를 호출할 수 없다
String str = "";  //초기화 ==> method를 호출할 수 있다

null인지 비교
if(str! == null){

}

empty인지 비교
if(!str.isEmpty){

}
2-14 기본형데이터형을 String에 저장
: valueOf()
int i = 5;
//String s = i; // error
String s = i + " ";
String s = String.valueOf( i ); 
// static method : 객체가 가지고있는 값으로 일을 처리하지 않고, 입력된 값으로만 일을 처리

▼ String class의 method 예제 2-1 ~ 2-10 ▼

package day1104;

/**
 * 개발자가 편하게 사용할 수 있도록 java.lang 패키지의 모등 클래스를 import 처리해준다<br>
 * (import없이 java.lang 패키지의 클래스를 사용할 수 있다)<br>
 * java.lang패키지에 존재하는 클래스의 이름과 동일한 이름으로 클래스를 생성하면<br>
 * 내가만든 클래스를 먼저 사용하게된다<br>
 * 해결방법 : java.lang 패키지(외부패키지)의 클래스를 full path로 설정하여 사용한다<br>
 * full path : 패키지명.클래스명 <br>
 * 
 * 가급적이면 외부패키지에서 제공하는 클래스 이름과 다르게 설정할것.
 * @author owner
 */
public class UseString {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String str = "ABCD"; //기본형 형식의 사용
		String str1 = new String("ABCD"); //참조형 형식의 사용
		
		//문자열 비교 ==에 대한 비교
		
		//1. 기본형형식은 변수에 문자열 저장소의 주소를 그대로 저장
		System.out.println("기본형 형식 == 비교");
		if(str == "ABCD") {
			System.out.println("같다");
		}
		else {
			System.out.println("다르다");
		}
			
		System.out.println("참조형 형식 == 비교");
		if(str1 == "ABCD") {
			System.out.println("같다");
		}
		else {
			System.out.println("다르다");
		}
		
		//2. " 문자열은 String class에서 제공하는 모든 method를 호출(사용)할 수있다
		
		//2-1 문자열의 길이 계산
		System.out.println("----2-1 문자열의 길이 계산----");
		int leng = str.length();
		System.out.println(str + "의 길이: " + leng);
		System.out.println("안녕하세요".length());
		
		String temp="Temp";
		String mail="Mail@mail.com";
		System.out.println(mail + "의 길이 " + mail.length());
		
		temp = "test@test.com";
		
		//2-2 문자열의 내용을 모두 대문자로 변환 : toUpperCase()
		System.out.println("----2-2 문자열 대문자로 변환----");
		String str2 = "AbcDef";
		temp = str.toUpperCase();
		System.out.println(str2 + "를 대문자로 변환: " + temp);
		
		//2-3 문자열의 내용을 모두 소문자로 변환 : toLowerCase()
		System.out.println("----2-3 문자열 소문자로 변환----");
		temp = str2.toLowerCase();
		System.out.println(str2 + "를 소문자로 변환: " + temp);
		
		//2-4 문자열에 인덱스 얻기 : indexOf(), lastIndexOf()
		//indexOf를 사용하여 temp변수에 들어있는 메일주소가 유효한지 판단하는 코드작성
		//'@'과 '.'이 둘다 있어야 유효한 주소
		System.out.println("----2-4 문자열의 인덱스 얻기----");
		System.out.println(temp);
		if(temp.indexOf("@")!=-1 && temp.indexOf(".")!=-1) {
			System.out.println("정상적인 메일주소");
		}else {
			System.out.println("잘못된 메일주소");
		}
		
		//2-5 인덱스에 해당하는 문자 하나 얻기 : charAt(인덱스)
		System.out.println("----2-5 인덱스 해당문자 얻기----");
		String mail1="mail9577@naver.com";
		System.out.println(mail1.charAt(11));
		System.out.println(mail1+"에서 @에 해당하는 인덱스: "+mail1.indexOf("@"));
	
		//2-6 자식문자열 얻기
		System.out.println("----2-6 자식문자열 얻기----");
		temp="김밥을 맛있게 먹었습니다.";
		System.out.println(temp);
		//가장 마지막 문자 자리에 문자열의 끝기호가 들어간다 
		//끝 인덱스에 해당하는 문자가 잘려지지 않는다
		//substring(시작인덱스, 끝인덱스+1)
		System.out.println(temp.substring(4,7));
		
		//mail변수에서 메일주소를 잘라서 출력
		//메일주소    @도메인주소
		System.out.println("메일주소: " + mail1.substring(0, mail1.indexOf("@")));
		System.out.println("도메인주소: " + mail1.substring(mail1.indexOf("@")+1));
		
		//2-7 문자열 합치기 : concat(String str)
		System.out.println("----2-7 문자열합치기----");
		temp="오늘은";
		System.out.println(temp.concat(" 수요일입니다"));
		
		//2-8 앞뒤 공백 제거 : trim()
		System.out.println("----2-8 앞뒤 공백 제거----");
		temp=" 남 혜진 ";
		System.out.println("[" + temp + "]" + "[" + temp.trim() + "]");
		
		//2-9 완전히 같은지 비교 : equals("비교할문자열")
		System.out.println("----2-9 완전히 같은지 비교----");
		temp = "ABC";
		boolean flag = temp.equals("ABC");
		System.out.println(flag);
		
		//2-9-1. 문자열은 생성방법과 상관없이 동일한 비교를 하기위해 
		//equals method를 사용한다
		//문자열변수명.equals("비교할 문자열")
		System.out.println("----2-9-1 데이터형 별 문자열 비교----");
		
		System.out.println(str + "equals method 비교");
		if(str.equals("ABCD")) {
			System.out.println("같다");
		}
		else {
			System.out.println("다르다");
		}
		
		System.out.println(str1 + "equals method 비교");
		if(str1.equals("ABCD")) {
			System.out.println("같다");
		}
		else {
			System.out.println("다르다");
		}
		
		//2-10 입력한 문자열로 시작했는지 : startsWith("문자열")
		System.out.println("----2-10 입력한 문자열로 시작했는지----");
		temp="서울시 동작구";
		System.out.println(temp.startsWith("서울"));
		temp="서울시 동대문구";
		System.out.println(temp.startsWith("서울"));
		temp="인천시 북구";
		System.out.println(temp.startsWith("서울"));
		
	}//main
	
}//class

▼ String class의 method 예제 2-10 ~ 2- ▼

public class UseString {

	public static void main(String[] args) {
        String temp = "";
        boolean flag;
        
        //2-11 입력한 문자열로 끝났는지 : endsWith("문자열")
		System.out.println("----2-11 입력한 문자열로 끝났는지----");
		temp="서울시 동대문구 제기동";
		temp="서울시 성북구 안암동";
		System.out.println(temp.endsWith("동"));
		
		//2-12 문자열을 포함하고 있는지 : contains("문자열")
		System.out.println("----2-12 문자열을 포함하고 있는지----");
		temp="오늘은 목요일입니다";
		flag = temp.contains("요일");
		System.out.println(flag);
		
		//2-13 문자열이 비었는지 : isEmpty()
		System.out.println("----2-13 문자열이 비었는지----");
		temp = null; //객체가 heap의 주소를 할당받지 않았음. 객체가 생성되지 않음
		System.out.println(temp==null ? "문자열없음":"문자열있음");
		
		temp = ""; //객체가 heap의 주소를 할당받았음. 객체생성되었음. 문자열을 가지고 있지않음
		System.out.println(temp.isEmpty());
		
		//2-14 기본형데이터형을 String에 저장 : valueOf()
		System.out.println("----2-14 기본형데이터형을 String에 저장----");
		int year = 2020;
//		temp = year; //기본형 데이터형인 year변수를 참조형 데이터형인 String에 할당할 수 없다
		//기본형데이터형을 String형으로 변환해야함
//		temp = year + ""; //문자열에 +연산을 사용하여 문자열로 변환. 가능하지만 권장하지 않음
		temp = String.valueOf(year);
		System.out.println(year+"/"+temp);
		
		String fileName = "test.java.txt";
		//파일명과 확장자를 분리하여 출력
		System.out.println("파일명: " + fileName.substring(0, fileName.lastIndexOf(".")));
		System.out.println("확장자: " + fileName.substring(fileName.lastIndexOf(".")+1));
		
	}//main
	
}//class

▼ String class의 method 예제 콘솔창 ▼

더보기
String class의 method 예제 콘솔창

▼ String class의 method 복합예제▼

public class UseString {

	public static void main(String[] args) {
    
		//파일명과 확장자를 분리하여 출력
//		System.out.println("파일명: " + fileName.substring(0, fileName.lastIndexOf(".")));
//		System.out.println("확장자: " + fileName.substring(fileName.lastIndexOf(".")+1));
		//파일명에 '.'있는지 물어보고, 있다면
		//파일명과 확장자를 분리하여 출력하고, 없다면 파일명을 그대로 출력
		System.out.println("----파일명과 확장자를 분리하여 출력----");
		String fileName = "test.java.txt";
		String mailName = fileName.substring(0, fileName.lastIndexOf("."));
		if(mailName.contains(".")) {
			System.out.println("파일명: " + fileName.substring(0, fileName.lastIndexOf(".")));
			System.out.println("확장자: " + fileName.substring(fileName.lastIndexOf(".")+1));	
		}
		else {
			System.out.println("파일명: " + fileName.substring(0, fileName.indexOf(".")));
		}
		
		//여자 또는 남자인지를 출력
		//1,3,5,7,9 -남자 2,4,6,8,0 -여자
		System.out.println("----여자 또는 남자인지를 출력----");
		String temp = "880101-2234567";
		String backTemp = temp.substring(temp.lastIndexOf("-")+1);
		String gender = "여자";
		
//		int genderFlag = backTemp.charAt(0)%2; //char형 숫자가 나옴 1이면 49가 나옴
		int genderFlag = Integer.parseInt(temp.substring(7,8))%2; //parseInt를 사용해도 됨
		if(genderFlag == 0) {
			gender = "여자";
		}
		else {
			gender = "남자";
		}
		System.out.println(temp + " 는 " + gender);
		
	}//main
	
}//class

복합예제 콘솔창